【问题标题】:how to use conditional sum linq c# [closed]如何使用条件求和 linq c# [关闭]
【发布时间】:2015-02-16 13:34:12
【问题描述】:

这里有什么问题?如何正确过滤掉负面元素?

class Program
{
    static void Main(string[] args)
    {
         int[] array = { 1, 2, -3, 4, 5, -1, 4, -2 };

         double sumOfElem = array.Sum(element => element < 0);
         Console.WriteLine(sumOfElem);
    }
}

【问题讨论】:

  • 您告诉我们 - 这里有什么问题? (是的,我们可以在这种情况下进行猜测,但请详细说明您的问题是什么、您想要实现的目标以及您使用的方法不起作用的原因)
  • Sum 中的 lambda 是选择器,而不是过滤器。
  • 没有明确的问题。
  • 您至少需要指定程序的期望结果是什么......
  • 您可以随时选择您想要求和的内容:var negatives=array.Where(i =&gt; i &lt; 0); int sum=negatives.Sum();。由于Where 的延迟执行不会“花费”更多。但它增加了可读性、可测试性和可维护性。

标签: c# linq


【解决方案1】:

我认为你需要这个:

double sumOfElem = array.Sum(element => (element < 0 ? 0 : element));

这样,您将使用Sum 的重载,该重载利用了变换函数(所谓的选择器),该函数应用于数组的每个元素。

以上过滤掉否定元素。如果你想过滤掉 positive ,那么只需反转比较运算符:

double sumOfElem = array.Sum(element => (element > 0 ? 0 : element));

【讨论】:

    【解决方案2】:

    你可以试试这个:

    int sumOfElem = array.Where(element => element < 0)
                         .Sum();
    

    您无法在Sum 中过滤您的值。您应该先过滤这些值,然后对它们求和。

    更新

    你不能在Sum 中过滤你的值,我的意思是你不能在Sum 方法中传递一个谓词。

    【讨论】:

    • 不完全正确,你可以这样做double sumOfElem = array.Sum(element =&gt; Math.Min(0, element));
    • @Phylogenesis 你是对的。我想说的是,我们不能在 Sum 中传递谓词。
    • @TimSchmelter 哎呀,我忽略了这一点。非常感谢!
    猜你喜欢
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多