2013-08-16 56 views
0

我有一个列表。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查询。

+0

@FrankPl,没有什么可以编译的......我的大脑已经在周末开始了。很明显,OrderBy很简单的失败。将结果分组为不是'Foo'的对象,并且发布了十几个明显不符合要求的代码示例是我们所有时间的浪费。 – CaffGeek

回答

2

这一个:根据要求

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 byPersonId然后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到对象的排序,我不能保证它在EF相同或LINQ到SQL)。

+0

但是,这是返回一个组,我需要仍然有一个Foo列表。 – CaffGeek

+0

@CaffGeek然后下一次你不会写“我需要对列表进行排序,以便他们按PersonId分组” – xanatos

+0

@CaffGeek在**任何一个之前添加一个'.SelectMany(p => p)** '.ToArray()'。 – xanatos