Roy*_*mir 5 c# .net-4.0 iequalitycomparer
我有一个类Person,它实现了从equals()方法IEquatable<Person>(也覆盖Object.Equals方法,让我们忽略的GetHashCode()方法现在)
class Person : IEquatable<Person>
{
public string Name { get; set; }
public bool Equals(Person other)
{
return this.Name == other.Name;
}
public override bool Equals(object obj)
{
var person = obj as Person;
return person != null && person.Name == Name;
}
}
Run Code Online (Sandbox Code Playgroud)
好的,让我们开始:
Person p1 = new Person() { Name = "a" };
Person p2 = new Person() { Name = "a" };
List<Person> lst1 = new List<Person>() { p1 };
List<Person> lst2 = new List<Person>() { p2 };
Run Code Online (Sandbox Code Playgroud)
让我们来谈谈这一行:
bool b = lst1.SequenceEqual(lst2, EqualityComparer<Person>.Default);
Run Code Online (Sandbox Code Playgroud)
理解这部分我有一个问题:
EqualityComparer<Person>.Default
Run Code Online (Sandbox Code Playgroud)
我听说EqualityComparer<Person>.Default会检查这个类是否正在实现IEquatable- 它将采用Equals(Person other)Method而不是Equals(object obj).它有避免拳击的优势
但
在Equals(Person other)将运行有或没有 EqualityComparer<Person>.Default
(因为它实现IEquatable)
那么我们在谈论什么拳击?没有!
Equals(object obj)将运行的唯一时间 是:
bool b = lst1.SequenceEqual(lst2,EqualityComparer<Object>.Default);
Run Code Online (Sandbox Code Playgroud)
但我是一名程序员!我object实际上永远不会发送一个Person!
我错过了什么?我无法理解这里的好处EqualityComparer<Object>.Default.有人可以举个例子来证明我错了吗?
如果您作为第二个参数传入null,或者根本不传入第二个参数(基本相同),SequenceEquals 的实现将调用EqualityComparer<T>.Default自身(反编译Enumerable即可看到这一点)。EqualityComparer<T>.Default这就解释了为什么无论提供与否,您都看不到差异。
因此,最后,只有当您想使用除 之外的 EqualityComparer<T>.Default相等比较器时,第二个参数才有意义。
| 归档时间: |
|
| 查看次数: |
2262 次 |
| 最近记录: |