Как переместить объект списка в конец списка, перемещая остальные?

Прежде всего, я должен сказать, что провел весь день в поисках ответа, прежде чем разместить этот вопрос здесь. Ближайший ответ, который я получаю, это здесь, но некоторые ответы мне не подошли, а другие слишком сложны для понимания. Позвольте мне четко объяснить, чего я хочу достичь: для простоты давайте представим, что у меня есть список, состоящий из «6» объектов. Я случайным образом выбираю индекс в списке, скажем, myList[index=2]. Затем я хочу, чтобы этот объект находился в конце списка, что означает, что его значение индекса теперь равно 5. Также я хочу переупорядочить нетронутые объекты, чтобы получить тот же размер списка без пустого значения индекса. После всех этих шагов должно получиться так:

Как переместить объект списка в конец списка, перемещая остальные?

На данный момент мой код таков:

 public static void Move<T>(this List<T> list, int oldIndex, int newIndex)
 {
     if ((oldIndex == newIndex) || (0 > oldIndex) || (oldIndex >= list.Count) || (0 > newIndex) ||
         (newIndex >= list.Count)) return;
     // local variables
     var i = 0;
     T tmp = list[oldIndex];
     for (i = oldIndex+1; i < newIndex; i++)
     {
         list[i] = list[i - 1];
     }        
     list[newIndex] = tmp;
 }  

Однако, как вы можете предсказать, это не работает. Debug.DrawLine для игровых объектов в этом списке показывает мне, когда я перемещаю элементы по списку с помощью моего кода, оставляющего мне два объекта: один myList[0] и один myList[5], которые я добавил. Другие линии исчезают после.

Звуки LinkedList<T> могут вам помочь... например, у вас есть 1 2 3 4 5, а затем вы получаете 3, поэтому следующий порядок должен быть 1 2 4 5 3?

Johnny 09.04.2019 22:28

Я думаю, вы хотите + 1 вместо - 1, и oldIndex вместо oldIndex+1, и i < newIndex - 1 вместо i < newIndex. Но это работает только тогда, когда newIndex > oldIndex. если это наоборот, чем код, который у вас есть, будет более точным.

BlueMonkMN 09.04.2019 22:33

Просто чтобы уточнить, вы хотите создать метод, который извлекает объект по заданному индексу, а затем добавляет его в конец вашего списка? Или извлекает объект по заданному индексу, а затем добавляет его по другому указанному индексу?

SharpNip 09.04.2019 22:35

@SharpNip это первое. Когда я вызываю этот метод, я всегда даю newIndex (list.Count-1), поэтому он идет в конец моего списка.

Ahmet Bugra 09.04.2019 22:39

Что ж, вы уже сохранили копию из «oldIndex» в переменную «tmp», поэтому я думаю, что вы просто хотите «list.RemoveAt (oldIndex)», а затем «list.Add (tmp)», чтобы добавить его в конец. Может я что-то упускаю...

user1074069 09.04.2019 22:41

@Джонни, если твои числа представляют мои объекты, то да. Я хочу взять третий объект и сделать его последним в моем списке, чтобы его индекс был теперь (list.count -1 = 4), в то время как объект 1 имеет индекс 0, объект 2 имеет индекс 1, объект 4 имеет индекс 2, объект 5 имеет индекс 3.

Ahmet Bugra 09.04.2019 22:42
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
6
86
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы слишком много думаете об этом.

var value = list[index];
list.RemoveAt(index);
list.Add(value);

Я бы просто добавил if (oldIndex >= list.Count) return; прямо перед этим.

SharpNip 09.04.2019 22:46

@SharpNip индекс в списке никогда не будет >= list.Count .. Я думаю, вы упомянули if (index == list.Count - 1) return;. В других случаях, когда указан неверный индекс, я бы всегда предпочел выдать ошибку/исключение, чтобы правильно отладить, почему был предоставлен даже неправильный индекс, чем скрыть этот факт, просто вернув его;)

derHugo 10.04.2019 07:18

Прошу прощения за дублированный пост. Я пробовал это решение раньше, но я не мог заставить его работать. Должно быть, что-то пропустил. Спасибо всем за ответы.

Ahmet Bugra 10.04.2019 10:42

@derHugo, переданный индекс не из «списка», он передается как параметр метода, поэтому нежелательно выполнять какое-либо выполнение, если переданный индекс больше, чем количество элементов в списке. список. Кроме того, if (index == list.Count - 1) вызовет исключение, если индекс, переданный методу, является последним объектом в списке или выше, и, учитывая исходный код, это не то, что нужно.

SharpNip 10.04.2019 15:13

@SharpNip Думаю, ты не совсем понял мою мысль. 1. Вы можете вернуться на if (index == list.Count - 1), потому что тогда это уже является последний элемент в списке, поэтому делать нечего. 2. Представленный здесь ответ даже не требует этого параметра oldindex, поскольку ему нужен только один текущий index элемента, который затем перемещается в конец. 3. Как я объяснил, я бы не просто возвращался в случае недопустимого ввода, а скорее хотел бы, чтобы было выдано исключение/ошибка, чтобы правильно выяснить, что я сделал неправильно, вместо того, чтобы запутывать это, просто возвращаясь без какой-либо обратной связи.

derHugo 10.04.2019 16:29

@derHugo Прости. Я был неправ, ты был прав.

SharpNip 10.04.2019 16:36

Другие вопросы по теме