首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用linq计算数间差的平均值

用linq计算数间差的平均值
EN

Stack Overflow用户
提问于 2013-10-06 15:02:33
回答 2查看 364关注 0票数 1

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

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

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

EN

回答 2

Stack Overflow用户

发布于 2013-10-06 15:04:12

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

代码语言:javascript
复制
var differenceAverage = input.Zip(input.Skip(1), (x, y) => y - x).Average();

然而,这依赖于两次读取input的能力(每次都会得到相同的结果)-希望在您的情况下这不是问题。

票数 3
EN

Stack Overflow用户

发布于 2013-10-06 15:10:06

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

代码语言:javascript
复制
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的答案。或者,您可能希望创建自己的扩展方法;类似这样的方法应该可以工作:

代码语言:javascript
复制
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;
            }
        }
    }
}

然后这样叫它:

代码语言:javascript
复制
var averageDifference = values.SelectAdjacentPairs((x, y) => y - x).Average();

这种方法不需要像使用我的第一个方法那样按索引访问项,也不需要像使用Zip那样两次枚举集合。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19206294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档