2017-02-03 6 views
0

私のAsp.net MVCプログラムでは、このようなコントローラにアクションメソッドがあります。同じ機能を実行する2つのコードがあります。質問は、なぜコメントコードがうまくいかないのですか?(私はビューをチェックして、コメントコードは私が見たいものを生成することはできませんが、もう一方は可能です)。おそらく、forループと何か関係があります。 iは、forループ終了後にメモリから消えます。どんな考えも価値がある、ありがとう。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); 
     } 

編集: db.Settings.Find(1).MaxDepartmentLevel = 3。

+0

あなたは変数iを維持したい場合は

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

が、なぜこのような何かをしない: int型私= 0 ; ToSelectListItems(db.Departments.Where(r => r.Level == i + 1)) for(i = 0; i

+0

'' 'db.Settings.Find(1).MaxDepartmentLevel'''の値は何ですか? – tym32167

+2

これは同じコードではありません。db.Settings.Find(1).MaxDepartmentLevel == 3、0と思われます –

答えて

2

問題のコメントの@Ivanによって指摘されているforループ変数クロージャの問題です。

実際、以下のコードは私が望むように動作しません。

//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))); 
// 
//   } 

それは、このよう実行します:iは、forループで最後に3と最後のi+1=4となりますため、上記

  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

r => r.Level == i+1

はデリゲートを、インスタンス化された i 変数捕捉自体ではなく、変数 i。これはJAVAとはまったく異なります。

いくつかの貴重な参考文献:https://blogs.msdn.microsoft.com/ericlippert/2009/11/12/closing-over-the-loop-variable-considered-harmful/

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

関連する問題