Сохранение значений переменных в теле делегата
Возникает проблема при формировании списка делегатов, представляющих собой математические выражения. Помимо параметров функций в формулах должны присутствовать константы, формирующиеся на основе переменной i. Вот простейший пример:
static void Main(string[] args)
{
List<Func<int>> funcs = new List<Func<int>>();
for (int i = 0; i < 5; i++)
{
funcs.Add(() => { return i; });
}
for (int j = 0; j < 3; j++)
{
Console.WriteLine(funcs[j]().ToString());
}
Console.ReadLine();
}
Вывод:
5
5
5
То есть я заполнил в цикле 5 делегатов. При этом я хотел чтобы они соответствовали таким функциям:
f() = 0
f() = 1
f() = 2
f() = 3
f() = 4
Но вместо этого в делегаты ушла ссылка на переменную i, которая успешно доинкрементировалась в цикле до значения 5 (на чем цикл остановился и перестал выполняться), а последнее значение переменной i = 5 сохранилось во всех делегатах. Поэтому при вызове первых трех делегатов я получил 5, 5, 5, а не 0, 1, 2, как хотел.
Вопрос: каким образом лучше решить задачу сохранения значений внешних параметров в теле делегатов?