【问题标题】:Get average value from double[] between two indices从两个索引之间的 double[] 获取平均值
【发布时间】:2010-01-15 13:59:15
【问题描述】:

我有一个包含许多数字的 double[] 数组。

我有一个算法,可以从该数组中选择符合特定条件(大于 x、至少 y 值等)的部分

现在我想计算我的部分中所有这些值的平均值。

所以,假设我的部分是从索引 20 到 40。现在我有 20 个值。在 C# 中是否有一种简单的方法可以做到这一点,还是我必须遍历我的数组并手动计算平均值?

【问题讨论】:

    标签: c# .net arrays average


    【解决方案1】:
    var values = new[] { 1, 2, 3, 4, 5, 6, 7, 8 };
    var average = values.Skip(2).Take(5).Average();
    

    【讨论】:

    • 打败我... +1 按他的要求按索引而不是按值过滤!
    • @Aaronaught:“我有一个算法,可以从这个数组中选择符合特定条件(大于 x,至少 y 值等)的部分。”也就是说,按索引选择并不是他试图解决的唯一问题。
    • 谢谢。这很酷:)为了澄清:我预先检查该部分是否符合条件,然后,一旦我有了边界,计算平均值。所以这个解决方案是完全有效的。
    【解决方案2】:

    使用 Linq:

    var myList = new double[] {1,2,3}
    var avg = myList.Where(i => i > 1 && i < 2).Avg();
    

    【讨论】:

    • .Where(i => i > 1 && i 如果我错了,请纠正我,但是这个谓词不是将数组的值限制为 1 和 2 吗?如果是这样那么这不是正确答案,因为用户希望将数组的 INDEX 限制为 1 和 2,因此您需要从数组中获取数字 2 和 3。
    • 我知道,因为谓词 - 第二句知道索引。所以:为什么不包括谓词。
    【解决方案3】:

    请注意,如果您有索引为 20 到 40 的数字,则不是 20 个数字,而是 21 个数字。

    您可以使用 Range 方法为索引创建一个 IEnumerable,然后您可以使用 Average 方法获取数字的平均值:

    double average = Enumerable.Range(20, 21).Select(i => numbers[i]).Average();
    

    【讨论】:

      【解决方案4】:
      double avg = array
          .Skip(startIndex)
          .Take(endIndex - startIndex + 1)
          .Average();
      

      【讨论】:

        【解决方案5】:

        使用Enumerable.Average:

        double[] values = new[] { 1.0, 2.0, 3.14, 2.71, 9.1 };
        double average = values.Where(x => x > 2.0 && x < 4.0).Average();
        

        因此,要将其与您的选择方法一起使用,您应该考虑让这些方法返回 IEnumerable&lt;double&gt;。所以,举个例子:

        public IEnumerable<double> GreaterThan(double[] values, double value) {
            for(int i = 0; i < values.Length; i++) {
                if(values[i] > value) {
                    yield return values[i];
            }
        }
        

        然后:

        // values is double[]
        double average = GreaterThan(values, 2.0).Average();
        

        你甚至可以把上面的方法做成一个扩展方法,让它读起来很好:

        double average = values.GreaterThan(2.0).Average();
        

        我鼓励您编写过滤方法以返回 IEnumerable&lt;double&gt;

        【讨论】:

        • 你不是按索引而是按值选择。
        • @Oliver Hanappi:“我有一个算法,可以从这个数组中选择符合特定条件(大于 x,至少 y 值等)的部分。”他想要的不仅仅是按索引选择。以上只是一个例子。关键是让他的方法返回一个IEnumerable&lt;double&gt;,然后让 LINQ 完成剩下的工作。
        • 这看起来也很酷。所以 GreaterThan 函数已经返回了我数组的一部分,对吧?但是如果该数组中可以有 n 个段呢?说从索引 10 到 20,然后从索引 50 到 80?
        【解决方案6】:

        您可以使用 linq 的 skip 和 take 方法来选择特定的索引:

        var myData = new double[] { ..... };
        var average = myList.Skip(20).Take(21).Average();
        

        【讨论】:

        • 使用 Take(20) 你只能得到索引从 20 到 39 的数字。
        猜你喜欢
        • 1970-01-01
        • 2023-02-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多