有效地修改Observable Collection元素

时间:2014-12-25 14:06:38

标签: c# observablecollection

基本上我在我的类中有一个Observable Collection和一个静态整数,跟踪集合中有多少元素。集合中的每个元素都有一个唯一的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);
}

但是,我无法帮助,但想象一下这是一种更有效的方法。我知道Observable Collection对于这种应用程序来说不是一个合适的选择,但事实是元素绑定到ListView,所以我不能使用任何其他类型的泛型集合。

2 个答案:

答案 0 :(得分:1)

这是你想要的吗?

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

答案 1 :(得分:0)

立即获取所有匹配,然后减去其中一个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);