我有一个具有双精度值的列。我必须计算列中所有值的每个值之间的差值的平均值。
例如:对于1,2,3.5,平均值是:( (2-1) + (3.5-2) )/2
有没有一种linq的方法或者另一种聪明的方法?
发布于 2013-10-06 15:04:12
您可以结合使用Zip和Skip来创建“相邻数字之间的差异”部分,然后是正常平均值:
var differenceAverage = input.Zip(input.Skip(1), (x, y) => y - x).Average();然而,这依赖于两次读取input的能力(每次都会得到相同的结果)-希望在您的情况下这不是问题。
发布于 2013-10-06 15:10:06
如果您已经在数组(或列表,或任何其他类似的集合)中获得了值,则可以执行以下操作:
double[] values = new[] { 1.0, 2.0, 3.5 };
var averageDifference = Enumerable
.Range(0, values.Length - 1)
.Select(i => values[i + 1] - values[i])
.Average();如果值不在类似数组的集合中,您可以使用Jon Skeet的答案。或者,您可能希望创建自己的扩展方法;类似这样的方法应该可以工作:
public static IEnumerable<TResult> SelectAdjacentPairs<TSource, TResult>(
this IEnumerable<TSource> source,
Func<TSource, TSource, TResult> resultSelector)
{
using (var enumerator = source.GetEnumerator())
{
if (enumerator.MoveNext())
{
TSource prev = enumerator.Current;
while (enumerator.MoveNext())
{
yield return resultSelector(prev, enumerator.Current);
prev = enumerator.Current;
}
}
}
}然后这样叫它:
var averageDifference = values.SelectAdjacentPairs((x, y) => y - x).Average();这种方法不需要像使用我的第一个方法那样按索引访问项,也不需要像使用Zip那样两次枚举集合。
https://stackoverflow.com/questions/19206294
复制相似问题