我正在尝试学习如何使用lambda,在这段代码中,我试图获取数组中可用的某些值的索引,但是它只会返回值5和8很好,而返回其他值不断抛出IndexOutOfRangeException
!
int[] nums = { 2, 3, 5, 8, 9 };
int rez = nums.Where(i => nums[i] == 2).FirstOrDefault();
Console.WriteLine(rez);
请告诉我“索引”返回值在尝试检索时会发生什么情况? 预先感谢。
答案 0 :(得分:0)
i
是nums
数组的元素(而不是索引)。
因此,第一个i
等于2(nums
的第一个元素)。 nums[2] != 2
,因此更进一步。
i
等于3(nums
的第二个元素)。 nums[3] != 2
,因此更进一步。
然后,i
等于5(nums
的第三个元素)。nums[5] != 2
,但是您的数组有5个元素,最后一个元素的索引为4(因为索引从零开始)。因此,当您尝试访问nums[5]
时,预期会得到一个IndexOutOfRangeException
。
答案 1 :(得分:0)
在您的lambda表达式(i => nums[i] == 2)
中,i
将代表数字本身而不是其索引,因此nums[i]
将不起作用。
您可以简单地使用Array.IndexOf()
来完成此操作:
int rez = Array.IndexOf(nums, 2);
或者如果您坚持要由Linq这么做(不推荐):
int rez = nums.Select((x, i) => new {x, i}).FirstOrDefault(a => a.x == 2).i;