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