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
8
A
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
.