同じ長さの double 値の 2 つのリストがあります。
select ステートメントを使用して両方のリストを調べ、同じ位置の要素の差の平均値を返すことはできますか?
例 :
{1 2 3 4}
{1 1 1 1}
帰りたい( (1 - 1) + (2 - 1) + (3 - 1) + (4 - 1) ) / 4 = 6 / 4 = 1.5
試す
listA.Zip(listB, (a, b) => a - b).Average();
.NET 4.0 と Zip がない場合は、試してください
listA.Select((n, index) => n - listB[index]).Average()
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 つに出てきたという理由だけで、Zip
C# 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);
}
}
テクニック (Zip メソッド) に興味があるのか、結果に興味があるのかはわかりませんが、次のコードから同じ結果が得られます。
var arr1 = new[] {1, 2, 3, 4};
var arr2 = new[] {1, 1, 1, 1};
var res = (arr1.Sum() - arr2.Sum())/(double) arr1.Length;
を使用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();