Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 找到已更新对象的快速方法_C#_.net - Fatal编程技术网

C# 找到已更新对象的快速方法

C# 找到已更新对象的快速方法,c#,.net,C#,.net,我在应用程序启动时从数据库反序列化对象,然后在应用程序生命周期内用户可以更新对象,最后对象作为xml字符串序列化回数据库。除了比较初始字符串和最终字符串外,还有什么方法可以确定对象是否已更新 我知道可以使用: 方法,但请注意“不同的字符串可以返回相同的哈希代码” 如中所做的MD5哈希。虽然我不知道不同的字符串是否可以返回相同的MD5哈希 我知道我的xml总是小于100KB。实现IPropertyChanged,并跟踪对象是否脏。哈希代码永远都不可能是唯一的,除非它比所有输入字符串都长。如果使用哈

我在应用程序启动时从数据库反序列化对象,然后在应用程序生命周期内用户可以更新对象,最后对象作为xml字符串序列化回数据库。除了比较初始字符串和最终字符串外,还有什么方法可以确定对象是否已更新

我知道可以使用:

  • 方法,但请注意“不同的字符串可以返回相同的哈希代码”

  • 如中所做的MD5哈希。虽然我不知道不同的字符串是否可以返回相同的MD5哈希


  • 我知道我的xml总是小于100KB。

    实现
    IPropertyChanged
    ,并跟踪对象是否脏。

    哈希代码永远都不可能是唯一的,除非它比所有输入字符串都长。如果使用哈希代码路径,您可以执行与.Net framework类似的操作来加速相等比较:检查对象的
    GetHashCode
    结果。如果它们相等,请选中
    等于
    。如果它们仍然相等,那么考虑它们不变。这很容易实现,但不是最快的。当您完成此操作后,请分析并查看是否确实需要更快的方法。序列化和电汇可能比相等比较慢得多,因此您可能正在尝试优化不是瓶颈的内容。如果结果表明您需要更快的方法,您可以查看Sam建议的答案(手动更改跟踪)。另外,.Net实体框架内置了这种更改跟踪功能。您可以研究使用它而不是自定义数据访问代码。@MerlynMorgan Graham#1:比较字符串哈希代码实际上比直接比较要慢,除非您可以预先计算哈希代码进行多次比较。它们都涉及到对字符的迭代。@SLaks:是的,真的。如果OP要比较最后的字符串,他应该只使用
    Equals
    (在这个场景中),而不必进行任何哈希运算。但我的意思是获取对象树的哈希代码,而不是序列化表示。我想我没有说清楚:)另外,EF不直接支持XML序列化,所以这个解决方案可能对OP没有帮助,除非他们可以从一开始就摆脱整个XML。或者至少是一个私有属性,其他属性设置程序可以在对象更新时调整它。这使您可以灵活地决定不改变属性值的更新在应用程序中是否重要