C# - 确定List <T>是否脏了?

djd*_*d87 4 c# hash compact-framework generic-list c#-2.0

我正在序列化作为我的数据实体的类的列表.我有一个包含List的DataProvider.

我总是直接修改集合中的项目.

确定列表中的任何项目是否已更改的最佳方法是什么?我正在使用Compact Framework.

我当前唯一的想法是在加载列表时创建List的哈希值(如果可能的话).然后,当我进行保存时,我重新获取列表的哈希值,看看它们是否是不同的值.如果它们不同,我保存然后更新存储的Hash以便稍后进行比较,如果它们是相同的则我不保存.

有任何想法吗?

ang*_*son 9

如果添加到列表中的项目实现了INotifyPropertyChanged接口,则可以构建自己的通用列表,该列表将该事件挂接到您添加到列表中的所有对象的该接口中,并在从列表中删除项目时取消挂起事件.

BindingList<T>您可以使用框架中的类,或者您可以编写自己的类.

这是一个示例add方法,假设已声明类型where T: INotifyPropertyChanged:

public void Add(T item)
{
    // null-check omitted for simplicity
    item.PropertyChanged += ItemPropertyChanged;
    _List.Add(item);
}
Run Code Online (Sandbox Code Playgroud)

this[index]索引器属性:

public T this[Int32 index]
{
    get { return _List[index]; }
    set {
        T oldItem = _List[index];
        _List[index] = value;
        if (oldItem != value)
        {
            if (oldItem != null)
                oldItem.PropertyChanged -= ItemPropertyChanged;
            if (value != null)
                value.PropertyChanged += ItemPropertyChanged;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您的项目不支持INotifyPropertyChanged,但它们是您的课程,我会考虑添加该支持.