C# LINQ在索引上工作吗?

C# LINQ在索引上工作吗?,c#,arrays,linq,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

假设我有一个数组

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]++;
}
for(int i=0;i您可以使用存储:

编辑:我终于明白了你的问题;)


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

这就是我在LINQ中完成的工作(包括更新):


您的非LINQ版本显然更加简洁易读,因此我认为您应该使用它。

您为什么会关心LINQ?你的工作示例非常简单。此外,我认为你能从LINQ那里得到的最好的结果是实际价值。。。然后,您仍然需要增加它并将其重新分配回数组。LINQ中的“Q”代表查询。LINQ用于查询数据。您想更改数据。你的for循环就是实现这一点的方法。@GrahamClark:林肯的可能想法。。。。谁在?增量部分在哪里?它创建新数组,而不是修改现有的
val
@Petradulin:是的,正如L.B.提到的,我的第一种方法不正确,因为它只返回索引。因此,我添加了第二个(以“最终我理解了你的问题”开头)修改原始数组。@w0lf:2处的-1条件是什么?@NikhilAgrawal我返回
-1
,而不是不包含值
4
的索引。在下一行中,我过滤掉了所有
-1
,因此我最终得到了一个索引列表,其中只包含
4
@NikhilAgrawal的值。很可能这可以以某种方式清除,但我仍然认为非LINQ代码在这种情况下更好。@w0lf我知道for循环是最好的,但现在我的数据更少,我不想为一行答案写很多行。谢谢,它很有魅力。
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]++);
myarr.Select((b, i) => b == 4 ? i : -1)
    .Where(i => i != -1)
    .ToList().ForEach(i => val[i]++);