【发布时间】:2010-01-15 13:59:15
【问题描述】:
我有一个包含许多数字的 double[] 数组。
我有一个算法,可以从该数组中选择符合特定条件(大于 x、至少 y 值等)的部分
现在我想计算我的部分中所有这些值的平均值。
所以,假设我的部分是从索引 20 到 40。现在我有 20 个值。在 C# 中是否有一种简单的方法可以做到这一点,还是我必须遍历我的数组并手动计算平均值?
【问题讨论】:
我有一个包含许多数字的 double[] 数组。
我有一个算法,可以从该数组中选择符合特定条件(大于 x、至少 y 值等)的部分
现在我想计算我的部分中所有这些值的平均值。
所以,假设我的部分是从索引 20 到 40。现在我有 20 个值。在 C# 中是否有一种简单的方法可以做到这一点,还是我必须遍历我的数组并手动计算平均值?
【问题讨论】:
var values = new[] { 1, 2, 3, 4, 5, 6, 7, 8 };
var average = values.Skip(2).Take(5).Average();
【讨论】:
使用 Linq:
var myList = new double[] {1,2,3}
var avg = myList.Where(i => i > 1 && i < 2).Avg();
【讨论】:
请注意,如果您有索引为 20 到 40 的数字,则不是 20 个数字,而是 21 个数字。
您可以使用 Range 方法为索引创建一个 IEnumerable,然后您可以使用 Average 方法获取数字的平均值:
double average = Enumerable.Range(20, 21).Select(i => numbers[i]).Average();
【讨论】:
double avg = array
.Skip(startIndex)
.Take(endIndex - startIndex + 1)
.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<double>。所以,举个例子:
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<double>。
【讨论】:
IEnumerable<double>,然后让 LINQ 完成剩下的工作。
您可以使用 linq 的 skip 和 take 方法来选择特定的索引:
var myData = new double[] { ..... };
var average = myList.Skip(20).Take(21).Average();
【讨论】: