有效地修改可观察集合元素
本文关键字:集合 元素 观察 修改 有效地 | 更新日期: 2023-09-27 18:35:26
>基本上,我的类中有一个可观察集合和一个静态整数,用于跟踪集合中有多少元素。集合中的每个元素都有一个唯一的 ID,从 1 到元素总数。
我想做的是,取出一个带有随机 ID 的元素,然后相应地更改后续元素的 ID,以便 ID 从 1 连续运行到元素总数。因此,例如,如果我有 5 个元素并且我删除了 ID 号为 3 的元素,那么我需要一些代码来修改 ID 为 4 的元素的 ID 属性并将其更改为 3,并修改 ID 为 5 的元素的 ID 属性并将其更改为 4,因此所有 ID 都按顺序排列,没有间隙。
我想做这样的事情:
var matches = MyObject.MyCollection.Where((myobject) => myobject.UniqueId.Equals(ID_value_of_removed_item_plus_one))
foreach (MyDataType CollectionItem in matches)
{
MyDataType CollectionItemCopy = ColectionItem
CollectionItemCopy.UniqueId--;
MyCollection.Remove(CollectionItem);
MyCollection.Add(CollectionItemCopy);
}
但我忍不住想象有一种更有效的方法可以做到这一点。我知道可观察集合不是这种应用程序的合适选择,但问题是元素绑定到 ListView,所以我不能使用任何其他类型的泛型集合。
这是你想要的吗?
class Entity
{
public int Id { get; set; }
public string Name { get; set; }
}
var collection = new ObservableCollection<Entity>
{
new Entity { Id = 1, Name = "Apple" },
new Entity { Id = 2, Name = "Peach" },
new Entity { Id = 3, Name = "Plum" },
new Entity { Id = 4, Name = "Grape" },
new Entity { Id = 5, Name = "Orange" },
};
collection.CollectionChanged += (sender, args) =>
{
if (args.Action == NotifyCollectionChangedAction.Remove || args.Action == NotifyCollectionChangedAction.Replace)
{
for (var i = args.OldStartingIndex; i < collection.Count; i++)
{
collection[i].Id--;
}
}
};
collection.RemoveAt(2); // Grape.Id == 3, Orange.Id == 4
只需一次获取所有匹配项,然后减去其中一个 ID。无需删除并再次添加它,因为您只是添加和删除相同的项目。最后,删除原始项目。
var matches = MyObject.MyCollection.Where(myobject => myobject.UniqueId >= ID_value_of_removed_item_plus_one);
foreach (MyDataType CollectionItem in matches)
{
CollectionItem.UniqueId--;
}
MyCollection.Remove(itemToDelete);