Ist es in Ordnung Wörterbücher zu verwenden, wenn ich nicht schnell auf ihre Werte zugreifen muss?

7

Normalerweise verwende ich ein Wörterbuch wie eine Liste, aber mit einem Schlüssel eines anderen Typs. Ich mag die Möglichkeit, schnell auf einzelne Elemente im Wörterbuch zuzugreifen, ohne sie durchlaufen zu müssen, bis ich das Element mit der richtigen Eigenschaft gefunden habe (weil die gesuchte Eigenschaft im Schlüssel liegt).

Aber es gibt noch eine andere mögliche Verwendung eines Wörterbuchs. Ich könnte einfach den Schlüssel verwenden, um Eigenschaft A und den Wert zu speichern, um Eigenschaft B zu speichern, ohne jemals die spezielle Funktionalität des Wörterbuchs zu verwenden. Zum Beispiel könnte ich eine Liste von Personen speichern, indem ich den Vornamen im Schlüssel und den Familiennamen im Wert hinterlege (nehmen wir der Einfachheit halber an, dass es nie zwei Personen mit demselben Vornamen geben wird, denn Ich konnte einfach kein besseres Beispiel finden). Ich würde dieses Wörterbuch nur benutzen, um es in einer foreach-Schleife zu durchlaufen und Elemente hinzuzufügen (kein Entfernen, Sortieren oder Zugreifen auf einzelne Elemente). Es würde eigentlich keinen Unterschied geben, ein List<KeyValuePair<string, string>> von einem Dictionary<string, string> zu verwenden (zumindest nicht in dem Beispiel, das ich gab - ich weiß, dass ich zB mehrere Elemente mit demselben Schlüssel in der Liste speichern könnte).

Also, um es zusammenzufassen, was soll ich tun, wenn ich nicht die speziellen Funktionen eines Wörterbuchs verwenden muss und es einfach dazu verwenden soll, etwas zu speichern, das genau zwei Eigenschaften hat:

  • benutze Dictionary<,>
  • benutze List<KeyValuePair<,>
  • Verwenden Sie List<MyType> mit MyType als benutzerdefinierte Klasse, die die beiden Eigenschaften und einen Konstruktor enthält.
jalgames 20.07.2014, 13:47
quelle

3 Antworten

19

Verwenden Sie keine Wörterbücher dafür.

Wenn Sie keine Klasse für diesen Zweck erstellen möchten, verwenden Sie etwas wie List<Tuple<T1,T2>> . Bedenken Sie jedoch, dass eine benutzerdefinierte Klasse sowohl lesbarer als auch flexibler ist.

Hier ist der Grund: Es wird viel einfacher sein, Ihren Code zu lesen, wenn Sie geeignete Datenstrukturen verwenden. Die Verwendung eines Wörterbuchs wird den Leser nur verwirren, und Sie werden Probleme an dem Tag haben, an dem ein doppelter Schlüssel erscheint.

Wenn jemand Ihren Code liest und sieht, dass ein Dictionary verwendet wird, geht er davon aus, dass Sie wirklich eine kartenähnliche Struktur verwenden möchten. Ihr Code sollte klar sein und Ihre Absicht sollte offensichtlich sein, wenn Sie sie lesen.

    
Lucas Trzesniewski 20.07.2014, 13:56
quelle
6

Wenn Sie mit der Leistung betroffen sind, sollten Sie die Daten wahrscheinlich in List speichern. A Dictionary hat viel internen Overhead. Sowohl Speicher als auch CPU.

Wenn Sie sich nur für Lesbarkeit interessieren, wählen Sie die Datenstruktur aus, die Ihre Absicht am besten erfasst. Wenn Sie Schlüssel / Wert-Paare speichern (z. B. benutzerdefinierte Felder in einem Bugtracker-Problem), verwenden Sie Dictionary . Wenn Sie nur Objekte speichern, ohne dass sie einen logischen Schlüssel haben, verwenden Sie List .

Es braucht wenig Arbeit, um eine benutzerdefinierte Klasse zu erstellen, die als Element in einem List verwendet werden kann. Wenn Sie Dictionary verwenden, nur weil Sie für jedes Element eine Key -Eigenschaft angeben, handelt es sich um einen Missbrauch dieser Datenstruktur. Es ist einfach, eine benutzerdefinierte Klasse zu erstellen, die auch eine Key -Eigenschaft besitzt.

    
usr 20.07.2014 13:56
quelle
2

Verwenden Sie List<MyType> , wobei MyType alle Werte enthält.

Das Problem mit dem Wörterbuchansatz ist, dass es nicht flexibel ist. Wenn Sie später beschließen, zweite Namen hinzuzufügen, müssen Sie Ihre gesamte Datenstruktur neu gestalten, anstatt nur ein weiteres Feld zu MyType hinzuzufügen.

    
Ypnypn 20.07.2014 16:52
quelle

Tags und Links