Действительно Перечисляет <T> порядок вставки гарантии?

Вот ссылка на файл JDK 5 zip. sun-jdk-5-win32-x86-1.5.0.12.zip

225
задан Community 23 May 2017 в 01:46
поделиться

4 ответа

Класс List <> действительно гарантирует упорядочение - вещи будут сохраняться в списке в том порядке, в котором вы их добавляете, включая дубликаты, если вы явно не отсортируете список.

Согласно MSDN:

... Список "Представляет строго типизированный список объектов, которые могут быть доступ по индексу . "

Значения индекса должны оставаться надежными, чтобы это было точным. Следовательно, порядок гарантирован.

Вы можете получить странные результаты от вашего кода, если вы перемещаете элемент позже в списке, так как ваш Remove () переместит все остальные элементы на одну позицию вниз перед вызовом Insert () .

Можете ли вы сжать свой код на что-нибудь достаточно маленькое, чтобы отправить сообщение?

292
ответ дан 23 November 2019 в 03:55
поделиться

Как сказал Беван, но имейте в виду, что индекс-список основан на 0. Если вы хотите переместить элемент в начало списка, вы должны вставить его в индекс 0 (а не 1, как показано в вашем примере).

9
ответ дан 23 November 2019 в 03:55
поделиться

Это код, который у меня есть для перемещения элемента на одну позицию вниз в списке:

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 , поэтому он должен веди себя так же. Это помогает?

Конечно, первый работает, только если выбранный элемент не является последним элементом в списке, а второй - если выбранный элемент не является первым элементом.

1
ответ дан 23 November 2019 в 03:55
поделиться

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.

34
ответ дан 23 November 2019 в 03:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: