C#,DragDrop重排序算法

C#,DragDrop重排序算法,c#,datagridview,drag-and-drop,C#,Datagridview,Drag And Drop,我在C#中有一个对象列表,它有一个名为“Sequence”的属性。然后将该列表绑定到DataGridView,并按此顺序排序 用户可以拖放行-因此,如果我们有如下内容: Name,Sequence Test1,1 Test2,2 Test3,3 Test4,4 Test5,5 Name,Sequence Test2,1 Test3,2 Test1,3 Test4,4 Test5,5 将“Test1”拖动到“Test3”和“Test4”之间应修改任何影响的顺序,使其如下所示:

我在C#中有一个对象列表,它有一个名为“Sequence”的属性。然后将该列表绑定到DataGridView,并按此顺序排序

用户可以拖放行-因此,如果我们有如下内容:

Name,Sequence 
Test1,1 
Test2,2
Test3,3 
Test4,4 
Test5,5
Name,Sequence 
Test2,1 
Test3,2
Test1,3 
Test4,4 
Test5,5
将“Test1”拖动到“Test3”和“Test4”之间应修改任何影响的顺序,使其如下所示:

Name,Sequence 
Test1,1 
Test2,2
Test3,3 
Test4,4 
Test5,5
Name,Sequence 
Test2,1 
Test3,2
Test1,3 
Test4,4 
Test5,5
当他们拖放一行时,我不太明白用什么算法来更新列表。一种简单的方法是遍历网格中的所有行,并将序列更新为行索引+1,但我认为这会增加一些开销

但我认为这会增加一些开销

非常非常少


而且它的好处是不需要任何魔法。

看看是否可以避免将
序列
存储在对象中,否则它总是会失去顺序。在容器中枚举时,可以将对象与其序列配对以供下游使用:

class MyData {
    string Name {get; set;}
}
class DataWithSequence {
    MyData Data {get;set;}
    int Sequence{get;set;}
}
...
IList<MyData> list = new List<MyData>();
IEnumerable<DataWithSequence> GetData() {
    return list.Select((d,i)=> new DataWithSequence {Data=d, Sequence=i+1});
}
类MyData{
字符串名称{get;set;}
}
类DataWithSequence{
MyData数据{get;set;}
int序列{get;set;}
}
...
IList list=新列表();
IEnumerable GetData(){
返回列表。选择((d,i)=>newdatawithsequence{Data=d,Sequence=i+1});
}

删除后,只需更新序列即可