Вопрос по c#, .net – Как работает ObservableCollection <T> .Move (int, int)?

22

Я не могу понять это, прочитавдокументация для ObservableCollection.Move (int oldIndex, int newIndex) на MSDN:

oldIndex Type: System.Int32 The zero-based index specifying the location of the item to be moved. newIndex Type: System.Int32 The zero-based index specifying the new location of the item.

Я не понимаю, как это работает. Что происходит с предметом сnewIndex? Я предполагаю, что индекс каждого элемента сindex >= newIndex уменьшается. Это предположение верно? И что более важно, это поведение объяснено или описано где-то на MSDN?

Ваш Ответ

3   ответа
4

Объект перемещается в указанную позицию, а затем все объекты в коллекции переиндексируются с нуля и выше.

Я думаю, что единственное, что действительно хорошо объясняет это, - это комментарий Лудо выше.
Я не уверен, почему за это проголосовали. Два других ответа ясно показывают, чтоcorrect простое объяснение заключается в том, что элемент удаляется, а затем вставляется обратно.
Очевидно, что элемент удален и вставлен обратно, что не требует сложной демонстрации / модульного тестирования. Автор спрашивал про индексы. Мой ответ, хотя и не выбранный, нацелен на этот аспект.
30

Move в форме модульного теста:

[Test]
public void ObservableTest()
{
    var observable = new ObservableCollection<string> { "A", "B", "C", "D", "E" }; 

    observable.Move(1, 3); // oldIndex < newIndex 
    // Move "B" to "D"'s place: "C" and "D" are shifted left
    CollectionAssert.AreEqual(new[] { "A", "C", "D", "B", "E" }, observable);

    observable.Move(3, 1); // oldIndex > newIndex 
    // Move "B" to "C"'s place: "C" and "D" are shifted right
    CollectionAssert.AreEqual(new[] { "A", "B", "C", "D", "E" }, observable);

    observable.Move(1, 1); // oldIndex = newIndex
    // Move "B" to "B"'s place: "nothing" happens
    CollectionAssert.AreEqual(new[] { "A", "B", "C", "D", "E" }, observable);
}
0

ответ из@nemesv что помогает мне вспомнить поведение в том, чтоmyObservableCollection.Move(oldIndex, newIndex) эквивалентно:

var movedItem = myObservableCollection[oldIndex];
myObservableCollection.RemoveAt(oldIndex);
myObservableCollection.Insert(newIndex, movedItem);

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