【问题标题】:IComparer interface is to Comparison delegate as IEqualityComparer is to what?IComparer 接口是比较委托,因为 IEqualityComparer 是什么?
【发布时间】:2013-11-28 19:25:09
【问题描述】:

我喜欢Comparison 委托,它比 IComparer 更容易制作。

IEqualityComparer 有类似的委托吗?

IComparer 接口是比较委托,因为 IEqualityComparer 是什么?

【问题讨论】:

  • 在我的脑海中,我想不出 BCL 中的一个。我能想到的最接近的可能是Predicate<T> 委托,但它并不完全相同(只需要一个对象而不是比较两个对象)。除了有人知道之外(我不会感到惊讶;我不知道完整的 BCL 就像我的手背),你可能最终不得不滚动你自己的代表签名。编辑:可能是delegate bool EqualityComparison<T>(T left, T right)(或者可能是Func<T, T, bool>),但你会在使用 BCL 时遇到问题。

标签: c# .net


【解决方案1】:

没有等价物,因为不可能有。 IComparer<T> 只定义了一个成员,因此您可以将其“提炼”成一个委托。

相比之下,IEqualityComparer<T> 必须同时提供 EqualsGetHashCode 实现才能普遍有用。您不能将这两者都放入委托中,因此不等同于 Comparison<T>

也就是说,直接比较 T 类型的两个实例是否相等的委托签名将是为 EqualityComparer<T>.Equals 给出的签名——即Func<T, T, bool>

【讨论】:

    【解决方案2】:

    您始终可以实现您的通用 EqualityComparer:

     public class GenericEqualityComparer<T> : IEqualityComparer<T>
     {
         private Func<T, T, bool> equalsFunction;
         private Func<T, int> getHashCodeFunction;
    
         public GenericEqualityComparer(Func<T, T, bool> equalsFunction, Func<T, int> getHashCodeFunction)
         {
             this.equalsFunction = equalsFunction;
             this.getHashCodeFunction = getHashCodeFunction;
         }
    
         public bool Equals(T x, T y)
         {
             return this.equalsFunction(x, y);
         }
    
         public int GetHashCode(T obj)
         {
             return this.getHashCodeFunction(obj);
         }
     }
    

    并像这样使用它:

    var list = new[]{"A","B","C","A"};
    var distinct = list.Distinct(
          new GenericEqualityComparer<string>(
                 (a,b) => a.Equals(b), 
                 a => a.GetHashCode()));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-05
      相关资源
      最近更新 更多