【问题标题】:convert IEnumerable<double> to double将 IEnumerable<double> 转换为 double
【发布时间】:2023-04-01 01:40:01
【问题描述】:

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

 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。 我不知道我该如何处理...请帮助!

【问题讨论】:

  • .Select(g =&gt; g.Sum(y =&gt; y.Value)).Sum()
  • 您可以像这样简单地使用 where 覆盖:.Where((i,x)=&gt; x % 2== 1).Sum();

标签: c# linq double ienumerable


【解决方案1】:

你正在寻找的是这样的:

public static double EvaluateSumOfElementsOddPositions(double[] inputData)
{
    return inputData
        .Where((data, index) => index % 2 != 0)
        .Sum();
}

如果您不打算在偶数索引处使用元素,则不需要对元素进行分组。

【讨论】:

  • @TeSla 很高兴我能提供帮助。您能否为答案投票并将其标记为解决方案?
  • 我试过了,但我有:感谢您的反馈!您需要至少 15 声望才能投票,但您的反馈已被记录。
  • 好的,没问题 :) 祝你编码顺利!
【解决方案2】:

虽然尝试使用 LINQ 执行此操作是一个不错的练习,但效率不高。

GroupBy 将创建一个Dictionary&lt;Tkey, ICollection&lt;TResult&gt;&gt;,或者更准确地说:一个查找表。对于每个元素,它将提取键和 TResult。对于ever 元素,它会检查键是否在查找表中。

  • 如果没有,它会将 TResult 放入新的ICollection&lt;TResult&gt; 中,并将 Key 和集合添加到表中。
  • 如果 Key 在表中,它会将 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 Key: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();

【讨论】:

  • 为什么不直接使用Where 覆盖而不进行分组?
猜你喜欢
  • 2021-07-25
  • 1970-01-01
  • 2016-10-10
  • 1970-01-01
  • 1970-01-01
  • 2019-07-08
  • 1970-01-01
  • 1970-01-01
  • 2020-06-22
相关资源
最近更新 更多