2014-01-16 43 views
0

我有2個列表,一個用於播放器,另一個用於教練。如何使用Linq而不是foreach來分組和計數

要計算玩家的數量屬於一個教練,我用:

var g = AllePlayer.GroupBy(play=> play.coachNumer); 
    foreach (var grp in g) 
    { 
     foreach (Coach co in AlleCoaches) 
     { 
      if (co.coachNumer== grp.Key) 
      { 
       co.NumOfPlayer= grp.Count(); 
      } 
     } 
    } 

現在我想知道是否有把情人的部分用「的foreach」在一個不錯的LINQ語法的好方法避免這個「foreach」循環。 提前謝謝!

+0

謝謝大家! – Johnny

回答

1
AlleCoaches.ToList() 
.ForEach(n=>n.NumOfPlayer=AllePlayer.Where(n=>coachNumer==n.coachNumer).Count()); 
+0

非常快速和骯髒:) – Johnny

+0

是AlleCoaches是一個列表,你不需要使它ToList()。 – potehin143

0
var g = AllePlayer.TakeWhile(play=> (play.coachNumer!=null)); 

你可以採取任何你需要的邏輯,但語法是相同的。

var count = g.Count(); 
2

你可以稍微改變一下陳述。由於最終要更改每個教練的屬性,最簡單的方法來遍歷目錄,如:

foreach (Coach co in AlleCoaches) 
{ 
    co.NumOfPlayer= AllePlayer.Where(p => p.coachNumber == co.coachNumber) 
           .Count(); 
} 
+0

這麼容易和symper! – Johnny

1

這將是一個更簡單的方法:

var query = AllePlayer.GroupBy(player => player.coachNumer, 
           (coach, players => new { 
            Coach = coach, 
            Count = players.Count() })); 

這會給你一個序列每個元素都是教練和教練的球員人數。

然後你可能迭代結果,並將值分配到Coach.NumOfPlayer,但你真的需要嗎?如果你這樣做,這將做到這一點:

foreach (var pair in query) 
{ 
    pair.Coach.NumOfPlayer = pair.Count; 
} 

個人感覺並不像「玩家數量」應該是Coach類型的一部分下手......