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 是否适用于索引

这就是我最终在 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]++);