Disons que j'ai 3 chaînes dans une liste (par exemple "1", "2", "3").
Ensuite, je veux les réorganiser pour placer "2" en position 1 (par exemple "2", "1", "3").
J'utilise ce code (en définissant indexToMoveTo sur 1):
listInstance.Remove(itemToMove);
listInstance.Insert(indexToMoveTo, itemToMove);
Cela semble fonctionner, mais j'obtiens parfois des résultats étranges; Parfois, la commande est incorrecte ou des éléments de la liste sont supprimés!
Des idées? Est-ce List<T>
que la commande est garantie?
En relation:
c#
.net
collections
SuperSuperDev1234
la source
la source
Réponses:
La
List<>
classe 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.Selon MSDN:
Les valeurs d'index doivent rester fiables pour que cela soit précis. Par conséquent, la commande est garantie.
Vous pourriez obtenir des résultats étranges de votre code si vous déplacez l'élément plus tard dans la liste, car vous
Remove()
déplacerez tous les autres éléments d'un endroit avant l'appel àInsert()
.Pouvez-vous réduire votre code à quelque chose d'assez petit pour le publier?
la source
List
dans tout bon manuel d'informatique. Tout commeQueue
etStack
, aList
est une structure de données bien définie, prévisible et bien comprise - si l'implémentation .NET différait (ou si elle changeait), beaucoup de logiciels se briseraient.Where()
méthode LINQ pour filtrer la liste, vous comptez sur l'implémentation pour considérer les éléments de la séquence dans l'ordre. Il arrive que ce soit le cas (voir referencesource.microsoft.com/System.Core/System/Linq/… ), mais cela n'est pas documenté dans MSDN. Je suggère d'utiliseremp.LastOrDefault(x => x.empDept = 'abc')
car la documentationLastOrDefault()
indique qu'elle maintient l'ordre des articles.Voici 4 articles, avec leur index
Vous voulez déplacer K entre A et E - vous pourriez penser à la position 3. Vous devez faire attention à votre indexation ici, car après la suppression, tous les index sont mis à jour.
Vous supprimez donc l'élément 0 en premier, laissant
Ensuite, vous insérez à 3
Pour obtenir le résultat correct, vous devriez avoir utilisé l'index 2. Pour rendre les choses cohérentes, vous devrez envoyer à (indexToMoveTo-1)
if indexToMoveTo > indexToMove
, par exempleCela peut être lié à votre problème. Notez que mon code n'a pas été testé!
EDIT : Alternativement, vous pourriez
Sort
avec un comparateur personnalisé (IComparer
) si cela s'applique à votre situation.la source
Comme l'a dit Bevan, mais gardez à l'esprit que l'index de liste est basé sur 0. Si vous souhaitez 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).
la source
Voici le code que j'ai pour déplacer un élément vers le bas d'un endroit dans une liste:
et ceci pour le déplacer d'une place vers le haut:
folderImages
estListBox
bien sûr donc la liste est unListBox.ObjectCollection
, pas unList<T>
, mais il hériteIList
donc il devrait se comporter de la même manière. est-ce que cela aide?Bien sûr, le premier 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.
la source
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 ...
la source