Проще говоря, когда вы используете переменную в лямбде, она расширяет область видимости переменной до лямбды / лямбда все еще имеет доступ к i даже после того, как для l oop закончен и ваша ссылка на i установлена в инициализаторе for l oop вышел из области видимости.
Поскольку LINQ-выполнение лямбды действительно происходит только тогда, когда вы запрашиваете результат / перечисляете перечислимое (и это может быть несколько часов спустя), лямбда будет посмотрите значение i
, как оно было оставлено для l oop, то есть 2, и это будет означать, что ваша лямбда-индекс испытывает индекс вне диапазона
В последних версиях c# внутреннее поведение foreach l oop был изменен так, что каждая итерация l oop возвращает копию переменной из того, что итерировалось, так что вы должны быть в состоянии изменить ваш for на foreach на lookupKey, и он будет работать как вы ожидать. Тем не менее, это неуклюжий шаблон для чтения и понимания, и я думаю, вам следует подумать о том, чтобы изменить его на что-то вроде:
var output = lookupData.Where(arr => arr.SequenceEquals(lookupKey));
Если набор данных будет большим и будет часто выполняться поиск, рассмотрите возможность использования контейнера, который будет sh элементы вместо этого, потому что сейчас этот метод требует большого числа сравнений строк - количество записей в lookupData, умноженное на количество записей в lookupKey