用Linq替换嵌套循环

时间:2018-06-05 21:32:31

标签: c# linq

在下面的查询中,我确实计算了联盟1中所有足球队的总和值。我提出的解决方案尽管有效,但看起来相当笨重。

我想找到一个更好的方法,即一个内置的linq查询,如下所示:

footballteams.Where(x => x.League == 1).Sum(x => x.Networth);

我目前的代码:

List<IGrouping<int, FootballTeam>> footballTeams = context.FootballTeam
    .GetQueryable()
    .GroupBy(x => x.TeamName)
    .ToList();

var prem = footballTeams.Where(x => x.League == 1).ToList();
var totalWealth = 0;

foreach (var team in prem)
{
    foreach(var singleteam in team)
    {
         totalWealth = totalWealth + singleteam.networth;
    }
}

3 个答案:

答案 0 :(得分:10)

使用SelectMany然后Sum

var totalWealth = footballTeams.Where(x => x.League == 1)
                               .SelectMany(x => x.Select(e => e.networth))
                               .Sum();

SelectMany()例外:

  

将序列的每个元素投影到IEnumerable,并将生成的序列展平为一个序列。

答案 1 :(得分:4)

{{1}}

如果您愿意,可以将其划分为一行,但您会注意到可读性对于高效编码至关重要。

答案 2 :(得分:4)

您可以在一个声明中完成所有操作:

var totalWorth = context.FootballTeam
    .GetQueryable()
    .Where(x => x.League == 1)
    .GroupBy(x => x.TeamName)
    .Sum(x => x.Sum(y => y.NetWorth));

您还可以跳过两个ToList()调用执行的枚举。