3

同じ長さの double 値の 2 つのリストがあります。

select ステートメントを使用して両方のリストを調べ、同じ位置の要素の差の平均値を返すことはできますか?

例 : {1 2 3 4}

{1 1 1 1}

帰りたい( (1 - 1) + (2 - 1) + (3 - 1) + (4 - 1) ) / 4 = 6 / 4 = 1.5

4

4 に答える 4

3

試す

listA.Zip(listB, (a, b) => a - b).Average();

.NET 4.0 と Zip がない場合は、試してください

listA.Select((n, index) => n - listB[index]).Average()
于 2012-05-02T15:03:39.747 に答える
3
List<int> list1 = new List<int> { 1, 2, 3, 4 };
List<int> list2 = new List<int> { 1, 1, 1, 1 };

double result = list1.Zip(list2, (a, b) => a - b).Average();

実行した結果は 1.5 でした。


私がそのように感じ、他のコメントの 1 つに出てきたという理由だけで、ZipC# 3.5 で実行できる私の実装を次に示します。

public static IEnumerable<T> Zip<T>(this IEnumerable<T> first
    , IEnumerable<T> second, Func<T, T, T> resultSelector)
{
    if (first == null)
        throw new ArgumentNullException("first");
    if (second == null)
        throw new ArgumentNullException("second");
    if (resultSelector == null)
        throw new ArgumentNullException("resultSelector");

    return ZipImpl(first, second, resultSelector);
}

public static IEnumerable<T> ZipImpl<T>(IEnumerable<T> first
    , IEnumerable<T> second, Func<T, T, T> resultSelector)
{
    IEnumerator<T> firstIterator = first.GetEnumerator();
    IEnumerator<T> secondIterator = second.GetEnumerator();
    while (firstIterator.MoveNext() && secondIterator.MoveNext())
    {
        yield return resultSelector(firstIterator.Current, secondIterator.Current);
    }
}
于 2012-05-02T15:04:00.577 に答える
2

テクニック (Zip メソッド) に興味があるのか​​、結果に興味があるのか​​はわかりませんが、次のコードから同じ結果が得られます。

var arr1 = new[] {1, 2, 3, 4};
var arr2 = new[] {1, 1, 1, 1};
var res = (arr1.Sum() - arr2.Sum())/(double) arr1.Length;
于 2012-05-02T15:10:47.580 に答える
0

を使用Enumerable.Rangeしてインデックスを生成します (.NET 4.0 がない場合Zip)

var l1 = new List<int> { 1, 2, 3, 4 };
var l2 = new List<int> { 1, 1, 1, 1 };
double result = Enumerable.Range(0, l1.Count)
    .Select(i => l1[i] - l2[i])
    .Average();
于 2012-05-02T15:10:04.170 に答える