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>

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());

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);

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.