【问题标题】:Replicating changes in a list复制列表中的更改
【发布时间】:2015-09-09 21:29:44
【问题描述】:

假设我有一个项目列表:

- 一种 -乙 - C

现在服务器从某个地方告诉我的应用程序元素 B 已被删除,但它只提供整个新列表,而不是确切的更改细节。 由于 WinRT ListViews 自动为其中的项目添加、删除和移动设置动画,我不希望刷新支持列表并调用 Reset-INotifyCollectionChanged-事件,因为这会使每个项目看起来相当生硬和粗糙。 相反,我想计算将本地列表转换为从服务器获取的列表所需的步骤。 (有点像 levenshtein 距离,只是不是步数,而是步数本身)

e。 g.:

1.删​​除元素B 2.将新元素D添加到位置3

我该怎么做?

编辑:在我的情况下订购事项

【问题讨论】:

标签: c# list diff array-difference inotifycollectionchanged


【解决方案1】:

根据@MihaiCaracostea 建议的页面标题,我能够找到适用于任何IList<T> 的有效差异算法。它甚至使用yield 在您枚举更改时懒惰地计算差异。

文章可以找到here,实际源码(如果你不想看它是怎么做的)是here

但请注意,该算法在 O(n²) 时间内运行。这方面肯定有改进的余地。

【讨论】:

  • @MihaiCaracostea 是的,现在是问题和答案都值得投票的时刻 :)
  • 我目前正在将所有代码(包括将一个列表转换为另一个列表的其他方法)放入 NuGet 库。完成后我会在此处发布链接。
【解决方案2】:

在初始列表中查找接收列表中不存在的元素:删除它们。

在接收列表中查找初始列表中不存在的元素:添加它们。

编辑:看看this codeproject resource,显示了一个差异算法。

【讨论】:

  • 订单对我来说很重要。
  • 谢谢!源代码相当陈旧,所以我必须对它们进行一些工作,以使它们使用现代 C# 的泛型和特性,但除此之外,这正是我所寻找的。​​span>
  • 好的,我检查了链接,它确实让我有点困惑。如果我将两个集合放入列表中: Enumerable.Range(1, 5) 作为源和 Enumerable.Range(2, 5) 作为目标,我想它会告诉我“删除源的第一个元素”,然后执行什么都没有,然后将目标的最后两个元素添加到源。相反,它给了我this。知道 -1 是什么意思吗?
  • 我发现了另一种通用的差异算法,我也会尝试。 Link for other people having the same problem.
猜你喜欢
  • 2018-06-07
  • 2014-05-19
  • 1970-01-01
  • 2021-11-21
  • 1970-01-01
  • 2021-07-25
  • 1970-01-01
  • 2015-07-30
  • 2015-12-09
相关资源
最近更新 更多