2017-05-06 46 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