假设我有一个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更有效?
谢谢!
答案 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属性的序列,因此使用键类型和轨道名称成员创建组。最后,我们将每个组投影到一个具有Genre
和Tracks
两个属性的对象。