28

通过阅读MSDN 上的 ObservableCollection.Move(int oldIndex, int newIndex)的文档,我似乎无法弄清楚这一点:

oldIndex 类型:System.Int32 从零开始的索引,指定要移动的项目的位置。newIndex 类型:System.Int32 从零开始的索引,指定项目的新位置。

我不明白它是如何工作的。带有 的项目会发生什么newIndex?我的假设是每个项目的索引都会index >= newIndex递减。这个假设正确吗?更重要的是,这种行为是否在 MSDN 上的某处进行了解释或描述?

4

3 回答 3

42

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);
}
于 2012-05-06T14:33:11.710 回答
4

我会去简单的解释:

对象被移动到指定的位置,然后集合中的所有对象都从零开始重新索引。

于 2012-05-06T14:22:56.783 回答
0

除了@nemesv的出色回答之外,帮助我记住这种行为的是:myObservableCollection.Move(oldIndex, newIndex)

var movedItem = myObservableCollection[oldIndex];
myObservableCollection.RemoveAt(oldIndex);
myObservableCollection.Insert(newIndex, movedItem);
于 2018-07-11T10:41:03.483 回答