Question

J'ai un HashSet en C # que je retirer de si une condition est remplie si le tout en réitérant HashSet et ne peut pas le faire en utilisant une boucle foreach comme ci-dessous.

foreach (String hashVal in hashset) 
{
     if (hashVal == "somestring") 
     {
            hash.Remove("somestring");
     }
}

Alors, comment puis-je supprimer tout itérer?

Était-ce utile?

La solution

Utilisez la RemoveWhere procédé de HashSet place:

hashset.RemoveWhere(s => s == "somestring");

Vous spécifiez une condition / prédicat comme paramètre à la méthode. Tout élément du HashSet qui correspond à l'attribut sera supprimé.

Cela permet d'éviter le problème de la modification de la HashSet alors qu'il est itéré.


En réponse à votre commentaire:

's' représente l'élément courant en cours d'évaluation à partir de l'HashSet.

Le code ci-dessus est équivalente à:

hashset.RemoveWhere(delegate(string s) {return s == "somestring";});

ou

hashset.RemoveWhere(ShouldRemove);

public bool ShouldRemove(string s)
{
    return s == "somestring";
}

EDIT: Quelque chose vient de se produire pour moi: car HashSet est un ensemble qui ne contient pas de valeurs en double, appeler juste hashset.Remove("somestring") suffit. Il n'y a pas besoin de le faire dans une boucle comme il n'y aura jamais plus d'une seule partie.

Autres conseils

Vous ne pouvez pas supprimer des éléments d'une collection en boucle au-dessus avec un recenseur. Deux approches pour résoudre ce sont:

  • Boucle en arrière sur la collection en utilisant une indexation régulière de boucle (qui je crois est pas une option dans le cas d'un HashSet)
  • Boucle sur la collection, ajouter des éléments à enlever à une autre collection, puis une boucle sur la "to-be-supprimé" et -collection supprimer les éléments:

Exemple de la deuxième approche:

HashSet<string> hashSet = new HashSet<string>();
hashSet.Add("one");
hashSet.Add("two");

List<string> itemsToRemove = new List<string>();
foreach (var item in hashSet)
{
    if (item == "one")
    {
        itemsToRemove.Add(item);
    }
}

foreach (var item in itemsToRemove)
{
    hashSet.Remove(item);
}

J'éviter d'utiliser deux boucles foreach - une boucle foreach suffit:

HashSet<string> anotherHashSet = new HashSet<string>();
foreach (var item in hashSet)
{
    if (!shouldBeRemoved)
    {
        anotherSet.Add(item);
    }
}
hashSet = anotherHashSet;

En général, quand je veux itérer sur quelque chose et supprimer les valeurs que j'utilise:

 For (index = last to first)
      If(ShouldRemove(index)) Then
           Remove(index)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top