引入IEqualityComparer <t>是由于以下原因吗?</t>

时间:2011-04-18 18:33:38

标签: c#

1)引入IEqualityComparer<T>的原因是什么:

a)所以我们可以根据需要以多种不同的方式比较对象(特定类型)的相等性

b)并且通过使用标准接口来实现自定义相等比较,第三方类可能会接受此接口作为参数,并允许我们通过实现对象注入这些类的相等比较行为。 IEqualityComparer<T>

2)我假设IEqualityComparer<T>不应该在我们试图比较相等的T类型上实现,而是应该在helper类上实现它?

谢谢

3 个答案:

答案 0 :(得分:2)

  1. 同意a和b

  2. “不应该”始终是一个规范性问题,很少是一个好的指标。你做的工作没有遇到麻烦。 (实用程序员)。您可以实现接口statefull,stateless以及以任何方式实现的事实,使得可以为所有类型实现(替代)比较器,包括值类型,枚举,密封类型,甚至抽象类型;从本质上讲,它是一种战略模式

答案 1 :(得分:2)

我怀疑这里的任何人都能够以任何权威回答原因界面的介绍(我的猜测 - 这就是全部 - 将支持其中一个通用集类型,如Dictionary<TKey, TValue>HashSet<T>),但其purpose很明确:

  

定义支持对象比较的方法。

如果您将此与事实相结合,您可以有多种类型实现此界面(请参阅StringComparer),那么问题 a 的答案是

原因有三:

  1. 运算符(在本例中为==)不是多态的;如果类型的上升级别高于定义类型特定的比较逻辑的级别,那么您最终将执行参考比较,而不是使用==运算符中的逻辑。
  2. Equals()至少需要一个有效的引用,并且可以提供不同的逻辑,具体取决于它是在第一个值还是第二个值上调用(一个可以更多地派生并覆盖另一个的逻辑)。
  3. 最后也是最重要的是,该类型提供的比较逻辑可能不是用户所追求的。例如,使用==Equals进行比较时,字符串(在C#中)区分大小写。这意味着任何容器(如Dictionary<string, T>HashSet<string>)都区分大小写。允许用户提供另一种实现IEqualityComparer<string>的类型意味着用户可以使用他们喜欢的任何逻辑来确定一个字符串是否等于另一个字符串,包括忽略大小写。
  4. 至于问题 b ,可能,但如果在优先级列表中排名不高,我不会感到惊讶。

    对于你的最后一个问题,我会说这一般都是正确的。虽然没有什么可以阻止你这样做,但是认为类型T提供的自定义比较逻辑与类型T上提供的自定义比较逻辑不同只是因为它被引用为IEqualiltyComparer<T>而令人困惑。

答案 2 :(得分:1)

有时,类型会有自然等式比较,在这种情况下,它应该实现IEquatable<T>,而不是IEqualityComparer<T>。在其他时候,有多种可能的方法来比较对象的相等性 - 因此有必要实现IEqualityComparer<T>。它允许哈希表(和集合等)以灵活的方式工作。