Skip to content

文章

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

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

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

您是否需要比较两个集合,并根据项目是在源集合中、在比较集合中还是在两者中执行某些逻辑?我也是,我需要合并来自 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 是一位 AI 工程师,拥有近 30 年的软件工程经验。他构建实用的 AI 系统——内容管道、基础设施代理和解决实际问题的工具——并分享他沿途的学习成果。在社交媒体上与他联系:X (@chuckconway) 或访问他的 YouTubeSubStack

↑ 返回顶部

你可能也喜欢