【问题标题】:collection snapshot for IsDirty comparisonIsDirty 比较的集合快照
【发布时间】:2011-04-03 22:20:05
【问题描述】:

有什么好的(快速、高效等)方法来存储集合快照以供后续 IsDirty 检查?

干杯,
浆果

【问题讨论】:

    标签: c# wpf silverlight editing


    【解决方案1】:

    这取决于你想要什么。

    • 要创建集合的快照,您只需致电 IEnumerable<T>.ToList
    • 如果您还想为列表和列表中的每个对象创建快照,那么您还需要为每个对象制作单独的副本。如何最好地制作副本取决于您收藏的特定类型。某些类型具有克隆方法。对于其他人,您可以调用构造函数。有些类型不能轻易复制。

    例子:

    List<Foo> snapshot = foos.Select(x => new Foo(x)).ToList();
    

    要检查两个IEnumerable&lt;T&gt;s 是否相等(即检查没有更改),您可以使用SequenceEqual。如果您的类没有以您需要的方式实现 Equals,您还需要指定 IEqualityComparer

    如果您想有一种有效的方法从其 id 字段中找到快照中的 特定 项,那么您可以使用 Dictionary&lt;K, V&gt; 而不是列表。致电 IEnumerable&lt;T&gt;.ToDictionary 从您的收藏中创建字典。

    【讨论】:

      【解决方案2】:

      如果您只想保存快照并检查列表大小是否发生变化(添加/删除项目)

      var snapshot = new List<Foo>(list);
      

      但是,如果您要更改列出的项目并想要检查项目是否已更改,则必须克隆每个项目。如果您只是将它们塞入另一个列表,则引用应该保持不变。

      var snapshot = list.Select(item => new Foo 
                                        { 
                                            Property1 = item.Property1,
                                            ... , 
                                            PropertyN = item.PropertyN 
                                         });
      

      如果您只想查看列表的数量是否发生变化,您可以使用第一个版本。

      也许你的对象上有一个标识符,它可以简化类似的解决方案

      var snapshot = list.Select(item => item.Id);
      

      ID 列表可用于查看内容是否更改。如果您的对象的内存使用量也很大,这种模式也会有所帮助。

      但是,您可以使用ObservableCollection&lt;T&gt;,其中包含通知您更改的事件。这样您就可以跟踪对集合的所有更改(添加/删除/替换)。

      【讨论】:

        【解决方案3】:

        您是要检查集合还是每个成员?

        一种方法是使用ObservableCollection&lt;T&gt;。您可以订阅每次修改集合时引发的事件。事件参数表示项目和更改的类型。

        【讨论】:

        • 集合,作为默认解决方案。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-13
        • 1970-01-01
        相关资源
        最近更新 更多