我有一个具有双值的列。 我必须计算列中所有值的每个值之间差异的平均值。
例如: 1,2,3.5 平均值为:((2-1)+(3.5-2))/ 2
有没有linq方式来做或其他聪明的方式?
答案 0 :(得分:1)
您可以同时使用Zip
和Skip
来创建相邻数字之间的差异"部分,然后是正常平均值:
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
一样枚举您的集合两次。