我想从中找到所有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
,我认为这部分代码做错了。谢谢你的关注。
答案 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);
调用“更好”。