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