Linq按最小值排序/分组

时间:2013-08-16 20:20:37

标签: linq

我有一个清单。

Foo有两个属性,CaseId和PersonId。

我需要对列表进行排序,以便按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查询。

1 个答案:

答案 0 :(得分: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然后orderby每个组的Min(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中是相同的。)

相关问题