2009-03-06 10 views
138

Użyłem słowa kluczowego "select" i metody rozszerzającej, aby zwrócić IEnumerable<T> z LINQ, ale mam potrzebę zwrócenia generycznego Dictionary<T1, T2> i nie mogę tego rozgryźć. Przykład, którego się nauczyłem, użył czegoś w formie podobnej do poniższej:Wybierz Słownik <T1, T2> z LINQ

IEnumerable<T> coll = from x in y 
    select new SomeClass{ prop1 = value1, prop2 = value2 }; 

Zrobiłem to samo z metodami rozszerzenia. Zakładam, że ponieważ elementy w Dictionary<T1, T2> mogą być iterowane jako KeyValuePair<T1, T2>, że mogę po prostu zastąpić "SomeClass" w powyższym przykładzie przez "new KeyValuePair<T1, T2> { ...", ale to nie zadziałało (Key i Value zostały oznaczone jako readonly, więc nie mogłem skompiluj ten kod).

Czy to możliwe, czy trzeba to zrobić w wielu krokach?

Dzięki.

Odpowiedz

221

Metody rozszerzeń zapewniają również rozszerzenie ToDictionary. Jest dość prosty w użyciu, ogólne użycie przekazuje selektor lambda dla klucza i pobiera obiekt jako wartość, ale można przekazać selektor lambda dla klucza i wartości.

class SomeObject 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
} 

SomeObject[] objects = new SomeObject[] 
{ 
    new SomeObject { ID = 1, Name = "Hello" }, 
    new SomeObject { ID = 2, Name = "World" } 
}; 

Dictionary<int, string> objectDictionary = objects.ToDictionary(o => o.ID, o => o.Name); 

Następnie objectDictionary[1] będzie zawierać wartość "Hello"

+3

+1 Whuh. Otwiera to nowe możliwości w sposobie tworzenia nowych obiektów danych. – Sung

+1

Niesamowite, cieszę się, że skorzystasz z tego, wiem, że pomogło mi to w niektórych sytuacjach. –

+2

Egady! Jest rok 2017 i dopiero się o tym dowiedziałem !! –

34
var dictionary = (from x in y 
        select new SomeClass 
        { 
         prop1 = value1, 
         prop2 = value2 
        } 
       ).ToDictionary(item => item.prop1); 

to zakładając, że SomeClass.prop1 jest pożądana Key do słownika.

+21

'.ToDictionary (item => item.prop1, item => item.prop2);' do explicity też ustawia wartość. – finoutlook

11

Zbiór KeyValuePair jest jeszcze bardziej wyraźny i działa bardzo dobrze.

Dictionary<int, string> dictionary = objects 
    .Select(x=> new KeyValuePair<int, string>(x.Id, x.Name)) 
    .ToDictionary(x=>x.Key, x=>x.Value);