从Lambda返回数组索引,但抛出IndexOutOfRangeException

时间:2018-11-25 17:39:03

标签: c# linq lambda return indexoutofboundsexception

我正在尝试学习如何使用lambda,在这段代码中,我试图获取数组中可用的某些值的索引,但是它只会返回值5和8很好,而返回其他值不断抛出IndexOutOfRangeException

int[] nums = { 2, 3, 5, 8, 9 };

int rez = nums.Where(i => nums[i] == 2).FirstOrDefault();
Console.WriteLine(rez);

请告诉我“索引”返回值在尝试检索时会发生什么情况? 预先感谢。

2 个答案:

答案 0 :(得分:0)

lambda中的

inums数组的元素(而不是索引)。

因此,第一个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;