2013-08-16 55 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