【问题标题】:Finding symmetric difference of two lists of objects [duplicate]找到两个对象列表的对称差异[重复]
【发布时间】:2020-02-20 05:59:28
【问题描述】:

考虑类型对象的两个列表(或其他适当的数据结构):

class Object
{
    public string clause;

    public string preamble;
    public string description;
}

我需要为这些不完全匹配的对象建立一个列表(preambledescription 在两者中完全相同)。例如,如果列表 A 中有一条记录,其 preamble 与列表 B 中的一条记录匹配,但它们的 description 不匹配,则应包含该记录。如果他们的description 匹配,则不应包括他们(这将是他们交集的一部分)。

我一直在寻找解决方案,包括实现嵌套的foreach 循环。 List 或任何其他适当的数据结构是否有对称差分函数可以通过像这样比较对象的成员来比较对象?

就上下文而言,其中一个列表表示使用 Epplus 库获得的 Excel 电子表格中的记录,另一个列表表示来自 Jira API 的问题。

【问题讨论】:

  • 您需要为您的类型创建一个适当的IEqualityComparer<T>(我希望您没有称为Object)来考虑具有相同序言和描述的对象平等。之后,HashSet<T>.SymmetricExceptWith 是你的朋友——如果你不想使用它,你可以使用 a.Except(b, comparer).Concat(b.Except(a, comparer))

标签: c# .net list data-structures symmetric-difference


【解决方案1】:

对此没有方便的内置解决方案,可能是因为 .NET 中的对象不是数据。但是,有一些项目对您的问题很有用,例如 Compare .NET Objects,它可以使用反射来比较对象,并且可以配置为列出两个对象之间的所有差异。

【讨论】:

  • HashSet<T>.SymmetricExceptWith 怎么不是一个方便的内置解决方案?您需要创建一个IEqualityComparer<T>,仅此而已。
  • “可以通过像这样比较它们的成员来比较对象?”所以我将这个问题解释为他在检测两个对象之间的差异时遇到了问题。
  • 这是一个句子的一半-其余所有(包括标题)都是关于对称差异的,您在答案中根本没有谈论。我认为写一个答案来解释如何使用IEqualityComparer<T> 执行此操作会更合适,可能将该项目称为避免编写该项目的一种方式。 (但实际上,对于两个属性,比较器编写起来非常简单。)
猜你喜欢
  • 2011-06-24
  • 1970-01-01
  • 2013-06-27
  • 1970-01-01
  • 2015-10-23
  • 1970-01-01
  • 2016-09-15
  • 2023-03-27
  • 1970-01-01
相关资源
最近更新 更多