2017-05-06 50 views
0

比方說,我有一個Track類,它具有string[] Genres屬性。按陣列排列的組元素/集合<T>

如何有效地將Track元素分組爲流派,如果需要,一個條目是多個組的一部分?例如,對於下面的集合:

A - Rock 
B - Pop, Rock 
C - Rock, Soundtrack 
D - Pop, Soundtrack 

結果這應該是:

Rock - A, B, C 
Pop - B, D 
Soundtrack - C, D 

有沒有簡單的方法來做到這一點使用LINQ?還是有比使用LINQ更有效的方法?

謝謝!

回答

3

你可以嘗試這樣的事:

var genresTracks = tracks.SelectMany(track => track.Genres, (track, genre) => new 
         { 
          // you might want to correct the Name property 
          // with the correct one. 
          Track = track.Name, 
          Genre = genre 
         }) 
         .GroupBy(tg => tg.Genre) 
         .Select(gr => new 
         { 
          Genre = gr.Key, 
          Tracks = gr.Select(x=>x.Track) 
         }); 

foreach(var genreTracks in genresTracks) 
{ 
    var tracksCsv = string.Join(",", genreTracks.Tracks); 
    Console.WriteLine($"{genreTracks.Genre} - {tracksCsv}"); 
} 

最初我們使用SelectMany方法拉平我們的集合,匿名對象序列具有兩個屬性,軌道 - 軌道的名稱和類型 - 流派之一,其中該曲目可以分類到。所以新的序列將由pe(如「A」,「Rock」),(「B」,「Rock」),(「B」,「Pop」)等等組成。然後我們基於流派屬性,所以創建的組用關鍵字流派和成員的曲目名稱。最後,我們將每個組投影到具有兩個屬性GenreTracks的對象中。

+0

一個有趣的方法。謝謝! – Reynevan

+0

我對代碼做了一些更改以更好地適應XAML綁定。首先,我刪除了最後一個'.Select()'查詢。我也將'.GroupBy()'查詢改爲'.GroupBy(tg => tg.Genre,tg => tg.Track);'。通過這種方式,我得到了'IEnumerable >'作爲整個LINQ查詢的結果。 – Reynevan

+0

@Reynevan聽起來不錯!不用謝 ! – Christos