加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 比较参考?

发布时间:2020-12-15 04:27:08 所属栏目:百科 来源:网络整理
导读:当从System.Collections.Generic使用List类时,像Contains或IndexOf这样的方法将使用从IEquatable实现的Equals方法或Object类提供的覆盖的Equals方法来比较传递的引用的对象.如果Object.Equals不被覆盖,它将检查传递的引用是否指向与其自身相同的对象. 我的问
当从System.Collections.Generic使用List类时,像Contains或IndexOf这样的方法将使用从IEquatable实现的Equals方法或Object类提供的覆盖的Equals方法来比较传递的引用的对象.如果Object.Equals不被覆盖,它将检查传递的引用是否指向与其自身相同的对象.

我的问题是:如果等于被覆盖,有没有办法通过引用列出比较列表?
下面的代码将从列表中删除该项:

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个项目.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读