2010-07-30 6 views
4

Mon but est de supprimer un utilisateur de la liste des utilisateurs dans mon application.Mais je ne peux pas aller au fond de cette erreur. Quelqu'un plz me renflouer.C#: la collection a été modifiée; opération d'énumération ne peut pas exécuter

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

Répondre

7

Vous essayez de supprimer un utilisateur de la liste que vous utilisez.

c'est impossible. Le mieux est de créer une nouvelle liste et ajouter les bons dans ce lieu de supprimer les mauvaises

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

Merci 4 la réponse. Pouvez-vous suggérer une modification dans le code existant .. – GethuJohn

+0

: s J'ai ajouté une modification, y at-il plus de modification nécessaire, ou avez-vous commenté avant la fin de mon édition – Nealv

+0

Merci beaucoup Nealv ... – GethuJohn

17

Vous ne pouvez pas modifier une collection alors que nous parcourons dessus avec une boucle foreach. Options typiques:

  • Utilisez une place boucle for
  • Créer une collection séparée des éléments que vous voulez agir, puis itérer sur que.

Exemple de la deuxième approche:

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

Une autre alternative, si vous utilisez List<T> est d'utiliser List<T>.RemoveAll:

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

Autant que je déteste upvote quelqu'un avec 200 000 rep, +1. Je n'utilise pas RemoveAll autant que possible. –

+1

@Dave: Si c'est une consolation, ce n'est pas comme l'upvote a augmenté mon représentant :) –

+0

Merci beaucoup Jon Skeet – GethuJohn

0

vous pouvez le faire comme ça. Utilisez pour 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

Vous ne pouvez pas modifier la collection lors de l'énumération. Au lieu de supprimer sélectionnez uniquement ce dont vous avez besoin et laissez le Garbage Collector prendre soin du reste:

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

Ou mieux encore, sélectionnez uniquement ce dont vous avez besoin à partir du référentiel:

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

La plupart du temps, ce type peut être utilisé, très lisible, moins de code. Je l'utilise tout le temps à moins que je doive faire des fonctions dans mon expression lambda. – Nealv

+0

Merci beaucoup Darin Dimitrov ... – GethuJohn

0

Mon but est de supprimer un WorkCalendar à partir de WorkCalendar mais lorsque Wc sélectionné a WorkHour a levé une exception comme ceci: "Collection a été modifiée, l'opération d'énumération peut ne pas s'exécuter." Des idées? merci pour l'aide

méthode Delete:

essayer {

  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

Bienvenue dans Stack Overflow! Si vous avez une autre question, posez-la en cliquant sur le bouton [Poser une question] (http://stackoverflow.com/questions/ask). – Taryn

Questions connexes