使Linq总和更好

时间:2017-10-02 11:13:41

标签: c# linq

我想从中找到所有physical卡片效果 List<CardEffect> opponenteffect

这个代码块是我提出的

    int netPhysicalDamage = oponenteffect.FindAll(
        ce => ce.type == CardEffect.Type.physical
        ).Sum(ce => ce.amount);

是否可以将其设为单个Linq函数调用?

我想从中找到所有physical卡片效果 List<CardEffect> opponenteffect

这个代码块是我提出的

    int netPhysicalDamage = oponenteffect.FindAll(
        ce => ce.type == CardEffect.Type.physical
        ).Sum(ce => ce.amount);

编辑:“单一Linq函数调用”不是一个好主意,以使这更好

Edit2:问题不是很好。我不熟悉linq,我认为这部分代码做错了。谢谢你的关注。

3 个答案:

答案 0 :(得分:7)

在这种情况下,条件operator是您的朋友:

int result = oponenteffect.Sum(ce => ce.type == CardEffect.Type.physical ? ce.amount : 0);

答案 1 :(得分:1)

您应该使用[client] a Where。所以你应该这样做:

Sum

让我的回答有效&#39;对于你的问题(因为那是SO选民会接受的),我假设通过&#34;单一电话&#34;你的意思是它只会处理一次查询。在这种情况下,当int netPhysicalDamage = oponenteffect.Where( ce => ce.type == CardEffect.Type.physical ).Sum(ce => ce.amount); 返回Where时,它将执行,直到后续调用需要结果为止。因此,在这种情况下,IEnumerable是唯一的#39;。

此外,您编辑了自己的问题,建议您不要求它只是一个功能。

答案 2 :(得分:0)

我们来看看这段代码:

Jon

我得到的结果与此类似:

853.603399999998
1268.61419999997

这意味着两个单独的LINQ调用比单个var ams = 0.0; var bms = 0.0; for (var i = 0; i < 10000; i++) { var sw = Stopwatch.StartNew(); var a = Enumerable.Range(0, 10000).Where(x => x % 2 == 0).Sum(); sw.Stop(); ams += sw.Elapsed.TotalMilliseconds; sw = Stopwatch.StartNew(); var b = Enumerable.Range(0, 10000).Sum(x => x % 2 == 0 ? x : 0); sw.Stop(); bms += sw.Elapsed.TotalMilliseconds; }; Console.WriteLine(ams); Console.WriteLine(bms); 调用“更好”。