有效地修改可观察集合元素

本文关键字:集合 元素 观察 修改 有效地 | 更新日期: 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);