【问题标题】:Group elements by an array/Collection<T>按数组/集合<T> 对元素进行分组
【发布时间】:2017-10-04 21:48:11
【问题描述】:

假设我有一个具有string[] Genres 属性的Track 类。

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

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

结果应该是:

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

有没有使用 LINQ 的简单方法?或者有没有比一起使用 LINQ 更有效的方法?

谢谢!

【问题讨论】:

    标签: c# arrays linq collections grouping


    【解决方案1】:

    你可以试试这样的:

    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 - 曲目的名称和 Genre - 可以分类此曲目的流派之一。所以新的序列将由 ("A","Rock")、("B","Rock")、("B","Pop") 等对组成。然后我们GroupBy 这个序列基于在 Genre 属性上,因此使用 Genre 和 Members 曲目名称创建组。最后,我们将每个组投影到一个具有两个属性 GenreTracks 的对象中。

    【讨论】:

    • 一个有趣的方法。谢谢!
    • 我对您的代码进行了一些更改,以更好地适应 XAML 绑定。首先,我删除了最后一个.Select() 查询。我还将.GroupBy() 查询更改为.GroupBy(tg =&gt; tg.Genre, tg =&gt; tg.Track);。通过这种方式,我得到 IEnumerable&lt;IGrouping&lt;string, LibraryEntry&gt;&gt; 作为整个 LINQ 查询的结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-06
    • 2020-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-30
    相关资源
    最近更新 更多