当从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));
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。