【问题标题】:making Linq sum better使 Linq 和更好
【发布时间】:2017-10-02 11:13:41
【问题描述】:

我想从 List<CardEffect> opponenteffect

这个代码块是我想出来的

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

是否可以对单个 Linq 函数调用进行此操作?


我想从 List<CardEffect> opponenteffect

这个代码块是我想出来的

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

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

Edit2:这个问题不是很好。我不熟悉linq,我认为这部分代码有问题。感谢您的关注。

【问题讨论】:

  • 为什么“单一”LINQ 调用很重要?
  • FindAll 不是 LINQ 方法,请改用 Where
  • @Enigmativity:其实他说的是“更好”,而不是更重要...
  • @musefan - 在他的问题中没有提到“更好”。他只是被问到是否有可能使这成为一个单一的 LINQ 函数调用。我在问为什么这很重要。
  • @Enigmativity OP,这就是为什么我没有使用@

标签: c# linq


【解决方案1】:

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

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

【讨论】:

  • 值得注意的是,如果将SumAverage 交换,这可能会有点危险。
  • @DavidG 现在为我辩护:好吧,我们可以就问题的质量达成一致,但很清楚:是否可以将其用于单个 Linq 函数调用? i> ;)
【解决方案2】:

您确实应该使用Where Sum。所以你应该这样做:

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

为了使我的回答对您的问题“有效”(因为这是选民会接受的),我假设“单次通话”实际上意味着它只会处理一次查询。在这种情况下,它会,因为Where 返回一个IEnumerable,并且在后续调用需要结果之前不会执行。所以在这种情况下,Sum 是唯一的“呼叫”。

此外,您编辑了您的问题,建议您无论如何都不需要它是一个单一的功能。

【讨论】:

  • 这不是IQueryable - 这是IEnumerable<T>
  • @Enigmativity:我就是这么说的
【解决方案3】:

让我们看看这段代码:

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);

我得到的结果是这样的:

853.603399999998 1268.61419999997

这意味着两个单独的 LINQ 调用比单个 .Sum(...) 调用“更好”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 2012-04-01
    • 2011-10-30
    • 1970-01-01
    • 2011-11-22
    • 2023-03-12
    • 1970-01-01
    相关资源
    最近更新 更多