4

double値のリストがあります...

1.23、1.24、1.78、1,74...

だから私は後継者との差を計算したい - >追加するだけです(負の値は最初に正でなければなりません)... 4つの値を超えると0,01 +0,53(-)-0,04(-)->にポジティブに…

forループを使えば簡単です... linqで解決する方法はありますか?

4

2 に答える 2

6

負のビットについて何を意味するのかわかりませんが、これはあなたが望むことかもしれません。副作用使うから恐ろしいけど…

double prev = 0d;
var differences = list.Select(current =>
    {
       double diff = prev - current;
       prev = current;
       return Math.Abs(diff);
    }).Skip(1);

(最初の元の値と 0d の差を与えるだけなので、最初の値はスキップされます。)

編集:要素のペアに基づいて投影する拡張メソッドの方が少し良いかもしれません。これにより、副作用が 1 か所に分離されます。これで問題ありません。

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));
于 2009-03-06T15:11:04.557 に答える
2

配列内の前の値にアクセスできるように、関数にインデックスを提供する Select メソッドのオーバーロードを使用できます。

double sum = values.Skip(1).Select((n, i) => Math.Abs(n - values[i])).Sum();

完全に「クリーン」な LINQ ソリューションではありませんが (Jon の SelectPairs 拡張機能の方が見栄えが良い)、ペアを形成する最も簡単な方法だと思います。

于 2009-03-06T15:54:53.513 に答える