Анонимный делегат c # в цикле - PullRequest
13 голосов
/ 18 ноября 2009

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

Абдул Халик

Ответы [ 3 ]

22 голосов
/ 18 ноября 2009

Сделать локальную копию 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]);
          }));
    }

Красота замыканий

6 голосов
/ 18 ноября 2009

Используйте локальное значение, чтобы получить другое значение для каждой итерации

for (int i = 0; i < nics.Count; i++)
   {
         int localI = i;
         rs[i] = new RollingSeries(monitor, new RollingSeries.NextValueDelegate(delegate()
         {
            return GetNetworkUtilization(nics[localI]);
          }));
    }
4 голосов
/ 18 ноября 2009

Поместите int j = i в свой цикл и обратитесь к j в лямбда-выражении.

Если вам интересно, почему это происходит, вот запись в блоге MSDN, содержащая подробное техническое объяснение: Закрытие переменной цикла, считающейся вредной

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...