当我IEqualityComparer在msdn上查找通用接口时,我注意到接口是在一个单独的"comparer"类IEquatable<T>中实现的,与类本身相反.当我搜索更多的例子时,每一个都使用一个单独的类,这让我想知道:为什么不在类本身上实现它?
我能想象压倒一切object.Equals,并object.GetHashCode因为它在很多不同的情况下使用不被认为是很好的做法,但即使MSDN说(重点煤矿):
此接口允许实现集合的自定义相等性比较.
因此它的用途几乎仅限于Linq.我可以想到为什么定义一个单独的比较器类只有两个原因:
所以我的问题是:
有没有什么特别的原因让我忽略了导致每个人都只是为了比较来定义另一个comparerclass而不仅仅是在类本身上实现接口(在我看来,至少可以说这不会更糟)?
一个小例子:
public static void Main(string[] args)
{
Test t1 = new Test { id = 1, date = default(DateTime) };
Test t2 = new Test { id = 1, date = default(DateTime) };
Test t3 = new Test { id = 0, date = default(DateTime) };
List<Test> testList = new List<Test>{ t1, t2, t3 };
//Same result
int distinctCountClass = testList.Distinct(new Test()).Count();
int distinctCountComparerClass = testList.Distinct(new TestComparer()).Count();
}
public partial class Test
{
public int id { get; set; }
public DateTime date { get; set; }
}
public partial class Test : IEqualityComparer<Test>
{
public bool Equals(Test x, Test y) { return x.id == y.id && x.date == y.date; }
public int GetHashCode(Test obj) { return obj.id.GetHashCode(); }
}
public class TestComparer : IEqualityComparer<Test>
{
public bool Equals(Test x, Test y) { return x.id == y.id && x.date == y.date; }
public int GetHashCode(Test obj) { return obj.id.GetHashCode(); }
}
Run Code Online (Sandbox Code Playgroud)
为什么不在类本身上实现它?
因为没有意义。的全部目的IEqualityComparer<T>是在类型之外实现,T因为它针对您帖子中的“原因 1”。
如果您希望类本身实现等式逻辑,那么您应该实现IEquatable<T>专为此类场景EqualityComparer<T>.Default提供的功能,并且将在需要IEqualityComparer<T>且未明确指定的任何时候为您的实现提供必要的桥梁。
由于该类只能提供一个没有任何动态行为和/或选项的硬编码逻辑,因此它被认为是默认的相等逻辑,因此EqualityProvider<T>提供对其进行访问的静态属性的名称。
| 归档时间: |
|
| 查看次数: |
1705 次 |
| 最近记录: |