J'ai donc une liste générique et un oldIndex
et unnewIndex
valeur.
Je souhaite déplacer l'élément à oldIndex
, versnewIndex
... aussi simplement que possible.
Aucune suggestion?
Remarque
L'élément doit se retrouver entre les éléments avant(newIndex - 1)
et newIndex
avant sa suppression.
newIndex--
ne donne pas le comportement que vous avez dit vouloir.ObservableCollection
et non d'un génériqueList<T>
, mais il est trivial de simplement échanger les appels de méthode pour obtenir le même résultat.[newIndex - 1]
et[newIndex]
n'est pas inversible.Move(1, 3); Move(3, 1);
ne ramène pas la liste à l'état initial. Pendant ce temps, il y a un comportement différent fourniObservableCollection
et mentionné dans cette réponse , qui est inversible .Réponses:
Je sais que vous avez dit "liste générique" mais vous n'avez pas précisé que vous deviez utiliser la liste (T) classe , alors voici un aperçu de quelque chose de différent.
La classe ObservableCollection (T) a une méthode Move qui fait exactement ce que vous voulez.
En dessous, il est fondamentalement implémenté comme ça.
Ainsi, comme vous pouvez le voir, la méthode d'échange que d'autres ont suggérée est essentiellement ce que fait l' ObservableCollection dans sa propre méthode Move.
MISE À JOUR 2015-12-30: Vous pouvez voir le code source des méthodes Move et MoveItem dans corefx maintenant pour vous-même sans utiliser Reflector / ILSpy puisque .NET est open source.
la source
la source
newIndex
casse réellement mon test (voir ma réponse ci-dessous).lock
instruction.Je sais que cette question est ancienne mais j'ai adapté CETTE réponse de code javascript en C #. J'espère que ça aide
la source
List <T> .Remove () et List <T> .RemoveAt () ne renvoient pas l'élément en cours de suppression.
Par conséquent, vous devez utiliser ceci:
la source
Insérez l'élément actuellement dans lequel
oldIndex
se trouvernewIndex
, puis supprimez l'instance d'origine.Vous devez tenir compte du fait que l'index de l'élément que vous souhaitez supprimer peut changer en raison de l'insertion.
la source
J'ai créé une méthode d'extension pour déplacer des éléments dans une liste.
Un index ne doit pas changer si nous déplaçons un élément existant car nous déplaçons un élément vers une position d'index existante dans la liste.
Le cas de bord auquel @Oliver fait référence ci-dessous (déplacer un élément à la fin de la liste) entraînerait en fait l'échec des tests, mais c'est par conception. Pour insérer un nouvel élément à la fin de la liste, nous appellerions simplement
List<T>.Add
.list.Move(predicate, list.Count)
devrait échouer car cette position d'index n'existe pas avant le déplacement.Dans tous les cas, j'ai créé deux méthodes d'extension supplémentaires,
MoveToEnd
etMoveToBeginning
dont la source peut être trouvée ici .la source
Ensure.Argument
défini?List<T>
vous pouvez appelerInsert(list.Count, element)
pour placer quelque chose à la fin de la liste. Donc, vousWhen_new_index_is_higher
devriez appelerlist.Move(x => x == 3, 5)
qui échoue.List<T>
je voudrais simplement appeler.Add
pour insérer un nouvel élément à la fin d'une liste. Lors du déplacement d' éléments individuels, nous n'augmentons jamais la taille d'origine de l'index car nous ne supprimons qu'un seul élément et le réinsérons. Si vous cliquez sur le lien dans ma réponse, vous trouverez le code pourEnsure.Argument
.Je m'attendrais soit:
... ou:
... ferait l'affaire, mais je n'ai pas de VS sur cette machine à vérifier.
la source
newIndex
si c'est aprèsoldIndex
.Manière la plus simple:
ÉDITER
La question n'est pas très claire ... Comme nous ne nous soucions pas de savoir où
list[newIndex]
va l' élément, je pense que la façon la plus simple de le faire est la suivante (avec ou sans méthode d'extension):Cette solution est la plus rapide car elle n'implique pas d'insertion / suppression de liste.
la source
Est-ce que les gars plus simples font juste ça
Faites la même chose avec MoveDown mais modifiez le if pour "if (ind! = Concepts.Count ())" et Concepts.Insert (ind + 1, item.ToString ());
la source
C'est ainsi que j'ai implémenté une méthode d'extension d'élément de déplacement. Il gère assez bien les mouvements avant / après et aux extrêmes pour les éléments.
la source