0

私はこのクエリを持っています

Dasha.Where(x => x[15] == 9).ForEachWithIndex((x,i) => dd[Sex[i]][(int)x[16]]++);

このクエリはDasha、15番目のインデックス値が9である要素を検索し、はいの場合、dd [Dashaindex][x[16]]値をインクリメントします。

ここで、Dashaはdouble[100][50]、ddはdouble[2][10]、Sexはbyte []であり、値は0または1のみです。男性の場合は0、女性の場合は1です。

x [15]は、0から9(両方を含む)の間でのみ可能です。x[16]についても同じルール。

それは私に正しい結果を与えています。

これを最適化してみました

Dasha.ForEachWithIndex((x,i) => 
{
    if(x[15] == 9)
        dd[Sex[i]][(int)x[16]]++
});

これは私に間違った結果を与えています。どこが間違っているのですか?

ForEachWithIndex

static void ForEachWithIndex<T>(this IEnumerable<T> enu, Action<T, int> action)
{
    int i = 0;
    foreach(T item in enu)
        action(item, i++);
}
4

3 に答える 3

1

これは、に関する部分的な回答です(コメントには長すぎます)

 Dasha.ForEachWithIndex((x,i) =>  {
     if(x[15] == 9)
         dd[Sex[i]][(int)x[16]]++ });

これは私に間違った結果を与えています。どこが間違っているのですか?

最初のケースでは、100アイテムのDashaリストをnアイテムにフィルター処理してから、これらのnアイテムを反復処理します。

2番目のケースでは、100個すべてのアイテムを繰り返し処理します。したがって、インデックスは異なり、各行のSex[i]から取得する値は異なります。

例えば

 Dasha[0] != Dasha.Where(x => x[15] == 9)[0] 

Dasha [0] [15]==9でない限り

于 2012-05-12T12:05:19.260 に答える
0

次の前に元のインデックスを保存する必要がありますWhere

Dasha.Select((x,i) => new {x = x, i = i})
     .Where(a => a.x[15] == 9)
     .ForEach(a => dd[Sex[a.i]][(int)a.x[16]]++);
于 2012-05-12T12:07:53.273 に答える
0

以下は、最初のクエリと同じ結果になります。

    int counter=0;
    Dasha.ForEachWithIndex((x,i) => 
    {
        if(x[15] == 9)
        {
            dd[Sex[counter]][(int)x[16]]++;
            counter++;
        }
    })
于 2012-05-13T15:59:57.113 に答える