2014-07-07 93 views
2

分組組的結果,我有以下爲例:的Linq通過查詢

Model mod1 = new Model { Header = "A", canDelete = true,pax=1 }; 
Model mod2 = new Model { Header = "B", canDelete = true,pax=1 }; 
Model mod3 = new Model { Header = "A", canDelete = true,pax=2 }; 
Model mod4 = new Model { Header = "B", canDelete = false,pax=2 }; 
Model mod5 = new Model { Header = "A", canDelete = true,pax=3 }; 
Model mod6 = new Model { Header = "B", canDelete = false,pax=3 }; 
Model mod7 = new Model { Header = "A", canDelete = false,pax=4 }; 
Model mod8 = new Model { Header = "B", canDelete = true,pax=4 }; 

我添加了這些車型的listMod

我想小組第一的PAX數,所以我用:

var resultQuery = listMod.GroupBy(p=>p.pax); 

如何通過Header和canDelete重新對resultQuery的結果進行分組?

目的是有3個組:

1st group : mod1 and mod2 
2nd group : mod3 , mod4 , mod5 and mod6 
3rd group : mod7 and mod8 
+2

你如何讓第二組? – Grundy

+0

@Grundy我想我終於明白了:這是canDelete和Header的組合(所以一對與A相同的人,真正的B和真,A和真,B和假)。但是我認爲你必須先忘記第一個分組(至少是完成的方式)才能得到問題! –

+0

對象是我想要一個mod 2到6的分組。我首先由paxNumber分組,我將得到4個關鍵和絃號的組。然後我需要使用Header和CanDelete重新對結果集進行分組,以便如上所述獲得3個組。 – MadNeox

回答

1

嗯,有可能是一個更好的辦法,但這個應該工作,假設你總是兩個項目每個PAX數。

「特技」是連接在第一和第二canDelete/Header對由pax分組的項目中,並在該數值組。

比組內的列表扁平化(使用SelectMany

listMod.GroupBy(m => m.pax) 
    .Select(m => new 
      { 
       valuePair = string.Format("{0}-{1}/{2}-{3}", m.First().canDelete, m.First().Header, m.Last().canDelete, m.Last().Header), 
       value = m.Select(x => x) 
      }) 
    .GroupBy(m => m.valuePair) 
    .Select(g => g.SelectMany(x => x.value)) 
    //.ToList(); 

,如果你想避免這種糟糕的串聯,也可以做

var result = listMod 
       .GroupBy(m => m.pax) 
       .Select(m => new 
       { 
         a1 = m.First().canDelete, 
         a2 = m.First().Header, 
         b1 = m.Last().canDelete, 
         b2 = m.Last().Header, 
         value = m.Select(x => x) 
        }) 
        .GroupBy(m => new {m.a1, m.a2, m.b1, m.b2}) 
        .Select(g => g.SelectMany(x => x.value)) 
        //.ToList(); 
+0

完美的作品。非常感謝你的幫助 – MadNeox