Dans mon application, _Collection est une liste à partir de laquelle j'ai besoin Cependant, le code suivant obtient une erreur forte> une erreur non valide forte> dans sa deuxième itération depuis la Collection elle-même a été modifiée: p> Je pourrais créer une autre collection de liste et les copier en arrière Mais ensuite, j'ai la question des types de référence non clonés, etc. p>
3 Réponses :
_collection.FindAll(user => user.IsApproved());
Ou _collection.findall (utilisateur => utilisateur.isapprouved ()); code> pour éliminer les négations.
_Collection.Findall retournera une autre collection b>. Il est assez différent de changer la collection initiale (il peut y avoir des cas lorsque d'autres objets contiennent des références à la même liste et que vous en avez besoin de changer, plutôt que de la créer un autre).
Vous pouvez toujours commencer à l'index supérieur et itérer vers le bas vers 0:
for (int i = _collection.Count - 1; i >= 0; i--) { User user = _collection[i]; if (!user.IsApproved()) { _collection.RemoveAt(i); } }
Cela semble contenir un bug. Considérez le cas d'une collection avec deux éléments, dont le premier n'est pas approuvé. Le premier est supprimé, alors la collecte [1] devient des limites.
Steven: Dans ce cas, vous décrivez le code ci-dessus aurait déjà vérifié la collection [1] (qui après avoir retiré la collection [0] devient la collection [0]) car elle est itératrice de la hauteur de haut en bas. Donc, il ne devrait pas y avoir d'erreur hors limites.
C'est bon. Marchez à nouveau et vous verrez que ça va.
Pour ceux d'entre nous toujours sur .NET 2.0, cette méthode est la voie à suivre.
@ C-livre gourou: liste
list.removeall (délégué (utilisateur u) {return! U.isapports ();}); < / code>
Chaque fois qu'une collection est modifiée dans une boucle, optez pour un Voici le code, je trouve utile lorsque vous traitez avec des collections modifiables: p> pour code> boucle. La solution donnée par Mehrdad est belle et vaut vraiment la peine d'essayer!
for(int index=0;index < _collection.Count; index++)
{
if (!_collection[index].IsApproved)
{
_collection.RemoveAt(index);
index--;
}
}