Вот ссылка на файл JDK 5 zip. sun-jdk-5-win32-x86-1.5.0.12.zip
Класс List <>
действительно гарантирует упорядочение - вещи будут сохраняться в списке в том порядке, в котором вы их добавляете, включая дубликаты, если вы явно не отсортируете список.
Согласно MSDN:
... Список "Представляет строго типизированный список объектов, которые могут быть доступ по индексу . "
Значения индекса должны оставаться надежными, чтобы это было точным. Следовательно, порядок гарантирован.
Вы можете получить странные результаты от вашего кода, если вы перемещаете элемент позже в списке, так как ваш Remove ()
переместит все остальные элементы на одну позицию вниз перед вызовом Insert ()
.
Можете ли вы сжать свой код на что-нибудь достаточно маленькое, чтобы отправить сообщение?
Как сказал Беван, но имейте в виду, что индекс-список основан на 0. Если вы хотите переместить элемент в начало списка, вы должны вставить его в индекс 0 (а не 1, как показано в вашем примере).
Это код, который у меня есть для перемещения элемента на одну позицию вниз в списке:
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;
}
и для перемещения его на одну позицию вверх:
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
- это ] ListBox
, конечно, поэтому список является ListBox.ObjectCollection
, а не List
, но он наследуется от IList
, поэтому он должен веди себя так же. Это помогает?
Конечно, первый работает, только если выбранный элемент не является последним элементом в списке, а второй - если выбранный элемент не является первым элементом.
Here are 4 items, with their index
0 1 2 3
K C A E
You want to move K to between A and E -- you might think position 3. You have be careful about your indexing here, because after the remove, all the indexes get updated.
So you remove item 0 first, leaving
0 1 2
C A E
Then you insert at 3
0 1 2 3
C A E K
To get the correct result, you should have used index 2. To make things consistent, you will need to send to (indexToMoveTo-1) if indexToMoveTo > indexToMove
, e.g.
bool moveUp = (listInstance.IndexOf(itemToMoveTo) > indexToMove);
listInstance.Remove(itemToMove);
listInstance.Insert(indexToMoveTo, moveUp ? (itemToMoveTo - 1) : itemToMoveTo);
This may be related to your problem. Note my code is untested!
EDIT: Alternatively, you could Sort
with a custom comparer (IComparer
) if that's applicable to your situation.