Анонимный делегат С# в цикле

Привет всем, я пытаюсь написать и анонимный делегат. поскольку целочисленная переменная делится между делегатом, мне нужно, чтобы это был локальный экземпляр каждого делегата, так что 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, содержащая подробное техническое объяснение: Закрытие переменной цикла, считающейся вредной