C# 常规列表中所有属性的计数值

C# 常规列表中所有属性的计数值,c#,linq,list,C#,Linq,List,我只想从自定义对象的特定列表中添加值,我目前正在这样做: private int CountChances() { int totalChance = 0; foreach(var chance in this.Chances) { totalChance += chance.Value; } return totalChance; } this.Chances.Sum(e => e.Value); 有没有一种方法可以在不使用for

我只想从自定义对象的特定列表中添加值,我目前正在这样做:

private int CountChances()
{
    int totalChance = 0;
    foreach(var chance in this.Chances)
    {
       totalChance += chance.Value;
    }
    return totalChance;
}
this.Chances.Sum(e => e.Value);

有没有一种方法可以在不使用foreach循环的情况下更快地执行此操作?我几乎可以肯定linq应该能够很快做到这一点,但我似乎找不到如何做到这一点。

您可以这样做:

private int CountChances()
{
    int totalChance = 0;
    foreach(var chance in this.Chances)
    {
       totalChance += chance.Value;
    }
    return totalChance;
}
this.Chances.Sum(e => e.Value);
仅包括:

using System.Linq;
您可以随时执行以下操作:

var sum = this.Chances.Sum(c => c.Value);
这是一个更短更清晰的编码器。但是,就性能而言,
foreach
可能同样快,甚至更快

但是,请注意,
Sum
的实现使用了,这也会影响性能,因此如果您的代码非常关键,那么
foreach
肯定会更快

然而,如果
Chance
类似于

class Chance {
    public long Value {get; set;}
}
我们有一份1000万件物品的清单

var chances = Enumerable.Range(0, 10000000).Select(i => new Chance{Value = i});
在我的机器上,
foreach
的速度是780ms,
Sum
的速度是1030ms。所以,如果你的代码没有接近百万范围,那么你就设置了总和,因为代码更加明显


也就是说,由于您的方法名为
CountOpportunits
,因此支持开发人员可能会错误地认为它正在运行,因为一眼就看不出它实际上是对机会的总和。使用
Sum
方法时没有这种机会。

您希望求和而不计算;-)lol我应该给出答案
Sum(z=>z.Value)
?另一个给出了
和(t=>t.Value)
?你知道
z
t
;)不一样@M.kazemAkhgary:有一个:使用
Sum(x=>x.Value)
Haha非常有趣的家伙:PI最喜欢
c
,因为它是一个机会集合。另外,
e
经常与
EventArgs e
参数冲突。如果要具体化查询,您想知道两者之间的差异是否相同
var chanceList=chances.ToList()
。然后在
chanceList
@TimSchmelter上测量性能-对于具体化查询,结果是393ms对723ms,这有利于
foreach
@SWeko:仍然不确定您测量了什么。只有一次使用10mio。项目还是多次?“我感到惊讶的是,差别如此之大。”TimSchmelter,一次跑步,一轮热身赛(在林帕德)。我已经运行了多次,并进行了手动平均@斯维科:这些是我从你的代码中得到的结果,前两个是循环,后两个是可枚举的。求和:
00:00:00.3780267 00:00:00.3770077 00:00:00.3931983 00:00:00.3159353