Frage

Ich habe eine große Liste von Werten (100-200 Zeichenkette) und ich brauche eine eigene Liste von ihnen zurückzukehren. Was ist der effizienteste Weg, dies mit .NET zu tun? Die 2 Möglichkeiten, dass ich denken kann, sind:

  1. Verwenden Sie die Distinct () -Methode der IEnumerable-Klasse
  2. Verwenden Sie ein Wörterbuch

Wenn das Wörterbuch Ansatz schneller in rohen Begriffe ist, sollten Sie einen Trade-off Entscheidung um die Wartbarkeit des Codes.

War es hilfreich?

Lösung

Ich würde erwarten, Enumerable.Distinct etwa so schnell zu sein, wie ein Wörterbuch verwenden, wenn Sie es nur einmal tun. Wenn Sie hinzufügen / entfernen Werte in der Lage sein wollen, und halten Sie die distinct-ness, könnten Sie eine HashSet<string> bauen (was im Grunde ist das, was ich Distinct erwarten ist unter der Haube zu tun, aber Distinct() wird natürlich neue Werte zurück, wie er sie findet, die Aufrechterhaltung bestellen.

In der Tat, nur mit:

HashSet<string> distinctItems = new HashSet<string>(list);

wird eine ziemlich gute (und einfach) Lösung sein, wenn Sie die Bestellung nichts dagegen vermasselt wird. Es ist einfacher als ein Dictionary verwenden und konzeptionell als auch Reinigungsmittel (wie Sie dies nicht tun wirklich will Schlüssel auf Werte abbilden).

(Wie immer würde ich vorschlagen, die am besten lesen Lösung zu finden, zuerst, und Benchmark es -. Wenn es „schnell genug“, dann mit dem gehen, wenn Sie dies als Teil einer anderen Abfrage verwenden mögen, dann Distinct gut kann das lesbarsten Art und Weise. Ansonsten würde ich HashSet vorschlagen.)

Andere Tipps

Ich persönlich würde mit dem Distinct () -Methode von LINQ bereitgestellt gehen. Es ist viel einfacher zu lesen und zu pflegen. Während LINQ verwendet wird langsamer sein als ein Wörterbuch mit der Differenz kleiner wird (im Falle du hast aufgeführt), und Sie würden besser verbringen Zeit Datenbankabfragen oder Web-Service-Anrufe zu optimieren.

Ich möchte Sie siggest hier Profilierung zu nutzen. Erstellen Sie eine Liste mit Beispielartikeln, sortieren sagen, es 1M mal in beiden Richtungen verwendet wird, und misst die Zeit von jeder Art und Weise verwendet wird.

Wenn die Lesbarkeit ein Anliegen ist, erstellen Sie eine GetDistinctItems Methode und setzen Sie den Code in ihm. Voilà, selbst dokumentiert Code

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top