Comment faire pour supprimer des éléments d'un tableau
Salut, je suis en train de travailler sur un code existant qui va quelque chose le long des lignes de
for(int i = results.Count-1; i >= 0; i--)
{
if(someCondition)
{
results.Remove(results[i]);
}
}
Pour moi, il semble comme une mauvaise pratique à enlever les éléments tout en toujours une itération dans la boucle parce que vous serez à la modification de l'index.
Est-ce correct?
Est-il une meilleure manière de faire ceci? Je voudrais utiliser LINQ mais je suis en 2.0 Cadre
ouais, en fait, vous ne pouvez pas le faire. Il doit lever une exception.
Il fonctionne jusqu'à ce que par la suppression d'un résultat que vous raccourcir la longueur d'un tableau et puis vous essayez d'accéder à quelque chose en dehors de la matrice.
[edite] en fait, rien que le code fait beaucoup de sens. ;-\
Le code du travail? Comment préférez-vous le faire? J'ai utilisé cette méthode, je suis donc intéressé de savoir si elle est "mauvaise pratique".
Si doit lancer une exception .
Il fonctionne jusqu'à ce que par la suppression d'un résultat que vous raccourcir la longueur d'un tableau et puis vous essayez d'accéder à quelque chose en dehors de la matrice.
[edite] en fait, rien que le code fait beaucoup de sens. ;-\
Le code du travail? Comment préférez-vous le faire? J'ai utilisé cette méthode, je suis donc intéressé de savoir si elle est "mauvaise pratique".
Si doit lancer une exception .
OriginalL'auteur Coder 2 | 2011-02-01
Vous devez vous connecter pour publier un commentaire.
Le déménagement est effectivement ok, puisque vous allez vers le bas à zéro, seuls les index que vous avez déjà passé vont être modifiés. Ce code aurait pause pour une autre raison: Il commence avec
results.Count
, mais devrait commencer àresults.Count -1
puisque les indices de tableau commencent à 0.Edit:
Comme l'a souligné - vous réellement devez avoir à composer avec une Liste de certains de tri dans votre pseudo-code. Dans ce cas, ils sont essentiellement les mêmes (comme les Listes d'utiliser un Tableau à l'interne), mais si vous utilisez un tableau et que vous avez un
Length
de la propriété (au lieu d'unCount
à la propriété) et vous ne pouvez pas ajouter ou supprimer des éléments.À l'aide d'une liste de la solution ci-dessus est certainement concis mais peut-être pas facile à comprendre pour quelqu'un qui a besoin de maintenir le code (à savoir en particulier l'itération dans la liste à l'envers) - une autre solution pourrait être d'identifier d'abord les éléments à supprimer, puis dans un second passage, la suppression de ces articles.
Juste remplacer
MyType
avec le type réel vous avez à faire:Oui, il n'a besoin de ce que vous avez suggéré. J'ai manqué. Mis à jour.
À ce point, pourquoi ne pas l'appeler RemoveAt? L'index est déjà prévu.
bonne suggestion, j'ai fait une modification pour que
BrokenGlass, votre approche alternative convertit origine O(n) code à O(n^2) Retirez avez à la recherche par le biais de toute la liste.
OriginalL'auteur BrokenGlass
Il ne semble pas que la suppression doit travailler à tous. Le IList mise en œuvre devrait échouer si nous avons affaire à un tableau de taille fixe, voir ici.
Cela étant dit, si vous faites affaire avec un redimensionnable liste (par exemple, List<T>), pourquoi l'appeler Supprimer au lieu de RemoveAt? Puisque vous êtes déjà naviguer dans les indices dans le sens inverse, vous n'avez pas besoin de "re-trouver" le point.
OriginalL'auteur micahtan
Puis-je suggérer un peu plus d'alternative fonctionnelle à votre code actuel:
Au lieu de modifier le tableau existant à un seul élément à la fois, vous pourriez obtenir un nouveau un et ensuite de remplacer l'ensemble du tableau comme "atomique" de l'opération une fois que vous avez terminé:
La voie de la facilité (pas de LINQ, mais très similaire):
où
T
est le type des éléments de votreresults
tableau.Un peu plus explicite alternative:
OriginalL'auteur stakx
Habituellement, vous ne serait pas supprimer des éléments en tant que tel, vous devez créer un nouveau tableau à partir de l'ancien, sans les éléments non désirés.
Si vous allez l'itinéraire de la suppression des éléments d'un tableau/liste de vos boucles, il faut compter vers le bas plutôt que vers le haut. (comme le vôtre)
OriginalL'auteur Tim Jarvis
un couple d'options:
ou sinon, vous pouvez faire une copie de la liste existante, et au lieu de supprimer de la liste originale.
OriginalL'auteur Victor