Цикл повторяется после завершения и возвращает ArgumentOutOfRangeException - PullRequest
2 голосов
/ 10 июля 2019

Я передаю foreach для повышения производительности.Тем не менее, я думаю, что мой for в порядке, но после его прогонов я не знаю, почему он повторяется еще 1 в последний раз (даже если он не соответствует предложению), и он выдает ошибку, потому что «i» не существует в этомlist.

Я искал, и ни у кого не было этой ошибки, поэтому мне любопытно.Я имею в виду, что условие в порядке и работает нормально "в первый раз", но потом, из ниоткуда, оно снова запускается и ломается.

Это может быть возможно, потому что я делаю ToList () для list1?Потому что вызов базы данных возвращает IEnnumerable, и я не смог использовать его для цикла For.

    var list1 = GetData1FromDB().ToList();
        var list2 = GetData2FromDB();

        for (int i = 0; i <= list1.Count() - 1; i++)
        {
            var data2 = list2.Where(x => x.Id == list1[i].Id);
            list1[i].Details = data2;
            result.data1.Add(list1[i]);
        }

1 Ответ

4 голосов
/ 11 июля 2019

Я подозреваю, что проблема в задержке выполнения / отложенной оценке , вызванной LINQ (см. Раздел Замечания ).Когда вы делаете это:

var data2 = list2.Where(x => x.Id == list1[i].Id);
list1[i].Details = data2;

Вы создали IEnumerable, который знает, как вернуть элементы из list2, где x.Id == list1[i].Id.Но он еще не выполнил эту логику - он просто вспомнил, «как» это сделать, включая переменные, на которые он должен ссылаться.

Он будет выполнен позже, когда что-то действительно попытается перечислить его.Проблема заключается в том, что позже значение переменной i было изменено на значение вне диапазона (поскольку i увеличивается с помощью цикла for до тех пор, пока оно не выходит за пределы диапазона).

Вы можетезаставить IEnumerable выполнить немедленно, добавив .ToList() в конец.Это перечислит его и поместит содержимое в список.

Более подробное описание переменных захвата лямбда-выражений см. https://blogs.msdn.microsoft.com/ericlippert/2009/11/12/closing-over-the-loop-variable-considered-harmful/

...