5

私は配列を持っているとしましょう

byte[] myarr = {1,4,3,4,1,2,1,2,4,3,1,4,2};    

myarr の長さは 13 (0-12 インデックス) になり、int[] val の長さにもなります。

int[] val = new int[13];

値が 4、つまり 1,3,8,11 である myarr のインデックスを確認したい。

それなら欲しい

val[1]++;
val[3]++;
val[8]++;
val[11]++;

これを行う 1 つの方法は、for ループを使用することです

for(int i=0; i<myarr.length; i++)
{
   if(myarr[i] == 4)
      val[i]++;
}

Array.indexof を使用できますが、その値の最初のインデックスを返します。これは、値が一意である必要があり、myarr に同じ値がたくさんあることを意味します。

これはlinqを使用して行うことができますか?

4

3 に答える 3

3

これは私がLINQでやったことです(更新が含まれています):

myarr.Select((b, i) => b == 4 ? i : -1)
    .Where(i => i != -1)
    .ToList().ForEach(i => val[i]++);

あなたの非 LINQ バージョンは明らかにはるかに簡潔で読みやすいので、それを使用する必要があると思います。

于 2012-04-13T09:31:15.627 に答える
2

できますが、それは簡単ではありません。LINQ はクエリ部分でのみ役立ちます。更新部分は foo ループで実行する必要がありますが、配列には値の型が含まれているため、実際の値ではなく LINQ クエリからインデックスを取得する必要があり、何も得られません。

于 2012-04-13T09:29:05.330 に答える
1

匿名型を使用してインデックスを保存できます。

int[] newIndices = myarr.Select((i, index) => new { Index = index, Value = i })
             .Where (x => x.Value == 4)
             .Select(x => x.Index + 1)
             .ToArray();  

編集:最後に私はあなたの質問を理解しました;)

myarr.Select((i, index) => new { Index = index, Value = i })
              .Where(x => x.Value == 4)
              .Select(x => x.Index)
              .ForEach(i => myarr[i]++);
于 2012-04-13T09:28:05.720 に答える