我需要返回双精度数组中具有奇数索引的元素的和,这是我的代码:
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。我不知道该怎么处理这件事。请帮帮我!
发布于 2021-10-23 01:20:29
您要查找的内容如下所示:
public static double EvaluateSumOfElementsOddPositions(double[] inputData)
{
return inputData
.Where((data, index) => index % 2 != 0)
.Sum();
}
如果您不打算在偶数索引上使用元素,则不需要对元素进行分组。
发布于 2021-10-23 02:01:16
尽管尝试使用LINQ来做这件事是一个很好的练习,但效率不是很高。
GroupBy将创建一个Dictionary<Tkey, ICollection<TResult>>
,或者更准确地说:一个查找表。对于每个元素,它将提取密钥和TResult。对于每个元素,它将检查键是否在查找表中。
ICollection<TResult>
中,并将键和集合添加到表中。这是相当多的工作,而实际上您唯一想要的是:
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();
https://stackoverflow.com/questions/69686729
复制相似问题