【发布时间】:2012-02-14 01:17:54
【问题描述】:
使用 System.Collections.Generic 中的 List 类时,Contains 或 IndexOf 等方法将使用从 IEquatable 实现的 Equals 方法或 Object 类提供的重写 Equals 方法来比较传递的引用的对象。如果 Object.Equals 没有被覆盖,它会检查传入的引用是否指向与自身相同的对象。
我的问题是:如果 Equals 被覆盖,是否有办法通过引用比较 List? 下面的代码将从列表中删除该项目:
class Program
{
static void Main(string[] args)
{
var s1 = new SomeClass() { A = 5 };
var s2 = new SomeClass() { A = 5 };
var list = new List<SomeClass>();
list.Add(s1);
list.Remove(s2); // s1 will get removed, even though s2 has been
// passed, because s1's Equals method will return true.
}
}
class SomeClass
{
public int A { get; set; }
public override bool Equals(object obj)
{
SomeClass s = obj as SomeClass;
if (s == null)
{
return false;
}
else
{
return s.A == this.A;
}
}
}
假设我无法删除 SomeClass 的 Equals 实现,有没有办法让 List 按引用而不是值进行比较?
【问题讨论】: