LINQ 是否适用于索引
本文关键字:索引 适用于 是否 LINQ | 更新日期: 2023-09-27 18:30:55
假设我有一个数组
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 完成吗?
这就是我最终在 LINQ 中所做的(包括更新):
myarr.Select((b, i) => b == 4 ? i : -1)
.Where(i => i != -1)
.ToList().ForEach(i => val[i]++);
您的非 LINQ 版本显然更加简洁和可读,因此我认为您应该使用它。
你可以
,但它不会更简单。LINQ 只会帮助您处理查询部分,更新部分必须在 foo 循环中完成,但由于数组包含值类型,因此您需要从 LINQ 查询中获取索引而不是实际值,并且您什么也没赢得。
可以使用匿名类型来存储索引:
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]++);