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

我想检查 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 但它返回该值的第一个索引,这意味着该值必须是唯一的,并且我的 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 回答