c# 将 2 个列表与相同但不相同的对象相交

c# Intersect 2 lists with same but non identical objects

我想交叉 2 个具有相同类型和相同属性的对象列表,但列表中的对象是分开实例化的。

class foo
{ 
  int id;
  string name;

  public foo(int Id, string Name)
  {
     id = Id;
     name = Name;
  }
}
List<foo> listA = new List<foo>() {new foo(1, "A"), new foo(2, "B"), new foo(3, "C")};
List<foo> listB = new List<foo>() {new foo(2, "B"), new foo(3, "C"), new foo(4, "D")};

List<foo> intersect = listA.Intersect(listB).ToList();

foo 对象 B 和 C 都在 listA 和 listB 中,但是当我与它们相交时,我得到 0 个条目。我知道它是因为没有相同的对象但是无论如何我需要做什么才能获得包含 B 和 C 的列表?我错过了什么?

您可以覆盖 .NET 如何“决定”对象是否相等 - 通过覆盖 EqualsGetHashCode

Visual Studio 可以提供帮助:https://docs.microsoft.com/en-us/visualstudio/ide/reference/generate-equals-gethashcode-methods?view=vs-2019

对于任何需要它的人。 我已经接受了@arconaut 的回答并将其添加到我的代码中,所以 foo 现在看起来像这样:

   class foo
   {
      int id;
      string name;
      public foo(int Id, string Name)
      {
         id = Id;
         name = Name;
      }
      public override bool Equals(object obj)
      {
         return Equals(obj as foo);
      }

      public bool Equals(foo obj)
      {
         if (obj == null) return false;
         return (id == obj.id && name == obj.name);
      }

      public override int GetHashCode()
      {
         var hashCode = 352033288;
         hashCode = hashCode * -1521134295 + id.GetHashCode();
         hashCode = hashCode * -1521134295 + name.GetHashCode();
         return hashCode;
      }
   }

我仍然不确定哈希码,但它有效。所以谢谢