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