我有一堂课,像这样:
public class MyClass
{
public int Value { get; set; }
public bool IsValid { get; set; }
}
实际上它要大得多,但这会重现问题(怪异)。
我想获得Value
实例有效的 的总和。到目前为止,我已经找到了两种解决方案。
第一个是这样的:
int result = myCollection.Where(mc => mc.IsValid).Select(mc => mc.Value).Sum();
然而,第二个是这样的:
int result = myCollection.Select(mc => mc.IsValid ? mc.Value : 0).Sum();
我想得到最有效的方法。起初,我认为第二个会更有效率。然后我的理论部分开始“嗯,一个是 O(n + m + m),另一个是 O(n + n)。第一个应该表现更好,有更多无效,而第二个应该表现更好少”。我认为他们的表现会一样。编辑:然后@Martin 指出 Where 和 Select 结合在一起,所以它实际上应该是 O(m + n)。但是,如果您看下面,似乎这不相关。
所以我对它进行了测试。
(它有 100 多行,所以我认为最好将其作为 Gist 发布。)
结果……很有趣。
0% 领带公差:
量表有利于Select
和Where
,约 30 分。
How much do you want to be the disambiguation percentage?
0
Starting benchmarking.
Ties: 0
Where + Select: 65
Select: 36
有 2% 的领带公差:
它是一样的,除了对于一些他们在 2% 以内。我会说这是最小的误差范围。Select
现在Where
只有约 20 分的领先优势。
How much do you want to be the disambiguation percentage?
2
Starting benchmarking.
Ties: 6
Where + Select: 58
Select: 37
有 5% 的领带公差:
这就是我所说的最大误差范围。它使它对 . 更好一点Select
,但不是很多。
How much do you want to be the disambiguation percentage?
5
Starting benchmarking.
Ties: 17
Where + Select: 53
Select: 31
有 10% 的领带公差:
这超出了我的误差范围,但我仍然对结果感兴趣。因为它现在已经领先了 20 分Select
。Where
How much do you want to be the disambiguation percentage?
10
Starting benchmarking.
Ties: 36
Where + Select: 44
Select: 21
有 25% 的领带公差:
这是一种方式,超出了我的误差范围,但我仍然对结果感兴趣,因为Select
并且Where
仍然(几乎)保持他们 20 分的领先优势。似乎它在少数几个方面超越了它,这就是它领先的原因。
How much do you want to be the disambiguation percentage?
25
Starting benchmarking.
Ties: 85
Where + Select: 16
Select: 0
现在,我猜测 20 分的领先优势来自中路,他们都必然会获得相同的表现。我可以尝试记录它,但这将是一大堆信息。我猜,图表会更好。
所以这就是我所做的。
它表明Select
线路保持稳定(预期)并且Select + Where
线路向上爬升(预期)。然而,令我困惑的是为什么它不满足Select
at 50 或更早:事实上我期待早于 50,因为必须为Select
and创建一个额外的枚举器Where
。我的意思是,这显示了 20 分的领先优势,但它没有解释原因。我想,这是我问题的重点。
为什么它会这样?我应该相信它吗?如果没有,我应该使用另一个还是这个?
正如评论中提到的@KingKong,您还可以使用Sum
带有 lambda 的 's 重载。所以我的两个选项现在更改为:
第一的:
int result = myCollection.Where(mc => mc.IsValid).Sum(mc => mc.Value);
第二:
int result = myCollection.Sum(mc => mc.IsValid ? mc.Value : 0);
我打算让它更短一点,但是:
How much do you want to be the disambiguation percentage?
0
Starting benchmarking.
Ties: 0
Where: 60
Sum: 41
How much do you want to be the disambiguation percentage?
2
Starting benchmarking.
Ties: 8
Where: 55
Sum: 38
How much do you want to be the disambiguation percentage?
5
Starting benchmarking.
Ties: 21
Where: 49
Sum: 31
How much do you want to be the disambiguation percentage?
10
Starting benchmarking.
Ties: 39
Where: 41
Sum: 21
How much do you want to be the disambiguation percentage?
25
Starting benchmarking.
Ties: 85
Where: 16
Sum: 0
二十分的领先优势仍然存在,这意味着它与@Marcin 在评论中指出的Where
and组合无关。Select
感谢您阅读我的文字墙!此外,如果您有兴趣,这里是记录 Excel 接收的 CSV 的修改版本。