我有一个双值列表…
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));

09-04 14:18