我有一堂课,像这样:
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多行,所以我认为最好将它发布为要点。)
结果很有趣。
领带公差为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%:
这超出了我的误差范围,但是我仍然对结果感兴趣。因为它给出了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
在50或更早的时间就无法满足:实际上,我期望早于50,因为必须为Select
and 创建一个额外的枚举数Where
。我的意思是,这表明领先20分,但并不能解释为什么。我想这是我的问题的重点。
为什么会这样呢?我应该相信吗?如果没有,我应该使用另一个还是另一个?
正如@KingKong在评论中提到的,您还可以使用Sum
需要一个lambda的重载。所以现在我的两个选项更改为:
第一:
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
20点领先优势依然存在,这与@Marcin在评论中指出的Where
and Select
组合无关。
感谢您阅读我的文字墙!另外,如果您有兴趣,这里是修改版本,用于记录Excel接收的CSV。
mc.Value
。