使用linq计算数字之间的平均差异

时间:2013-10-06 07:02:33

标签: linq dataview date-arithmetic

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

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

有没有linq方式来做或其他聪明的方式?

2 个答案:

答案 0 :(得分:1)

您可以同时使用ZipSkip来创建相邻数字之间的差异"部分,然后是正常平均值:

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

这取决于能够阅读input两次(并且每次都得到相同的结果)但是 - 希望在您的情况下这不是问题。

答案 1 :(得分:0)

如果您已获得数组(或列表或任何其他类似集合)中的值,则可以执行以下操作:

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一样枚举您的集合两次。