LINQ-Abfrage zur Rückgabe eines Dictionary <string, string>

218

Ich habe eine Sammlung von MyClass, die ich mit LINQ abfragen möchte, um eindeutige Werte zu erhalten, und als Ergebnis ein Dictionary <string, string> zurückerhalte, aber ich kann nicht herausfinden, wie ich es einfacher machen kann als ich mache unten. Was wäre ein sauberer Code, mit dem ich das Wörterbuch <string, string> als Ergebnis erhalten kann?

var desiredResults = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);

var queryResults = (from MyClass mc in myClassCollection
                    orderby bp.SomePropToSortOn
                    select new KeyValuePair<string, string>(mc.KeyProp, mc.ValueProp)).Distinct();

foreach (var item in queryResults)
{
    desiredResults.Add(item.Key.ToString(), item.Value.ToString());
}
Scott Ivey
quelle
6
Was soll es mit doppelten Schlüsseln machen? Nehmen Sie einfach die erste und ignorieren Sie die nachfolgenden? Beachten Sie, dass Wörterbücher nicht bestellt werden, sodass Ihre Bestellung in der Abfrage keine Auswirkungen hat ...
Jon Skeet
1
Vielleicht suchen Sie nach der SortedDictionary-Implementierung von IDictionary. Ansonsten ist das Sortieren über ein Wörterbuch sinnlos.
Fede

Antworten:

366

Verwenden Sie die ToDictionaryMethode direkt.

var result = 
  // as Jon Skeet pointed out, OrderBy is useless here, I just leave it 
  // show how to use OrderBy in a LINQ query
  myClassCollection.OrderBy(mc => mc.SomePropToSortOn)
                   .ToDictionary(mc => mc.KeyProp.ToString(), 
                                 mc => mc.ValueProp.ToString(), 
                                 StringComparer.OrdinalIgnoreCase);
Mehrdad Afshari
quelle
1
Mehrdad, danke für den Hinweis darauf. Dies war die Richtung, in die ich ging, aber ich musste die korrekte Überlastung von ToDictionary übersehen haben.
Scott Ivey
18

Schauen Sie sich die ToLookupund / oder ToDictionaryErweiterungsmethoden an.

Leppie
quelle