LINQ是否适用于Index?

时间:2012-04-13 09:24:21

标签: c# arrays linq

让我说我有一个阵列

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];

我想检查myarr的索引,其值为4,即1,3,8,11。

然后我想要

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

这样做的一种方法是使用for循环

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

我们可以使用Array.indexof,但它返回该值的第一个索引,这意味着该值必须是唯一的,而my my有很多相同的值。

可以使用linq完成吗?

3 个答案:

答案 0 :(得分:3)

这是我最后在LINQ中做的事情(包括更新):

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

你的非LINQ版本显然更加简洁和可读,所以我认为你应该使用它。

答案 1 :(得分:2)

你可以,但不会更简单。 LINQ只会帮助您查询部分,更新部分必须在foo循环中完成,但由于数组包含值类型,您需要从LINQ查询中获取索引而不是实际值,并且您没有赢得任何东西。

答案 2 :(得分:1)

您可以使用anonymous type存储index

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]++);