1

我有一列具有双值。我必须计算列中所有值的每个值之间差异的平均值。

例如:对于 1、2、3.5,平均值为:( (2-1) + (3.5-2) ) / 2

有没有一种 linq 方法或另一种聪明的方法?

4

2 回答 2

3

您可以使用ZipandSkip一起创建“相邻数字之间的差异”部分,然后是正常平均值:

var differenceAverage = input.Zip(input.Skip(1), (x, y) => y - x).Average();

但是,这取决于读取input两次(并且每次都获得相同结果)的能力-希望这对您而言不是问题。

于 2013-10-06T07:04:12.490 回答
1

如果你有一个数组(或列表,或任何其他类似的集合)中的值,你可以这样做:

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.

于 2013-10-06T07:10:05.703 回答