2009-03-09 10 views
190

Mam kolekcję MyClass, której chciałbym użyć przy użyciu LINQ, aby uzyskać różne wartości, i uzyskać ciąg Słownik> Ciągnik> w wyniku, ale ja nie mogę wymyślić, jak mogę to zrobić prostsze niż robię poniżej. Jaki byłby nieco czystszy kod, który można użyć, aby uzyskać ciąg Dictionary> Ciągnik> jako mój wynik?Zapytanie LINQ o zwrócenie słownika <ciąg, ciąg>

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()); 
} 
+5

Co chcesz zrobić ze zduplikowanymi kluczami? Po prostu weź pierwsze i zignoruj ​​kolejne? Należy pamiętać, że słowniki nie są zamawiane, więc twoje zamówienie w zapytaniu nie będzie miało żadnego skutku ... –

+1

Może to, czego szukasz, to implementacja IDential z SortedDictionary. W przeciwnym razie sortowanie w słowniku nie ma sensu. – Fede

Odpowiedz

318

Skorzystaj bezpośrednio z metody ToDictionary.

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

Mehrdad, dzięki za wskazówkę w tej sprawie. To był kierunek, w którym się wybierałem, ale musiało to wynikać z właściwego przeciążenia ToDictionary. –

15

Spójrz na ToLookup i/lub ToDictionary metod rozszerzenie.