2017-02-03 2 views
0

В моей программе MVC Asp.net у меня есть метод действий в контроллере, подобном этому. Есть две части кодов, которые выполняют ту же функциональность. Вопрос в том, почему коды комментариев не работают? (Я проверил представление, коды комментариев не могут генерировать что-либо, что я хочу видеть, в то время как другой может.) Возможно, он имеет какое-то отношение к циклу for, потому что переменная i исчезают из памяти после конца цикла. Любая мысль стоит того, спасибо.C#: IEnumerable не работает снаружи для цикла

 // 
     // GET: /Account/Register 
     [AllowAnonymous] 
     public ActionResult Register(string code, string state) 
     { 
      …… 

      var departments = new List<IEnumerable<SelectListItem>>(); 

      //functionally equal, but not work. 
//   for (int i=0; i< db.Settings.Find(1).MaxDepartmentLevel;i++) 
//   { 
//    departments.Add(ToSelectListItems(db.Departments.Where(r => r.Level == i+1))); 
// 
//   } 

      //these work. 
      departments.Add(ToSelectListItems(db.Departments.Where(r => r.Level == 1))); 
      departments.Add(ToSelectListItems(db.Departments.Where(r => r.Level ==2))); 
      departments.Add(ToSelectListItems(db.Departments.Where(r => r.Level == 3))); 


      var registerViewModel = new RegisterViewModel() 
      { 
       OpenId = wechatUserAccessToken.openid, 
       Departments = departments, 
        AvatarImageUrl = avatarImageUrl.TrimEnd('0') + "96" 
      }; 

      return View(registerViewModel); 
     } 

Edit: db.Settings.Find(1).MaxDepartmentLevel = 3.

+0

Если вы хотите сохранить переменную я, почему бы вам не сделать что-то вроде этого: INT I = 0 ; для (i = 0; i r.Level == i + 1))); } –

+0

Какое значение '' 'db.Settings.Find (1) .MaxDepartmentLevel'''? – tym32167

+2

это не тот же код, вы уверены, что db.Settings.Find (1) .MaxDepartmentLevel == 3, кажется, это 0 –

ответ

2

Это проблема с закрытием переменной цикла, которая указана в комментарии @Ivan.

Фактически, приведенный ниже код не будет выполнять, как я желаю.

//functionally equal, but not work. 
//   for (int i=0; i< db.Settings.Find(1).MaxDepartmentLevel;i++) 
//   { 
//    departments.Add(ToSelectListItems(db.Departments.Where(r => r.Level == i+1))); 
// 
//   } 

Он будет работать как это:

  departments.Add(ToSelectListItems(db.Departments.Where(r => r.Level == 4))); 
      departments.Add(ToSelectListItems(db.Departments.Where(r => r.Level ==4))); 
      departments.Add(ToSelectListItems(db.Departments.Where(r => r.Level == 4))); 

Выше r.Level == 4 потому i в для цикла будет 3 окончательно и i+1=4 наконец.

r => r.Level == i+1 является инстанцирование делегата, который захват переменной iсебя но не переменная i «ы значением. Это полностью отличается от JAVA.

Некоторые ценные ссылки:

http://csharpindepth.com/Articles/Chapter5/Closures.aspx

https://blogs.msdn.microsoft.com/ericlippert/2009/11/12/closing-over-the-loop-variable-considered-harmful/

https://stackoverflow.com/a/227833/5835947

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