LINQ版本计算数组中相邻元素的和积

bra*_*roo 7 .net c# linq

我正在寻找一种方法在LINQ中执行以下操作(它基本上是一个sumproduct,其中相同的数组包含产品nn + 1索引的操作数,显然数组长度总是如此2 * n).

int[] input = { -3, 26, -2, 19, 2, 19, 3, 29, 1, 48 };

// sum product
double result = 0;
for (int i = 0; i < input.Length; i += 2)
     result += input[i] * input[i + 1];

// result = 57

// linq version of calculating resultPrice ???
Run Code Online (Sandbox Code Playgroud)

我怎样才能(优雅地)使用LINQ?

Tam*_*red 8

您可以Zip使用乘法运算2个子阵列,然后Sum就像解释请求一样:

int result = input.Where((x, i) => i % 2 == 0)
    .Zip(input.Skip(1).Where((x, i) => i % 2 == 0), (x, y) => x * y)
    .Sum();
Run Code Online (Sandbox Code Playgroud)

如果您已经MoreLinq参考,您可以通过将每批2件物品折叠到他们的产品中并使用Sum以下来获得更清洁的解决方案:

var res2 = input.Batch(2)
    .Select(z => z.Fold((x, y) => x * y))
    .Sum();
Run Code Online (Sandbox Code Playgroud)

或者通过使用Aggregate而不是更通用的解决方案Fold:

var res2 = input
    .Batch(2)
    .Select(batch => batch.Aggregate(1, (x, y) => x * y))
    .Sum();
Run Code Online (Sandbox Code Playgroud)

  • 除了"批处理"解决方案之外,此页面上的所有解决方案都不比for循环好.+1 (4认同)

myb*_*ame 8

 var result = Enumerable.Range(0, input.Length/2)
                          .Select(i => input[i*2] * input[i*2 + 1]).Sum();
Run Code Online (Sandbox Code Playgroud)

这应该足够了.这里是dotNetFiddle的例子.


这段代码非常像:

for (int i = 0; i < input.Length/2; i++)
     result += input[i*2] * input[i*2 + 1];
Run Code Online (Sandbox Code Playgroud)

这与你的循环做的完全相同,但是你没有循环的步骤+2,你有步骤+1和循环的持续时间ArrayItems/2,你可以从中得到元素的总和input[i*2] * input[i*2 + 1]


juh*_*arr 6

您可以使用Select包含索引的重载,然后将索引上的组除以2.通过乘以它们来聚合值,最后进行求和.

int[] input = { -3, 26, -2, 19, 2, 19, 3, 29, 1, 48 };

var result = input.Select((v, i) => new { Index = i, Value = v })
    .GroupBy(x => x.Index / 2, x => x.Value)
    .Select(g => g.Aggregate(1, (v, a) => a *= v))
    .Sum();

Console.WriteLine(result);
Run Code Online (Sandbox Code Playgroud)

这也适用于更多一般情况,您希望通过除以n而不是2来对n个连续数的乘积求和.

  • 使用LINQ-hammer,您完全可以解决问题:-) (6认同)
  • 恭喜!你[保存了公主](https://toggl.com/programming-princess)! (3认同)
  • 我很想看到一个RegEx解决方案. (2认同)