gpt4 book ai didi

c# - 通过引用比较?

转载 作者:可可西里 更新时间:2023-11-01 09:00:27 25 4
gpt4 key购买 nike

当使用 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 通过引用而不是值进行比较?

最佳答案

您可以使用 List.RemoveAll在您的谓词中,将项目与 Object.ReferenceEquals 进行比较.

list.RemoveAll(item => object.ReferenceEquals(item, s2));

当从 Visual Studio 2010 Express 调试时,代码确实成功删除了 1 个项目。

关于c# - 通过引用比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9270456/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com