Скажем, у меня есть 3 строки в списке (например, «1», «2», «3»).
Затем я хочу изменить их порядок, чтобы поместить «2» в положение 1 (например, «2», «1», «3»).
Я использую этот код (установка indexToMoveTo в 1):
listInstance.Remove(itemToMove);
listInstance.Insert(indexToMoveTo, itemToMove);
Кажется, это работает, но я иногда получаю странные результаты; иногда порядок неправильный или элементы из списка удаляются!
Любые идеи? List<T>
Гарантирует ли заказ?
Связанный:
Гарантирует ли List <T>, что предметы будут возвращены в порядке их добавления?
c#
.net
collections
SuperSuperDev1234
источник
источник
Ответы:
List<>
Класс делает гарантийный заказ - вещи будут сохранены в списке в порядке их добавления, включая дубликаты, если вы явно сортировки списка.По данным MSDN:
Значения индекса должны оставаться надежными, чтобы это было точным. Поэтому заказ гарантирован.
Возможно, вы получите странные результаты из своего кода, если будете перемещать элемент позже в списке, поскольку
Remove()
все остальные элементы будут перемещены вниз на одно место перед вызовомInsert()
.Можете ли вы свести свой код к чему-то достаточно маленькому для публикации?
источник
List
в любом хорошем учебнике по информатике. Точно так же, какQueue
иStack
, aList
является четко определенной, предсказуемой и хорошо понятной структурой данных - если реализация .NET будет отличаться (или если она изменится), много программного обеспечения сломаетсяWhere()
метод LINQ для фильтрации списка, вы полагаетесь на реализацию, чтобы рассмотреть элементы в последовательности по порядку. Бывает, что так и есть (см. Referenceource.microsoft.com/System.Core/System/Linq/… ), но это не задокументировано в MSDN. Я бы посоветовал использоватьemp.LastOrDefault(x => x.empDept = 'abc')
в качестве документацииLastOrDefault()
, указывающей, что он поддерживает порядок предметов.Вот 4 пункта, с их индексом
Вы хотите переместить K между A и E - вы можете подумать о позиции 3. Вы должны быть осторожны с индексированием здесь, потому что после удаления все индексы обновляются.
Таким образом, вы сначала удаляете элемент 0, оставляя
Затем вы вставляете в 3
Чтобы получить правильный результат, вы должны были использовать индекс 2. Чтобы все было согласованно, вам нужно отправить в (indexToMoveTo-1)
if indexToMoveTo > indexToMove
, например,Это может быть связано с вашей проблемой. Обратите внимание, мой код не проверен!
РЕДАКТИРОВАТЬ : В качестве альтернативы, вы могли бы
Sort
с пользовательским Comparer (IComparer
), если это применимо к вашей ситуации.источник
Как сказал Беван, но имейте в виду, что индекс списка основан на 0. Если вы хотите переместить элемент в начало списка, вы должны вставить его с индексом 0 (не 1, как показано в вашем примере).
источник
Вот код, который у меня есть для перемещения элемента на одно место в списке:
и это для перемещения на одно место вверх:
folderImages
этоListBox
, конечно , так что список являетсяListBox.ObjectCollection
, а неList<T>
, но он наследует отIList
так он должен вести себя так же. Это помогает?Конечно, первый работает, только если выбранный элемент не является последним элементом в списке, и последний, если выбранный элемент не является первым элементом.
источник
Если вы измените порядок операций, вы избежите странного поведения: сначала вставьте значение в нужное место в списке, а затем удалите его с первой позиции. Убедитесь, что вы удалили его по его индексу, потому что если вы удалите его по ссылке, вы можете удалить их обоих ...
источник