c# – 比较参考?

前端之家收集整理的这篇文章主要介绍了c# – 比较参考?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
当从System.Collections.Generic使用List类时,像Contains或IndexOf这样的方法将使用从IEquatable实现的Equals方法或Object类提供的覆盖的Equals方法来比较传递的引用的对象.如果Object.Equals不被覆盖,它将检查传递的引用是否指向与其自身相同的对象.

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

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. var s1 = new SomeClass() { A = 5 };
  6. var s2 = new SomeClass() { A = 5 };
  7. var list = new List<SomeClass>();
  8. list.Add(s1);
  9. list.Remove(s2); // s1 will get removed,even though s2 has been
  10. // passed,because s1's Equals method will return true.
  11.  
  12. }
  13. }
  14.  
  15. class SomeClass
  16. {
  17. public int A { get; set; }
  18.  
  19. public override bool Equals(object obj)
  20. {
  21. SomeClass s = obj as SomeClass;
  22. if (s == null)
  23. {
  24. return false;
  25. }
  26. else
  27. {
  28. return s.A == this.A;
  29. }
  30. }
  31. }

假设我无法删除SomeClass的Equals实现,有没有办法通过引用而不是值来比较List?

解决方法

您可以使用 List.RemoveAll和您的谓词,将项目与 Object.ReferenceEquals进行比较.
  1. list.RemoveAll(item => object.ReferenceEquals(item,s2));

从Visual Studio 2010 Express调试时,该代码已成功删除1个项目.

猜你在找的C#相关文章