2

私はそのようなオブジェクトのリストを持っています:

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"},
};

Id複数のプロパティ (この例ではと) によってリストのリストにグループ化したいと考えていますName

これにより、元のリストが次のように分割されます (数字は を表し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();

このソリューションはうまく機能しているようですが、好奇心から、これを行うためのより良い/より良い方法はありますか?

4

1 に答える 1

9

ただ行う:

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>しているため、グループをシーケンスとして直接使用できます。

于 2012-10-28T03:07:37.303 に答える