【发布时间】:2019-11-21 13:01:58
【问题描述】:
我想了解C# 中两个不同类型的大型数组之间的区别。性能和优化很重要,因为我必须比较大型元素数组。
我必须能够从一个列表中获取与另一个列表相关的缺失元素以及存在但不同的元素。
目标是从REST API 提供的外部数据同步我的数据库中的数据。我在我的服务器上使用EF Core,它为我提供了TLocal[],REST API 为我提供了TRemote[]。由于这是定期从 API 检索的大数据,我想避免将 TRemote 转换为 TLocal 来比较两个列表。我有两个类型共有的ID property,可以进行比较。
一些考虑过的可能性:
-
HashSet:两个列表必须属于同一类型才能使用Except/Intersect。我想保留两种不同的类型。 -
Join-Linq:这允许使用两个不同类型的列表,但会降低性能。此外,我必须执行两次 Join 才能获得两个列表之间的差异(添加/删除)。 -
IEqualityComparer:使用Except/Intercept和自定义EqualityComparer比较两个对象。
还有其他选择吗?
【问题讨论】:
-
如何判断两个对象是否“相同”/是否“不同”?是否只是 ID 相同?
-
是的,一个 ID 属性对于机器人类型是通用的。这决定了它是否应该被添加/删除/更新。要知道是否需要更新,需要比较两种类型的值。我认为它们是两种不同的操作,一种是比较列表,一种是比较对象。
-
是的,我将开始比较 ID。找到一组需要比较的对象后,看看是否有更新,直接开始比较对象。
-
除了比较 ID 和避免将一种类型转换为另一种类型之外,还应考虑将一种类型(或两者)调整为另一种类型。适配器将是围绕
TLocal和/或TRemote的轻量级包装器,其中适配器委托给包装类型。 -
你列出了所有的可能性,它们都差不多。他们都使用带有 IEqualityComparer 的 Hashset,Join 也是如此。要将其作为 SQL 直接在数据库上执行,Join 是最好的也是唯一的选择。如果您在内存中讨论,请根据您的 ID 将其中一个列表转换为 Dictionary,迭代其他集合并在字典中搜索每个 item-ID。 Dictionary 再次只是一个 HashSet,它只是将一个完整的项目链接到您的 ID。
标签: c# .net performance compare