LINQ - Liste in Wörterbuch mit Wert als Liste konvertieren

99

Ich habe ein

List<MyObject> 

dass ich aus der Datenbank abrufe. Ich möchte jedoch, dass es zu Gruppierungszwecken von einer Eigenschaft in MyObject verschlüsselt wird. Was ist der beste Weg mit LINQ, um meine Liste zu erstellen:

Dictionary<long, List<MyObject>>

Ich habe folgendes:

myObjectList.ToDictionary(x => x.KeyedProperty)

Aber es kehrt zurück:

Dictionary<long, MyObject>
Brandon
quelle
Sie möchten, dass das Wörterbuch mit einer Eigenschaft von WELCHEM MyObject verknüpft ist? - Sie haben eine ganze Liste von ihnen ....
James Curran

Antworten:

191

Es hört sich so an, als ob Sie die MyObjectInstanzen nach gruppieren KeyedPropertyund diese Gruppierung in eine setzen möchten Dictionary<long,List<MyObject>>. Wenn ja, versuchen Sie Folgendes

List<MyObject> list = ...;
var map = list
  .GroupBy(x => x.KeyedProperty)
  .ToDictionary(x => x.Key, x => x.ToList());
JaredPar
quelle
16

Sie sollten die ToLookupErweiterungsmethode für die EnumerableKlasse wie folgt verwenden:

List<MyObject> list = ...;

ILookup<long, MyObject> lookup = list.ToLookup(o => o.KeyedProperty);

Wenn Sie das in ein Wörterbuch einfügen möchten, können Sie die ToDictionaryErweiterungsmethode wie folgt verwenden:

IDictionary<long, IEnumerable<MyObject>> dictionary = lookup.ToDictionary(
    l => l.Key);
casperOne
quelle
Was ist der Unterschied zwischen dieser und der akzeptierten Antwort? Ist die ILookupReferenzen erhalten , während die akzeptierte Antwort nicht?
PatPeter
@PatPeter Die Idee ist, dass a Lookup<TKey, TValue>eine bessere Struktur als a sein kann , wenn Sie eine Eins-zu-Viele-Beziehung zwischen dem Schlüssel und den Elementen haben Dictionary<TKey, TValue>.
CasperOne
1
@PatPeter Ich würde sagen, dass ILookup die bessere Struktur ist (es ist wie eine Multimap für die Karte von Dictonary, wenn Sie C ++ - Erfassungsalgorithmen kennen), aber es muss ein wichtiger Faktor berücksichtigt werden: Die erstellte Suche ist unveränderlich. Sie können danach keine Einträge mehr hinzufügen oder entfernen.
Gbjbaanb
Die andere Überlegung ist, dass obwohl dies ILookupoft die ideale In-Code-Struktur ist, sie für die Serialisierung oft nicht gut gehandhabt wird.
Jeff B