Question

Ma question est est-il sûr pour recenseur pour enlever l'article de SortedList?

SortedList<decimal, string> myDictionary;
// omitted code

IEnumerator<decimal, string> enum = myDictionary.GetEnumerator();

while(enum.MoveNext)
{
  // is it ok to remove here?
  myDictionary.Remove(enum.Current.Key);
}
Était-ce utile?

La solution

lancera une exception -. Vous ne pouvez pas modifier une collection tout en réitérant dessus

Si vous y réfléchissez un peu, vous comprendrez pourquoi. Si l'ajout ou le retrait de la collection a été autorisée, vous ne itérer être sur la même collection -. Vous avez trop nombreux (ajouter) ou non suffisamment d'éléments (suppression)

Autres conseils

Comme nous l'avons dit ce que vous cherchez à faire est impossible. Cependant, une solution de rechange serait de maintenir simplement une liste d'éléments marqués pour suppression puis retirez ces postfaces. Je voudrais aussi opter pour un foreach plutôt qu'une boucle de while, moins de code par exemple.

var removeList = new List<decimal>();
foreach (var item in myDictionary)
{
    // have a condition which indicates which items are to be removed
    if (item.Key > 1)
    {
        removeList.Add(item.Key);
    }
}

Ou si vous essayez simplement de récupérer des éléments à supprimer, utilisez LINQ

var removeList = myDictionary.Where(pair => pair.Key > 1).Select(k => k.Key).ToList();

Ensuite, il suffit de les retirer de la liste.

// remove from the main collection
foreach (var key in removeList)
{
    myDictionary.Remove(key);
}

Opérations sur la liste au cours des itérations ne sont pas pris en charge en général. Le comportement attendu est de lancer une exception, mais même si une collection ne le fait pas vous ne devez pas compter sur ce travail correctement.

Vous pouvez d'abord copier les éléments dans une autre liste, puis itérer sur cette nouvelle liste des articles à modifier.

Non

. Un InvalidOperationExcpetion est jeté. Je suis d'accord que les éléments déjà énumérés pourraient être supprimables car il est un indice fixe. Cependant, la question est la suivante:

La mise en œuvre de SortedList n'est pas assez intelligent pour comprendre que la suppression n'a pas d'incidence sur la poursuite de l'exécution du dénombrable. Et pour le garder simple et fonctionne bien, il ne devrait pas.

Comme d'autres l'ont déjà souligné, il ne fonctionnera pas. Cependant, étant donné que la collection est un SortedList vous pouvez utiliser la méthode RemoveAt.

Cette méthode a un peu mieux le profil de mémoire car il ne nécessite pas de frais généraux par opposition à une augmentation de O (n) en utilisant une liste séparée pour garder la trace des renvois. Il aurait également un O (n ^ 2) le profil de performance par rapport à O (n ^ 2 * log (n)). La méthode RemoveAt est O (n) étant donné qu'il doit effectuer une copie de tableau. La méthode Remove ajoute une opération O (log (n)) pour trouver l'index avant d'appeler en interne RemoveAt. Tout cela est probablement pas d'intérêt pour vous, mais il est utile de savoir si vous exécutez dans des situations impliquant un grand nombre de « n ».

var myDictionary = new SortedList<decimal, string>();

// omitted code

int i = 0;
while (myDictionary.Count > 0 && i < myDictionary.Count)
{
  if (/* predicate to use for removal */)
  {
    myDictionary.RemoveAt(i);
  }
  else
  {
    i++;
  }
}

Une autre solution:

            int counter= MyDictionary.Count;
            if (counter == 0)
                return;

            for (int i = 0;  i < counter;i++)
            {
                KeyValuePair<MyIdentifier, MyValue> key = (KeyValuePair<MyIdentifier, MyValue>)MyDictionary.ToArray()[i];
                MyIdentifier identifier = null;

                if (key.Key != null)
                    identifier = key.Key as MyIdentifier;

                if (identifier != null)
                    if (MyCondition)
                    {
                        MyDictionary.Remove(identifier);
                        counter--;
                    }
            }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top