Ich habe eine Liste von Personenobjekten. Ich möchte in ein Wörterbuch konvertieren, in dem der Schlüssel der Vor- und Nachname (verkettet) und der Wert das Objekt Person ist.
Das Problem ist, dass ich einige doppelte Personen habe. Wenn ich diesen Code verwende, geht dies in die Luft:
private Dictionary<string, Person> _people = new Dictionary<string, Person>();
_people = personList.ToDictionary(
e => e.FirstandLastName,
StringComparer.OrdinalIgnoreCase);
Ich weiß, dass es komisch klingt, aber ich kümmere mich momentan nicht wirklich um doppelte Namen. Wenn es mehrere Namen gibt, möchte ich nur einen greifen. Kann ich diesen Code trotzdem oben schreiben, damit er nur einen der Namen annimmt und nicht auf Duplikate explodiert?
c#
linq
dictionary
Leora
quelle
quelle
Dictionary<string, List<Person>>
(oder ein gleichwertiges) erforderlich .Distinct
Antworten:
Hier ist die offensichtliche, nicht linq Lösung:
quelle
LINQ-Lösung:
Wenn Sie eine Nicht-LINQ-Lösung bevorzugen, können Sie Folgendes tun:
quelle
Eine Linq-Lösung mit Distinct () und ohne Gruppierung ist:
Ich weiß nicht, ob es schöner ist als die Lösung von LukeH, aber es funktioniert auch.
quelle
Dies sollte mit dem Lambda-Ausdruck funktionieren:
quelle
personList.Distinct().ToDictionary(i => i.FirstandLastName, i => i);
Sie können auch die
ToLookup
LINQ-Funktion verwenden, die Sie dann fast austauschbar mit einem Wörterbuch verwenden können.Dies wird im Wesentlichen das GroupBy in der Antwort von LukeH ausführen , aber das Hashing geben, das ein Wörterbuch bereitstellt. Sie müssen es also wahrscheinlich nicht in ein Wörterbuch konvertieren, sondern verwenden einfach die LINQ-
First
Funktion, wenn Sie auf den Wert für den Schlüssel zugreifen müssen.quelle
Sie können eine Erweiterungsmethode ähnlich wie ToDictionary () erstellen, mit dem Unterschied, dass Duplikate zulässig sind. Etwas wie:
In diesem Fall gewinnt der letzte Wert, wenn Duplikate vorhanden sind.
quelle
Um Duplikate zu entfernen, implementieren Sie eine
IEqualityComparer<Person>
, die in derDistinct()
Methode verwendet werden kann, und dann ist es einfach, Ihr Wörterbuch zu erhalten. Gegeben:Holen Sie sich Ihr Wörterbuch:
quelle
quelle
Falls wir alle Personen (anstelle von nur einer Person) im zurückkehrenden Wörterbuch haben möchten, könnten wir:
quelle
Das Problem mit den meisten anderen Antworten ist , dass sie verwenden
Distinct
,GroupBy
oderToLookup
, was ein zusätzliches Wörterbuch unter der Haube schafft. Ebenso erstellt ToUpper eine zusätzliche Zeichenfolge. Dies ist, was ich getan habe, was bis auf eine Änderung eine fast exakte Kopie des Microsoft-Codes ist:Da ein Satz auf dem Indexer bewirkt, dass er den Schlüssel hinzufügt, wird er nicht geworfen und führt auch nur eine Schlüsselsuche durch. Sie können es
IEqualityComparer
zum Beispiel auch gebenStringComparer.OrdinalIgnoreCase
quelle
Ausgehend von Carras Lösung können Sie sie auch wie folgt schreiben:
quelle