Возвращает индекс массива из лямбды, но выдает исключение IndexOutOfRangeException - PullRequest
0 голосов
/ 25 ноября 2018

Я пытаюсь узнать, как использовать лямбда-выражения, и в этом коде я пытаюсь получить индекс некоторого значения, доступного в массиве, но он просто возвращает значения 5 и 8 в порядке, а остальные значения -продолжает бросать IndexOutOfRangeException!

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

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

Скажите, пожалуйста, что произойдет с возвращаемым значением "index" при попытке его получить?Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018

в вашем лямбда-выражении (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;
0 голосов
/ 25 ноября 2018

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 ожидаемо.

...