8
votes

Quel est le moyen le plus simple de forer une liste enlever des objets indésirables?

Dans mon application, _Collection est une liste à partir de laquelle j'ai besoin supprimer tous les objets utilisateur qui ne correspondent pas aux critères .

Cependant, le code suivant obtient une erreur une erreur non valide dans sa deuxième itération depuis la Collection elle-même a été modifiée: xxx

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.

est un moyen de faire ce qui précède plus élégamment que la copie _Collection à une autre variable de liste?


0 commentaires

3 Réponses :


54
votes
_collection.FindAll(user => user.IsApproved());

2 commentaires

Ou _collection.findall (utilisateur => utilisateur.isapprouved ()); pour éliminer les négations.


_Collection.Findall retournera une autre collection . 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).



4
votes

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


5 commentaires

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 .RemoveAll existe depuis 2.0: list.removeall (délégué (utilisateur u) {return! U.isapports ();}); < / code>



0
votes

Chaque fois qu'une collection est modifiée dans une boucle, optez pour un pour code> boucle. La solution donnée par Mehrdad est belle et vaut vraiment la peine d'essayer!

Voici le code, je trouve utile lorsque vous traitez avec des collections modifiables: p>

for(int index=0;index < _collection.Count; index++)
{
    if (!_collection[index].IsApproved)
    {
        _collection.RemoveAt(index);
        index--;
    }
}


0 commentaires