【问题标题】:LINQ: A better way to grouping a list of objects by multiple properties in to a list of lists?LINQ:通过多个属性将对象列表分组到列表列表中的更好方法?
【发布时间】:2012-10-28 11:59:12
【问题描述】:

我有一个这样的对象列表:

var cmps = new List<Campaign>()
{
    new Campaign(){ PersonId = 1, Id = 1, Name = "Name"},
    new Campaign(){ PersonId = 2, Id = 1, Name = "Name"},
    new Campaign(){ PersonId = 3, Id = 1, Name = "Name1"},                
    new Campaign(){ PersonId = 4, Id = 2, Name = "Name1"},                
    new Campaign(){ PersonId = 5, Id = 2, Name = "Name1"},
    new Campaign(){ PersonId = 6, Id = 3, Name = "Name"},
};

我想按多个属性将它们分组到一个列表列表中,在此示例中为 IdName

这会将原始列表拆分为以下列表(其中数字代表PersonId):

{[1, 2], [3], [4, 5], [6]}

我已经通过编写以下代码解决了这个问题:

List<List<Campaign>> groups = cmps.GroupBy(c => new { c.Id, c.Name })
                                  .Select(c => c.Key)
                                  .ToList()
                                  .Select(v => cmps.Where(c => c.Id == v.Id && c.Name == v.Name).ToList())
                                  .ToList();

这个解决方案似乎工作正常,但出于好奇,有没有更好/更好的方法来做到这一点?

【问题讨论】:

    标签: c# linq list


    【解决方案1】:

    只要做:

    List<List<Campaign>> groups = cmps.GroupBy(c => new { c.Id, c.Name })
        .Select(group => group.ToList())
        .ToList();
    

    IEnumerable 上的 GroupBy 返回 IEnumerable&lt;IGrouping&lt;TKey, T&gt;&gt;IGrouping&lt;TKey, T&gt; 实现了IEnumerable&lt;T&gt;,因此您可以直接将组用作序列。

    【讨论】:

      猜你喜欢
      • 2011-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-28
      • 1970-01-01
      相关资源
      最近更新 更多