如何使用Linq代替foreach到Group和Count

时间:2014-01-16 14:25:39

标签: c# linq foreach

我有2个列表,一个用于玩家,另一个用于教练。

为了统计属于教练的玩家数量,我使用了:

  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”循环。 提前谢谢!

4 个答案:

答案 0 :(得分:2)

您可以稍微改变一下这句话。由于最终您想要更改每个教练的属性,因此最简单的方法是遍历该列表,如:

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

答案 1 :(得分: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类型的一部分,而不是......

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

你可以采用你需要的任何逻辑,但语法也是一样的。

var count = g.Count();