Почему следующий кусок кода генерирует StackOverflowException?
IEnumerable<int> q = new int[] { 1, 2 }; q = from x in new int[] { 1, 2 } from y in q select x + y; q.ToArray();
IEnumerable<int> q = new int[] { 1, 2 };
q = from x in new int[] { 1, 2 }
from y in q
select x + y;
q.ToArray();
С предложениями, как это исправить - прошу в комментарии ;)
Текущий рейтинг: 5.0 (5 голосов)
чисто первая мысль: "ToArray()" перенести чуток выше сразу после select x+y, перед этим заключив сам linq-выражение в скобочки а все из-за ленивого вычисления linq-выражений - ведь на самом деле сама обработка массивов не произойдет до реального вычисления самого массива. может ошибаюсь
Olostan
Приведенный автором linq-запрос будет трансформирован компилятором в приблизительно следующую цепочку вызовов:q = (new int[] { 1, 2 }).SelectMany(x => q, (x, y) => x + y);Лямбда выражение, переданное в качестве первого возвращает энумератор "q" который на момент исполнения запроса является уже не массивом int[] а linq-запросом (System.Linq.Enumerable.SelectManyIterator<int,int,int>), который пытаясь выполнится опять вызывает первое лямда-выражение и т.д. То есть имеем бесконечную рекурсию.Во избежание подобной ситуации следует переписать выражение так:q = q.SelectMany(x => new int[] { 1, 2 }, (x, y) => x + y);или linq-запросомq = from x in q from y in new int[] { 1, 2 } select x + y;Решение №2 состоит в том чтобы завести для полученного linq-запроса другую переменную, то есть сделать так:IEnumerable<int> q = new int[] { 1, 2 };IEnumerable<int> p = from y in new int[] { 1, 2 } from x in q select x + y;p.ToArray();
Роман Руденко
поддерживаю 1й ответ
Sladkij
Рекурсия здесь, в принципе все достаточно эффективные решения устранения уже здесь выше описали.
алгоритм
© Copyright 2010
Sign in