2009-09-27 10 views
8

Mam dwie zmienne typu ILookup. Chciałem użyć Union lub Concat, aby połączyć ich wartości i przypisać wynik do trzeciej zmiennej tego samego typu. Zarówno Union, jak i Concat zwracają IGrouping. Konieczne jest proste przekształcenie IGrouping w ILookup, ale po prostu nie mogę tego zrobić !!! :-(IGrouping odsłania tylko klucz, więc walczę z drugim parametrem Lookup ... Każda pomoc będzie bardzo, bardzo doceniana.Konwersja LINQ z IGrouping na Lookup

Odpowiedz

9

Myślę, że najpierw trzeba spłaszczyć sekwencje, aby użyć ToLookup:

var lookup = first.Concat(second) 
        .SelectMany(group => group, 
           (group, item) => new { Key = group.Key, 
                Item = item }) 
        .ToLookup(x => x.Key, x => x.Item); 

który wykorzystuje formę SelectMany który bierze dwóch delegatów: jeden do przeliczenia pozycji w oryginalnej sekwencji do kolekcji, a co innego brać element w oryginalnej kolekcji (czyli grupy) oraz element w zwróconej kolekcji (tzn. elementy pasujące do klucza tej grupy), aby dostać się do pozycji wynikowej. Jest to najprostszy sposób (jak sądzę!) spłaszczenia grupy w sekwencję elementów z ich kluczami .

Powyższe nie zostało przetestowane, więc może być całkowicie błędne. Jest to również stosunkowo nieefektywne ... szkoda, że ​​nie można bezpośrednio zbudować instancji o wartości Lookup. Oczywiście możesz sam wdrożyć ILookup.