当使用System.Collections.Generic中的List类时,像Contains或IndexOf这样的方法将使用IEquatable实现的Equals方法或由Object类提供的覆盖的Equals方法来比较传递的引用对象。如果未覆盖Object.Equals,则它将检查传递的引用是否指向与自身相同的对象。
我的问题是:如果Equals被覆盖,是否有一种方法使List按引用进行比较? 下面的代码将从列表中删除该项:
我的问题是:如果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 按引用而非按值进行比较?