
你是否需要比较两个集合,并根据项目是在源集合中、比较集合中还是在两者中都存在来执行某些逻辑?是的,我也遇到过,我需要合并来自UI和数据库的数据。我找不到好的解决方案,所以我编写了一个集合比较器。
为了说明这是如何工作的,让我们看一个例子。
在源数据中我们有值 1, 3, 4, 6,在
比较集合中我们有值 1, 2, 3, 4, 5。
与比较集合相比,源数据缺少2和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。