Skip to content

文章

集合比较器:查找两个集合之间的差异

2019年7月22日 • 3 分钟阅读

集合比较器:查找两个集合之间的差异

你是否需要比较两个集合,并根据项目是在源集合中、比较集合中还是在两者中都存在来执行某些逻辑?是的,我也遇到过,我需要合并来自UI和数据库的数据。我找不到好的解决方案,所以我编写了一个集合比较器。

为了说明这是如何工作的,让我们看一个例子。

在源数据中我们有值 1, 3, 4, 6,在
比较集合中我们有值 1, 2, 3, 4, 5

与比较集合相比,源数据缺少2和5,与源集合相比,比较集合缺少6。

让我们逐步了解这个合并过程:

  1. 在两者中都存在(更新)
  2. 仅在比较集合中(添加到源)
  3. 在两者中都存在(更新)
  4. 在两者中都存在(更新)
  5. 仅在比较集合中(添加到源)
  6. 仅在源集合中(从源中移除)

代码如下所示:

var source = new []{1, 3, 4, 6};
var collection = new[] {1, 2, 3, 4, 5};

source.CompareTo(collection, (s, d) => s == d)
    .OnlyInSourceCollection(s=> {/* do something */})
    .OnlyInComparingCollection(s=>{/* do something */})
    .InBoth(s=> {/*do something*/})
    .Process();

为什么不使用LINQ?

你可以使用LINQ,但是LINQ至少会迭代集合3次,这还不包括对数据的操作(添加、更新和删除)。使用CollectionComparer,数据只需要迭代两次。

有更快的方法来查找差异,比如二分搜索,但二分搜索只适用于整数。集合比较器支持任何类型的比较。比较是通过这段代码定义的:(s, d) => s == d

源代码可以在GitHub上找到。

作者:Chuck Conway 专注于软件工程和生成式人工智能。在社交媒体上与他联系:X (@chuckconway) 或访问他的 YouTube

↑ 回到顶部

您可能还喜欢