2010-03-30 63 views
2

在下面的代碼中,我試圖讀取所選項目的列表以及所有可用項目的列表。簡單的愚蠢的foreach循環問題

我想存儲所有未從所有項目列表中選擇的項目。但有了下面的代碼,我有一個所有項目的列表......在哪裏以及如何打破第二個循環incase projectId.Value == selectedProjectId.Value?

public IEnumerable NotselectedProjects; 公共IEnumerable的NotSelectedProjects(){

 if (this.NotselectedProjects == null) 
     { 
      List<SelectListItem> result = new List<SelectListItem>(); 
      foreach (var selectedProjectId in selectedProjects) 
      { 
       foreach (var projectId in projectLists) 
       { 
        if (projectId.Value != selectedProjectId.Value) 
        { 
         result.Add(new SelectListItem 
         { 
          Selected = false, 
          Text = projectId.Text, 
          Value = projectId.Value 
         }); 
         this.NotselectedProjects = result.AsEnumerable(); 
        } 
       } 
      } 
     } 
     return this.NotselectedProjects; 

    } 

回答

5

你可以使用LINQ,以縮短循環來

var result = from projectId in projectLists 
      where !selectedProjects.Any(s => s.Value == projectId.Value) 
      select new SelectListItem 
         { 
          Selected = false, 
          Text = projectId.Text, 
          Value = projectId.Value 
         }); 
2

爲什麼不加在其他條件的休息?

if (projectId.Value != selectedProjectId.Value) 
{ 
    ... 
} 
else 
{ 
    break; 
} 
0
if(this.NotSelectedProjects == null) { 
//build a dictionary for fast look-up 
Dictionary<string, SelectListItem> selectedProjects = new Dictionary<string, SelectListItem>(); 
foreach(SelectListItem item in selectedProjectes){ 
    selectedProjects.Add(item.Value, SelectListItem); 
} 

//loop through all the projects 
List<SelectItem> result = new List<SelectListItem>(); 
foreach(SelectListItem item in projectlist) { 
    if(selectedProjects.HasKey(item.Value)){ 
     continue; //this project is selected 
    } 

    result.Add(item); 
} 

this.NotSelectedProjects = result; 
} 

return this.NotSelectedProjects;