2010-07-30 69 views
4

我的目标是从我的应用程序中的用户列表中删除一个用户。但我无法弄清楚这个错误的底部。有人把我救了出来。C#:收藏已修改;枚举操作可能不会执行

if (txtEmailID.Text.Length > 0) 
{ 
    users = UserRespository.GetUserName(txtEmailID.Text); 
    bool isUserAvailable=false; 
    foreach (EduvisionUser aUser in users) // Exception thrown in this line 
    { 
     isUserAvailable = true; 
     if(!aUser.Activated) 
     { 
      users.Remove(aUser); 
     } 
    } 
    if (users.Count == 0 && isUserAvailable) 
    { 
     DeactivatedUserMessage(); 
     return; 
    } 
} 

回答

7

您正试图从正在循环的列表中删除用户。

这是不可能的。最好是建立一个新的列表,并在其中添加而不是删除坏的

if (txtEmailID.Text.Length > 0) 
    { 
     //@new list 
     List<EduvisionUser> listOfAcceptedUsers = new List<EduvisionUser>()** 

     users = UserRespository.GetUserName(txtEmailID.Text); 
     bool isUserAvailable=false; 
     foreach (EduvisionUser aUser in users) --->***Exception thrown in this line*** 
     { 
      isUserAvailable = true; 

      //Add user to list instead of deleting 
      if(aUser.Activated) 
      { 
       ListOfAcceptedUsers.Add(aUser); 
      } 
     } 

     //check new list instead of old one 
     if (ListOfAcceptedUsers.Count == 0 && isUserAvailable) 
     { 
      DeactivatedUserMessage(); 
      return; 
     } 

    } 
+0

感谢4的答复。你可以建议对现有代码进行修改。 – GethuJohn 2010-07-30 10:49:18

+0

:s我添加了修改,是否需要更多修改,或者您在我的编辑结束之前发表了评论 – Nealv 2010-07-30 11:03:38

+0

非常感谢Nealv ... – GethuJohn 2010-08-05 06:25:21

17

,而你遍历其与foreach循环您不能修改一个集合好的。典型的选项:

  • 使用for循环,而不是
  • 创建要作用于项目的独立的集合,然后遍历。第二种方法

例子:

List<EduvisionUser> usersToRemove = new List<EduvisionUser>(); 
foreach (EduvisionUser aUser in users) --->***Exception thrown in this line*** 
{ 
    isUserAvailable = true; 
    if(!aUser.Activated) 
    { 
     usersToRemove.Add(aUser); 
    } 
} 
foreach (EduvisionUser userToRemove in usersToRemove) 
{ 
    users.Remove(userToRemove); 
} 

另一种选择,如果你使用List<T>是使用List<T>.RemoveAll

isUserAvailable = users.Count > 0; 
users.RemoveAll(user => !user.Activated); 
+0

尽管我讨厌将upvote someone拥有200,000代表,+1。我尽可能不使用RemoveAll。 – 2010-07-30 11:38:20

+1

@Dave:如果是任何安慰,它不会像upvote增加了我的代表:) – 2010-07-30 11:40:59

+0

非常感谢Jon Skeet – GethuJohn 2010-08-05 06:24:47

0

,你可以不喜欢这样。改为使用foreach

for(int i =0; i< users.Count; i++) --->***Exception thrown in this line*** 
{ 
    EduvisionUser aUser = users[i]; 
    isUserAvailable = true; 
    if(!aUser.Activated) 
    { 
    users.Remove(aUser); 
    i--; 
    } 
} 
0

枚举时不能修改集合。而不是删除选择的只有你所需要的,并留下垃圾收集处理其他的护理:

users = users.Where(x => x.Activated); 

甚至更​​好,选择从资源库中只需要什么:

users = UserRespository.GetUserName(txtEmailID.Text).Where(x => x.Activated); 
+0

大多数情况下,这种类型可以使用,非常可读,代码少。除非我必须在lambda表达式中执行函数,否则我一直都在使用它。 – Nealv 2010-07-30 11:05:49

+0

非常感谢Darin Dimitrov ... – GethuJohn 2010-08-05 06:24:02

0

我的目标是从WorkCalendar中删除WorkCalendar,但选择具有WorkHour的Wc时会抛出如下异常:“集合已被修改;枚举操作可能无法执行”。有任何想法吗?感谢您的帮助

删除方法:

尝试 {

  if (!this.DataWorkspace.ApplicationData.WorkCalendars.CanDelete) 
      { 
       this.ShowMessageBox("", "", MessageBoxOption.Ok); 
       return; 
      } 

      if (this.WorkCalendars.SelectedItem != null) 
      { 
       if ((this.WorkCalendars.SelectedItem.FindCalendarWPs.Count() > 0) || (this.WorkCalendars.SelectedItem.FindCalendarWPs1.Count() > 0)) 
       { 
        Microsoft.LightSwitch.Threading.Dispatchers.Main.BeginInvoke 
     (() => 
     { 
      RadWindow.Alert(" "); 
     }); 
        return; 
       } 
       var y = DataWorkspace.ApplicationData.WorkCalendarDays.Where(w => w.WorkCalendar.Id == WorkCalendars.SelectedItem.Id).Execute().AsEnumerable(); 

       foreach (var item in y) 
       { 
        if(item.WorkingHoursCollection != null && item.WorkingHoursCollection.Count() > 0) 
         foreach (var WH in item.WorkingHoursCollection) 
         { 
          WH.Delete(); 
         } 
        item.Delete(); 

       } 
       if (this.WorkCalendars.SelectedItem == this.DataWorkspace.ApplicationData.WorkCalendars.Where(U => U.Id == this.WorkCalendars.SelectedItem.Id).SingleOrDefault()) 
       { 
        Microsoft.LightSwitch.Threading.Dispatchers.Main.BeginInvoke 
     (() => 
     { 
      RadWindow.Alert(" "); 
     }); 
        return; 
       } 

       this.WorkCalendars.SelectedItem.Delete(); 
       this.Save(); 
      } 

     } 
     catch (Exception ex) 
     { 
      Microsoft.LightSwitch.Threading.Dispatchers.Main.BeginInvoke 
      (() => 
      { 
       var msg = new LightSwitchApplication.Presentation.GeneralViews.ExceptionMessage(); 
       msg.DataContext = ex; 
       msg.ShowDialog(); 
      }); 
     } 
+0

欢迎来到Stack Overflow!如果还有其他问题,请点击[问问题](http://stackoverflow.com/questions/ask)按钮。 – Taryn 2013-04-09 10:26:52

相关问题