复制列表中的更改
Replicating changes in a list
假设我有一个项目列表:
- A
- B
- C
现在服务器从某个地方告诉我的应用程序元素 B
已被删除,但它只提供整个新列表,而不是确切的更改详细信息。
由于 WinRT ListView
s 会自动添加、删除和移动其中的项目,我宁愿不刷新后备列表并调用 Reset-INotifyCollectionChanged
-事件,因为这会使每个项目看起来更像动画生硬而粗糙。
相反,我想计算将本地列表转换为从服务器获取的列表所需的步骤。 (有点像 levenshtein 距离,只是不计算步数,而是计算步数本身)
e。 g.:
1. Delete element B
2. Add new element D to position 3
我该怎么做?
编辑:就我而言,订单 很重要 。
在初始列表中查找接收列表中不存在的元素:删除它们。
在接收列表中查找初始列表中不存在的元素:添加它们。
编辑:查看 this codeproject resource,显示差异算法。
根据@MihaiCaracostea 建议的页面标题,我能够找到适用于任何 IList<T>
的工作差异算法。它甚至在您枚举更改时使用 yield
来懒惰地计算差异。
文章可以找到here, the actual source code (if you don't want to read how it's done) is here。
不过请注意,该算法的运行时间为 O(n²)。这方面肯定还有改进的余地。
假设我有一个项目列表:
- A - B - C
现在服务器从某个地方告诉我的应用程序元素 B
已被删除,但它只提供整个新列表,而不是确切的更改详细信息。
由于 WinRT ListView
s 会自动添加、删除和移动其中的项目,我宁愿不刷新后备列表并调用 Reset-INotifyCollectionChanged
-事件,因为这会使每个项目看起来更像动画生硬而粗糙。
相反,我想计算将本地列表转换为从服务器获取的列表所需的步骤。 (有点像 levenshtein 距离,只是不计算步数,而是计算步数本身)
e。 g.:
1. Delete element B 2. Add new element D to position 3
我该怎么做?
编辑:就我而言,订单 很重要 。
在初始列表中查找接收列表中不存在的元素:删除它们。
在接收列表中查找初始列表中不存在的元素:添加它们。
编辑:查看 this codeproject resource,显示差异算法。
根据@MihaiCaracostea 建议的页面标题,我能够找到适用于任何 IList<T>
的工作差异算法。它甚至在您枚举更改时使用 yield
来懒惰地计算差异。
文章可以找到here, the actual source code (if you don't want to read how it's done) is here。
不过请注意,该算法的运行时间为 O(n²)。这方面肯定还有改进的余地。