我正在寻找一种方法在LINQ中执行以下操作(它基本上是一个sumproduct,其中相同的数组包含n + 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 ???
)。
<div class="hide anotherName">
如何(优雅地)使用LINQ做到这一点?
答案 0 :(得分: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();
如果您引用了MoreLinq
,则可以通过将每批2件物品折叠到他们的产品中并使用Sum
来获得更清洁的解决方案:
var res2 = input.Batch(2)
.Select(z => z.Fold((x, y) => x * y))
.Sum();
使用Aggregate
代替Fold
来提供更通用的解决方案:
var res2 = input
.Batch(2)
.Select(batch => batch.Aggregate(1, (x, y) => x * y))
.Sum();
答案 1 :(得分:8)
var result = Enumerable.Range(0, input.Length/2)
.Select(i => input[i*2] * input[i*2 + 1]).Sum();
这应该足够了。这是dotNetFiddle中的示例。
这段代码非常反映:
for (int i = 0; i < input.Length/2; i++)
result += input[i*2] * input[i*2 + 1];
与循环完全相同,但不是循环的第+2
步而是步骤+1
和循环持续时间ArrayItems/2
,你可以从{ {1}}
答案 2 :(得分: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);
这也适用于更多一般情况,您希望通过除以n而不是2来对n个连续数字的乘积求和。