Tupel vs. string als Dictionary-Schlüssel in C#

Ich habe einen cache, den ich implementieren, die mit einem Z. B. concurrentdictionary,
Die Daten, die ich halten muss, hängt davon ab 5 Parameter.
So ist die Methode, um bekommen es aus dem cache ist: (ich zeige nur 3 Parameter hier für die Einfachheit, und ich änderte den Datentyp darstellen CarData für Klarheit)

public CarData GetCarData(string carModel, string engineType, int year);

Ich Frage mich, welche Art von Schlüssel wird nicht besser mit meiner Z. B. concurrentdictionary, kann ich es so machen:

var carCache = new ConcurrentDictionary<string, CarData>();
//check for car key
bool exists = carCache.ContainsKey(string.Format("{0}_{1}_{2}", carModel, engineType, year);

Oder so:

var carCache = new ConcurrentDictionary<Tuple<string, string, int>, CarData>();
//check for car key
bool exists = carCache.ContainsKey(new Tuple(carModel, engineType, year));

Ich glaube nicht, verwenden Sie diese Parameter, zusammen an jedem anderen Ort, so dass es keine Rechtfertigung gibt, eine Klasse zu erstellen, nur um Sie zusammen zu halten.

Möchte ich wissen, welcher Ansatz ist besser in punkto Leistung und Wartungsfreundlichkeit.

  • Wenn du redest, Wartbarkeit und Lesbarkeit, ich würde sagen, Sie würde immer noch eine Klasse für die Parameter/Schlüssel mit einem benutzerdefinierten comparer. Wenn Sie eine Klasse verwenden, müssen Sie nur Bearbeiten, sagte der Klasse, und Sie müssen nicht um die Bearbeitung von zwei oder mehr stellen in Ihrem code. Das ist alles meine Meinung, obwohl. Wenn ich hätte wählen müssen zwischen zwei Optionen, würde ich gehen für das Tupel als Schlüssel. Es ist schlimmer, performance-wise, aber es ist einfacher zu verstehen/zu pflegen.
  • Ich bevorzuge Leistung mehr Verständnis, wenn der cahce wird halten Hunderte von Schlüsseln und die bekommen Sie, langsam, niemand kümmert sich um code, der besser aussieht...
  • Meine Firma immer die Folgendes besagt: "Sie schreiben Ihren code einmal, aber Ihr code wird gelesen, tausend mal." Es ist alles bis zu Ihnen, obwohl, ich finde einfach, dass die Lesbarkeit ist wichtig für den code, den ich Schreibe 🙂
  • Nur als RandomStranger, ich würde es vorziehen, eine Klasse für Wartbarkeit, sondern auch für die Leistung. Innerhalb Ihrer eigenen Klasse, könnte man überschreiben GetHashCode basiert auf der einzigartigen Wert und Kurzschluss der Equals basiert auf dem Vergleich der einzigartigsten Werte ersten. GetHashCode sollte so einfach wie möglich, während noch der Rückkehr einen Wert, der so einzigartig ist wie werden kann für eine optimale Wörterbuch-Leistung
  • Ich finde es seltsam, dass Sie benötigen würde, 5 verschiedene Schlüssel für das gleiche Wörterbuch.
  • Wenn Sie die Verwendung von string-Verkettung, dann werden Sie brauchen, um sehr sicher, dass Sie nicht doppelte Schlüssel. Wenn einer Ihrer strings enthalten _, dann können Sie sofort zweideutig. Es kann natürlich sein, dass dies nicht geschehen kann mit dem format der Schlüssel, aber es ist etwas bewusst zu sein und deshalb würde ich eher geneigt sein, in Richtung Tupel als strings.
  • Ich habe in ähnlichen Situationen, wo der code ist im Grunde caching-eine teure Methode aufrufen, die in einem Wörterbuch. Die Wörterbuch-Taste muss auch gemacht werden, bis alle Parameter für die Methode.
  • Mein Moto ist: "Immer code, als ob der Kerl, der landet pflegen Sie Ihren code ein gewalttätiger psychopath, der weiß, wo Sie Leben." 🙂
  • ein sehr gutes Beispiel.
  • Danke für die Idee für das UnitTest, die strings enthalten nicht '_', das ist, warum ich wählte es in der string-Taste
  • Die Saiten dürfen nicht enthalten _ jetzt, aber können Sie sagen, für bestimmte, dass Sie nie in der Zukunft? Mit einem Tupel oder eine benutzerdefinierte Klasse, die verhindert, dass diese brechen in der Zukunft, wenn die möglichen Inhalte des keys ändert.
  • "Ich glaube nicht, verwenden Sie diese Parameter, zusammen an jedem anderen Ort, so dass es keine Rechtfertigung gibt, eine Klasse zu erstellen" - Was für ein schreckliches Missverständnis. Ich hoffe, dass ist nicht üblich.
  • Die Parameter, die an diese Methode sind Teil der verschiedenen Klassen, die es in den code. Diese Methode ist der einzige Ort, dass ich Sie zusammen. Ich denke, dass werde ich gerne die Klassen dieser code anders zu beheben dieser Störung. Können Sie mir sagen, Ihre Vorstellung, wenn Sie denken, ich bin so falsch... Danke für die Ehrlichkeit
  • Ich nahm jede Ratschläge und verwendet Tim die Implementierung über eine Klasse. Der code ist jetzt übersichtlicher und ich bin zufrieden mit dem Ergebnis

InformationsquelleAutor Shahar | 2017-01-30
Schreibe einen Kommentar