按数组/集合<t>对元素进行分组

时间:2017-05-06 14:09:54

标签: c# arrays linq collections grouping

假设我有一个Track类,其string[] Genres属性。

如果需要,我如何有效地将Track个元素分组到一个类型中,其中一个条目是多个组的一部分?例如,对于以下集合:

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

结果应该是:

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

使用LINQ有没有简单的方法呢?或者是否比使用LINQ更有效?

谢谢!

1 个答案:

答案 0 :(得分: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方法将我们的集合展平为一系列具有两个属性的匿名对象:Track - 轨道的名称和类型 - 其中一个类型,此轨道可以归类为。所以新的序列将由像(“A”,“Rock”),(“B”,“Rock”),(“B”,“Pop”)等对组成。然后我们GroupBy这个基于Genre属性的序列,因此使用键类型和轨道名称成员创建组。最后,我们将每个组投影到一个具有GenreTracks两个属性的对象。