C# 如何扩展对象列表以根据列表中的位置自动更新属性

C# 如何扩展对象列表以根据列表中的位置自动更新属性,c#,asp.net,C#,Asp.net,假设我有一辆像这样的高级轿车: class car { string model; int position; } Position是一个从1到n的数字,它基本上反映了列表中的位置。 如果我有两辆车在列表中,他们将有位置1 2。 现在,我想在UI中对列表中的汽车重新排序,并反映属性中的更改以供以后使用。 所以我有一张有几行的桌子: Car1 1 Car2 2 Car3 3 Car4 4 现在,如果我想重新排序项目,我可以拖动Car4并将其放置在位置2

假设我有一辆像这样的高级轿车:

class car 
{
string model;
int position;
}   
Position是一个从1到n的数字,它基本上反映了列表中的位置。 如果我有两辆车在列表中,他们将有位置1 2。 现在,我想在UI中对列表中的汽车重新排序,并反映属性中的更改以供以后使用。
所以我有一张有几行的桌子:

Car1  1  
Car2  2     
Car3  3   
Car4  4   
现在,如果我想重新排序项目,我可以拖动Car4并将其放置在位置2(在Car1之后)。
因此,我的立场如下:

Car1  1  
Car4  2     
Car2  3   
Car3  4    

因此,我想做的是更新列表中的一个项目,所有其他项目将自动更新。

在这种情况下,最好的方法是根本不存储位置,而是暗示它。保留
model
属性,并放下
位置
。每当需要位置或所有元素与其位置配对的列表时,可以使用LINQ的
Select
重载来获取索引:

var carsWithIndex = carList.Select((car, index) => new {
    Car = car
,   Index = index
}).ToList();
现在,您有了一个具有两个属性的对象列表:

  • Car
    -列表中的
    Car
    元素,以及
  • 索引
    -在
    carList
    中对应的
    汽车
    的索引

您可以随意重新订购
carList
的元素;每次重新订购时,隐含索引都会发生变化。每次需要索引时,运行上面的LINQ表达式,将每辆车与其新索引配对。

我猜是这样的:

BindingList<car> list = new BindingList<car>();
list.ListChanged += new ListChangedEventHandler(list_ListChanged);

void list_ListChanged(object sender, ListChangedEventArgs e)
        {
            list[e.OldIndex].position = e.NewIndex;
            for (int i = e.NewIndex; i < list.Count; i++)
            {
                list[i].position = i+1;
            }
        }
BindingList=newbindingList();
list.ListChanged+=新的listchangedventhadler(list\u ListChanged);
无效列表\u ListChanged(对象发送方,ListChangedEventArgs e)
{
列表[e.OldIndex].position=e.NewIndex;
for(int i=e.NewIndex;i