2013-12-23 6 views
0

Недавно я переключился на C# с vb.net и продолжал натыкаться на странную вещь.Изменения параметров при передаче запроса?

Это заставляет меня почесывать голову, но, вероятно, глупо прост, может кто-то указать, что им не хватает?

У меня есть IEnumerable объект с сущностями в нем, 3 сущностями в данный момент.

AAA, orange, blue, red  
BBB, green, yellow, pink  
CCC, orange, pink, red 

с помощью кода ниже я, кажется, чтобы получить последние элементы коды (три буквы), и только что, в три раза. поэтому выход будет:

Running Company code: CCC  
Running Company code: CCC  
Running Company code: CCC 

если я пошагово, он проходит каждый из них, но я думаю, что это как-то его изменить его в петле Еогеасп перед его положить на консоль. Если я поставлю console.writeline в цикле, тогда я получу ожидаемый результат.

Running Company code: AAA  
Running Company code: BBB  
Running Company code: CCC 

Ive не проверял, но я уверен, что это будет работать хорошо в VB.Net, может кто-нибудь объяснить, что им не хватает, его, вероятно, правильно всасывания перед моим лицом не вызывает сомнений.

public void lookForWork() 
    {  

     var custs = _IRepository.GetCustomers(); 
     var conf = _IRepository.GetConfig(); 

     foreach (var custRow in custs) 
     { 

     worker = new BackgroundWorker(); 
     worker.WorkerSupportsCancellation = true; 
     worker.DoWork += (obj, e) => checkWork(conf.Where(x => x.Code == custRow.Code).SingleOrDefault()); 
     worker.RunWorkerAsync(); 

     } 

    } 

    private void checkWork(CustomerConfigEntity custInfo) 
    { 
     console.WriteLine(String.Format("Running Company code: {0}", custInfo.Code)); 
    } 
+1

Не вы получите предупреждение о «не используйте переменную итерации в лямбда ... 'или что-то в этом роде? – Mr47

+0

Нет, он работает отлично, просто неожиданный выход. – user3129632

ответ

4

Вы столкнулись с ошибкой «переменная петель в закрытии».

Либо использовать C# 5.0, или написать:

public void lookForWork() 
{  
    var custs = _IRepository.GetCustomers(); 
    var conf = _IRepository.GetConfig(); 

    foreach (var custRow in custs) 
    { 
     var localCustRow = custRow; 
     worker = new BackgroundWorker(); 
     worker.WorkerSupportsCancellation = true; 
     worker.DoWork += (obj, e) => 
      checkWork(conf.Where(x => x.Code == localCustRow.Code).SingleOrDefault()); 
     worker.RunWorkerAsync(); 
    } 
} 

Для получения дополнительной информации см EXCELENT статьи Эрик Липперт по теме: http://blogs.msdn.com/b/ericlippert/archive/2009/11/12/closing-over-the-loop-variable-considered-harmful.aspx

+0

Это работает блестяще, и лучшие ошибки всегда являются ошибками Microsoft, которые становятся нашими ошибками! Спасибо, Крис, попытался подняться, но пока не мог этого сделать. – user3129632

Смежные вопросы