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

标签 c# compact-framework c#-2.0 hash generic-list

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

我总是直接在集合中修改项目。

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

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

有什么想法吗?

最佳答案

如果您添加到列表中的项目实现了 INotifyPropertyChanged 接口(interface),您可以构建自己的通用列表,为您添加到列表中的所有对象 Hook 该接口(interface)中的事件,并在从列表中删除项目时取消 Hook 事件。

有一个 BindingList<T> 您可以使用框架中的类,也可以编写自己的类。

这是一个示例添加方法,假设已使用 where T: INotifyPropertyChanged 声明了类型:

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

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;
        }
    }
}

如果您的项目不支持 INotifyPropertyChanged ,但它们是您的类(class),我会考虑添加该支持。

关于C# - 确定 List<T> 是否脏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/892020/

相关文章:

c# - 为什么我在 C# 中的计算比 Python 快得多

C# 任务调用同一实例

c# - .NET CF 2.0 : Stream implements IDisposable . .. 怎么样?

c# - LINQ to Dataset 是 LINQ to EF 的子集还是这两者是独立的?

c# - 没有服务定位器的工厂模式

c# - P/调用 CreateToolhelp32Snapshot 在 Compact Framework 中失败

c# - Windows Mobile - 2 路通话录音 (C#)

c# - 特性信息有什么优势?

c# - YouTube C# .NET API : Uploading video and getting events when finished

collections - C# 中的 IComparer<> 和类继承