我需要返回双精度数组中奇数索引元素的总和这是我的代码:
public static double EvaluateSumOfElementsOddPositions(double[] inputData)
{
var sum = inputData
.Select((v, i) => new { Group = (i % 2 != 0), Value = v })
.GroupBy(x => x.Group)
.Select(g => g.Sum(y => y.Value));
return sum ;
}
但是我有一个错误:不能隐式地将IEnumerable转换为double类型。我不知道该怎么处理……请帮助!
您要查找的内容是:
public static double EvaluateSumOfElementsOddPositions(double[] inputData)
{
return inputData
.Where((data, index) => index % 2 != 0)
.Sum();
}
如果不打算使用偶数索引的元素,则不需要对元素进行分组。
虽然尝试使用LINQ来做这个是一个很好的练习,但它不是很有效。
GroupBy将创建一个Dictionary<Tkey, ICollection<TResult>>
,或者更准确地说:一个查找表。对于每个元素,它将提取键和result。对于每个元素,它将检查键是否在查找表中。
- 如果没有,它将把结果放在一个新的
ICollection<TResult>
中,并将Key和集合添加到表中。 - 如果Key在表中,则将结果添加到集合的末尾。
这是相当多的工作,而实际上你唯一想要的是:
public static IEnumerable<double> ToEveryOtherDouble(this IEnumerable<double> doubles)
{
bool everyOther = false;
// will return elements with index 1, 3, 5, ...
// start with true if you want 0, 2, 4, ...
foreach (double d in doubles)
{
if (everyOther)
yield return d;
everyOther = !everyOther;
}
用法:
IEnumerable<double> inputData = ....
double sum = inputData.ToEveryOtherDouble().Sum();
如果你坚持使用LINQ,创建两个组:一个包含偶数索引的双精度组和一个包含奇数索引的双精度组。
So组键:i % 2
double sum = inputData.Select( (d, index) => new
{
Index = index,
Value = d,
})
.GroupBy(x => x.Index % 2, // keySelector: groups with key 0 and key 1
// parameter elementSelector: specify the elements of each group
x => x.Value) // as elements of the group, we only need the double
GroupBy的结果:两组。一个键为0的组和一个键为1的组。键为0的组有偶数索引的双精度元素,键为1的组有奇数索引的双精度元素。
继续LINQ:如果你只想要偶数索引:
.Where(group => group.Key == 0).Sum();
结论选择是你的:哪一个更容易阅读、重用、维护和单元测试:
double sum = inputData.Select( (d, index) => new
{
Index = index,
Value = d,
})
.GroupBy(x => x.Index % 2, x => x.Value)
.Where(group => group.Key == 0)
.Sum();
或:
double sum = inputData.ToEveryOtherDouble().Sum();