Анонимный делегат С# в цикле
Привет всем, я пытаюсь написать и анонимный делегат. поскольку целочисленная переменная делится между делегатом, мне нужно, чтобы это был локальный экземпляр каждого делегата, так что rs [0] всегда получает nics [0], rs [1] всегда получает nics [1] и т.д.... как я добьюсь этого.
for (int i = 0; i < nics.Count; i++)
{
rs[i] = new RollingSeries(monitor, new RollingSeries.NextValueDelegate(delegate()
{
return GetNetworkUtilization(nics[i]);
}));
}
Абдул халик
Ответы
Ответ 1
Сделайте локальную копию i
:
for (int i = 0; i < nics.Count; i++)
{
int j = i;
rs[i] = new RollingSeries(monitor, new RollingSeries.NextValueDelegate(delegate()
{
return GetNetworkUtilization(nics[j]);
}));
}
Красота закрытий
Ответ 2
Используйте локальное значение, чтобы получить другое значение за итерацию
for (int i = 0; i < nics.Count; i++)
{
int localI = i;
rs[i] = new RollingSeries(monitor, new RollingSeries.NextValueDelegate(delegate()
{
return GetNetworkUtilization(nics[localI]);
}));
}
Ответ 3
Поместите int j = i
внутри вашего цикла и обратитесь к j
в выражении лямбда.
Если вам интересно, почему это происходит, вот запись в блоге MSDN, содержащая подробное техническое объяснение: Закрытие переменной цикла, считающейся вредной