C# Intersect不';不能在列表之间工作

C# Intersect不';不能在列表之间工作,c#,visual-studio,equality,C#,Visual Studio,Equality,我有点奇怪的问题我使用Visual Studio,我正在用C#开发一个项目 我有两个自定义类“Attr”和“FD”,我使用包含其对象的列表,例如 List<Attr> attrList = new List<Attr>(); List<FD> fdList = new List<FD>(); 列表 这是ff,也是FD类的对象。 正如您所看到的,这些对象包含完全相同的值 方法GetLeft()返回包含Attr类对象的列表 因此,当我试图找到这

我有点奇怪的问题
我使用Visual Studio,我正在用C#开发一个项目
我有两个自定义类“Attr”和“FD”,我使用包含其对象的列表,例如

List<Attr> attrList = new List<Attr>();
List<FD> fdList = new List<FD>(); 
列表
这是ff,也是FD类的对象。

正如您所看到的,这些对象包含完全相同的值
方法GetLeft()返回包含Attr类对象的列表

因此,当我试图找到这两个列表(fd.GetLeft()和ff.GetLeft())之间的交集时,结果是什么都没有(它应该是一个包含Attr对象“a”的列表)。

我错过了什么


注意:这些屏幕截图来自Visual Studio中的调试模式。

为了使用
Intersect
,我建议实现
IEqualityComparer
,如下所示:

public class FD
{
    public string Name { get; set; }
}

 static void Main()
    {
        List<FD> fdList1 = new List<FD>();
        fdList1.Add(new FD { Name = "a" });

        List<FD> fdList2 = new List<FD>();
        fdList2.Add(new FD { Name = "a" });

       IEnumerable<FD> fd = fdList1.Intersect<FD>(fdList2, new ComparerFd()).ToList();
    }
public class ComparerFd : IEqualityComparer<FD>
{

    public bool Equals(FD x, FD y)
    {
        return x.Name == y.Name;
    }

    public int GetHashCode(FD obj)
    {
        if(obj == null) return 0;
        
        return obj.Name.GetHashCode();//Or whatever way to get hash code
    }
}

如果您创建了自己的类,并且没有覆盖该类中的
Equals
-方法,则
Intersect
-方法将只比较对象的引用,而不比较属性

以下面这个非常简单的类为例:

class MyClass
{
  int Value { get; set; }

  public MyClass(int value)
  {
    this.Value = value;
  }
}
现在,创建两个列表,两个列表都包含一个对象。对象的属性相同,但实例不同:

  var list1 = new List<MyClass>
  {
    new MyClass(5)
  };

  var list2 = new List<MyClass>
  {
    new MyClass(5)
  };
如果希望这些方法比较
MyClass
-对象的属性,请实现
IEqualityComparer
,例如将类签名更改为:

class MyClass : IEqualityComparer<MyClass>
{
  ..
}
class MyClass:IEqualityComparer
{
..
}
或者,您可以覆盖
Equals
GetHashCode
,因为这些方法将被称为默认的
IEqualityComparer


请参阅关于如何正确重写
Equals
GetHashCode

的。您有一个自定义类,那么您使用什么方法来实现EQUAL?请参阅
GetHashCode
的实现是错误的,因为对于相同的对象,仅返回一个随机数并不会返回相同的哈希代码。因此,
Intersect
-方法仍然不起作用,如果它使用散列码进行快速比较的话(我很确定它确实起作用)。一般来说,如果没有正确实现
GetHashCode
,最好至少返回一个常量值——这样,一切都会正常工作,“只”会变慢。。。在这种情况下,只需返回
this.Name.GetHashCode()
。非常感谢你们两位@胆小鬼。问题解决了
此.Name
ComparerFd
类中不存在。我想你的意思是
返回obj.Name.GetHashCode()。我用过这种方法,而且效果很好。还要注意,您应该检查并处理null:
returnobj.Name==null?0:obj.Name.GetHashCode()@sleekpather感谢您的注释,在答案中更新:)
class MyClass : IEqualityComparer<MyClass>
{
  ..
}