使用单个lambda表达式从满足给定条件的int数组中获取数字的总和

时间:2013-10-25 20:25:23

标签: c# lambda

我不知道我是否遗漏了一些简单的东西,我有这个有效的例子:

    int[] x = new int[] {1, 2, 3, 5, 6, 7};

    int[] arrayToUse = x.Where(i => i > 4).ToArray<int>();
    int sum = arrayToUse.Sum();

    Console.WriteLine(sum.ToString());

我想知道 - 有没有办法将这两者结合起来:

int[] arrayToUse = x.Where(i => i > 4).ToArray<int>();
int sum = arrayToUse.Sum();

为了获得一个会立即返回总和的表达式?

3 个答案:

答案 0 :(得分:3)

只需:

int sum = x.Where(i => i > 4).Sum();

如果您调用ToArray,则会将所有数据复制到新的数组对象,但如果您不需要,请将其保留。 Sum适用于任何IEnumerable<int>(以及其他数字类型),无需在那里创建中间数组。

无论如何,如果你致电ToArray,你可以省略<int>部分,因为编译器可以推断类型参数{{ 1}},在这种情况下很容易。

执行int时,您不必对整数执行Console.WriteLine; ToString有一个带有WriteLine(无拳击)的重载,它会自动调用int

答案 1 :(得分:2)

您可以使用:

int sum = x.Where(i => i > 4).Sum();

答案 2 :(得分:2)

在计算总和之前,无需将过滤后的列表转换为中间数组。你可以这样做:

int[] x = new int[] {1, 2, 3, 5, 6, 7};
int sum = x.Where(i => i > 4).Sum();
Console.WriteLine(sum);

现在我不建议将其用于生产代码,因为它的可读性较低,并且它无法以任何有意义的方式提高性能,但您甚至可以通过单个函数调用来实现这一点:

int[] x = new int[] {1, 2, 3, 5, 6, 7};
int sum = x.Sum(i => i > 4 ? i : 0);
Console.WriteLine(sum);