LINQ:将多个属性的对象列表分组到列表列表中的更好方法是什么?

时间:2012-10-28 03:04:30

标签: c# linq list

我有一个对象列表:

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();

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

1 个答案:

答案 0 :(得分:7)

只是做:

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

IEnumerable上的GroupBy返回IEnumerable<IGrouping<TKey, T>>IGrouping<TKey, T>实现IEnumerable<T>,因此您可以直接将该组用作序列。