0

私はリストを持っています。

Foo には、CaseId と PersonId の 2 つのプロパティがあります。

リストを並べ替えて、PersonId でグループ化する必要がありますが、CaseId が最も小さい人が最初になります。

だから、このデータを考えると

P1 C19
P2 C23
P2 C24
P1 C28
P3 C07
P2 C32
P3 C60
P1 C20

次のようにソートされます

P3 C07
P3 C60
P1 C19
P1 C20
P1 C28
P2 C23
P2 C24
P2 C32

これを LINQ クエリとして記述する方法がわかりません。

4

1 に答える 1

3

これです:

var persons = new[] {
    new Foo { PersonId = "P1", CaseId = "C19" },
    new Foo { PersonId = "P2", CaseId = "C23" },
    new Foo { PersonId = "P2", CaseId = "C24" },
    new Foo { PersonId = "P1", CaseId = "C28" },
    new Foo { PersonId = "P3", CaseId = "C07" },
    new Foo { PersonId = "P2", CaseId = "C32" },
    new Foo { PersonId = "P3", CaseId = "C60" },
    new Foo { PersonId = "P1", CaseId = "C20" },
};

var res = (from p in persons
           group p by p.PersonId into q
           orderby q.Min(r => r.CaseId)
           select q).ToArray();

要求通りにします。

あなたgroup by PersonIdと各グループのorderbyMin(r => r.CaseId)

しかし、おそらく関数表記法ではより明確です。

var res2 = persons.GroupBy(p => p.PersonId)
                  .OrderBy(p => p.Min(q => q.CaseId))
                  .ToArray();

書かれているように、グループは順序付けられており、グループの「内部」の要素ではありません。

グループ内の要素もソートしたい場合:

var res3 = (from p in persons
            orderby p.CaseId
            group p by p.PersonId into q
            orderby q.Min(r => r.CaseId)
            select q).ToArray();

グループ化により要素の順序が保持されるためです (少なくとも LINQ to Objects では。EF または LINQ-to-SQL で同じであることは保証できません)。

于 2013-08-16T20:29:50.773 に答える