我有一个双值列表...
1.23, 1.24, 1.78, 1,74...
所以我想计算后继者之间的差异 - >只添加(负值应该首先是正的)......以上4个值将是0,01 +0,53(-)-0,04(-)->让它积极...
使用for循环,很容易......知道如何用linq解决它吗?
我不确定您对负位的含义是什么,但这可能会满足您的要求。这很可怕,因为它使用副作用,但是......
double prev = 0d;
var differences = list.Select(current =>
{
double diff = prev - current;
prev = current;
return Math.Abs(diff);
}).Skip(1);
(第一个值被跳过,因为它只是给出了第一个原始值和 0d 之间的差异。)
编辑:可能会稍微好一点的是基于元素对进行投影的扩展方法。这将副作用隔离在一个地方,这很好:
using System.Collections.Generic;
// This must be a non-nested type, and must be static to allow the extension
// method.
public static class Extensions
{
public static IEnumerable<TResult> SelectPairs<TSource, TResult>
(this IEnumerable<TSource> source,
Func<TSource, TSource, TResult> selector)
{
using (IEnumerator<TSource> iterator = source.GetEnumerator())
{
if (!iterator.MoveNext())
{
yield break;
}
TSource prev = iterator.Current;
while (iterator.MoveNext())
{
TSource current = iterator.Current;
yield return selector(prev, current);
prev = current;
}
}
}
}
要在您的特定情况下使用它,您可以:
var differences = list.SelectPairs((x, y) => Math.Abs(x-y));
您可以使用为函数提供索引的 Select 方法的重载,以便您可以访问数组中的前一个值:
double sum = values.Skip(1).Select((n, i) => Math.Abs(n - values[i])).Sum();
不是一个完全“干净”的 LINQ 解决方案(Jon 的 SelectPairs 扩展看起来更好),但我认为这是形成对的最简单方法。