230 votes

Fait la liste <T> ordre d'insertion de garantie?

Dire que j'ai 3 chaînes dans une Liste (par ex. "1","2","3").

Ensuite, je veux réorganiser leur place "2" dans la position 1 (par ex. "2","1","3").

Je suis l'aide de ce code (réglage indexToMoveTo à 1):

listInstance.Remove(itemToMove);
listInstance.Insert(indexToMoveTo, itemToMove);

Cela semble fonctionner, MAIS je suis parfois obtenir des résultats étranges; parfois, la commande est incorrecte ou des éléments de la liste sont de se faire supprimé!

Des idées? et fait une Liste de garantir l'ordre?

Connexes:

Ne une Liste<T> garantie que les articles seront retournés dans l'ordre où ils ont été ajoutés?

299voto

Bevan Points 20976

La classe List<> garantit la commande - les éléments seront conservés dans la liste dans l'ordre dans lequel vous les ajoutez, y compris les doublons, sauf si vous triez explicitement la liste.

Vous pourriez obtenir des résultats impairs de votre code si vous déplacez l'élément plus tard dans la liste, car votre Remove() déplacera tous les autres éléments d'une place avant l'appel à Insert()

Pouvez-vous réduire votre code à quelque chose d'assez petit pour poster?

34voto

Joel Goodwin Points 3477

Voici 4 éléments, avec leur index.

0  1  2  3
K  C  A  E

Vous voulez déplacer K entre A et E, vous pourriez penser à la position 3. Vous devez être prudent au sujet de votre indexation ici, parce que, après le supprimer, tous les index mis à jour.

Si vous supprimez l'élément 0 de la première, laissant

0  1  2
C  A  E

Ensuite, vous insérez à 3

0  1  2  3
C  A  E  K

Pour obtenir le résultat correct, vous devriez avoir utilisé l'index 2. Pour rendre les choses cohérentes, vous devrez faire parvenir à l' (indexToMoveTo-1) si indexToMoveTo > indexToMove, par exemple

bool moveUp = (listInstance.IndexOf(itemToMoveTo) > indexToMove);
listInstance.Remove(itemToMove);
listInstance.Insert(indexToMoveTo, moveUp ? (itemToMoveTo - 1) : itemToMoveTo);

Cela peut être lié à votre problème. Note que mon code n'est pas testé!

EDIT (déplacé de commentaire): Alternativement, vous pouvez Trier avec un circuit comparateur (IComparer) si c'est applicable à votre situation.

9voto

M4N Points 48758

Comme Bevan l’a dit, mais gardez à l’esprit, l’index des listes est basé sur 0. Si vous voulez déplacer un élément au début de la liste, vous devez l'insérer à l'index 0 (pas 1 comme indiqué dans votre exemple).

1voto

ChrisF Points 74295

C'est le code que j'ai pour déplacer un élément vers le bas à un seul endroit dans une liste:

if (this.folderImages.SelectedIndex > -1 && this.folderImages.SelectedIndex < this.folderImages.Items.Count - 1)
{
    string imageName = this.folderImages.SelectedItem as string;
    int index = this.folderImages.SelectedIndex;

    this.folderImages.Items.RemoveAt(index);
    this.folderImages.Items.Insert(index + 1, imageName);
    this.folderImages.SelectedIndex = index + 1;
 }

et ce pour le déplacer d'une case:

if (this.folderImages.SelectedIndex > 0)
{
    string imageName = this.folderImages.SelectedItem as string;
    int index = this.folderImages.SelectedIndex;

    this.folderImages.Items.RemoveAt(index);
    this.folderImages.Items.Insert(index - 1, imageName);
    this.folderImages.SelectedIndex = index - 1;
}

folderImages est ListBox donc la liste est un ListBox.ObjectCollection, pas un List<T>, mais il n'hérite de l' IList donc il devrait se comporter de la même. Cela vous aide?

Bien sûr, l'ancien ne fonctionne que si l'élément sélectionné n'est pas le dernier élément de la liste et le dernier, si l'élément sélectionné n'est pas le premier élément.

1voto

Asaf Points 41

Si vous changez l'ordre des opérations, vous éviterez le comportement étrange: Insérez d'abord la valeur au bon endroit dans la liste, puis supprimez-la de sa première position. Assurez-vous de le supprimer par son index, car si vous le supprimez par référence, vous pouvez les supprimer tous les deux ...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X