将 IEnumerable<double> 转换为双精度



我需要返回双精度数组中奇数索引元素的总和这是我的代码:

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();

相关内容

  • 没有找到相关文章

最新更新