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>
{
..
}