C# 为什么';包含我的代码的工作?
我正在使用List.Contains来判断变量是否在列表中,但当变量在列表中时,它会不断返回它不在列表中 我查了一下,发现我必须继承IEquatable并实现自己的.Equals方法。实际的类继承自另一个类,因此我在基类中编写了.Equals方法 下面是“Actividad”类的代码: 这是检查列表中是否有内容的代码:C# 为什么';包含我的代码的工作?,c#,list,contains,C#,List,Contains,我正在使用List.Contains来判断变量是否在列表中,但当变量在列表中时,它会不断返回它不在列表中 我查了一下,发现我必须继承IEquatable并实现自己的.Equals方法。实际的类继承自另一个类,因此我在基类中编写了.Equals方法 下面是“Actividad”类的代码: 这是检查列表中是否有内容的代码: private void loadDisponibles() { foreach (Actividad_a act in Program.Asignaturas) {
private void loadDisponibles() {
foreach (Actividad_a act in Program.Asignaturas) {
if (!user1.ActAcademicas.Contains(act)) {
doSomething();
}
}
}
Program.asignataras
和user1.actacademicals
都定义为List
问题是!user1.actAcademicals.Contains(act)
始终返回true,无论数据是否在列表中
我的第一个猜测是,我必须从IEquatable继承并在每个派生类中实现.Equals方法,但我不太确定。您正在比较Actividad\u a,而Contains方法希望它实现
IEquatable
协变和逆变泛型类型参数提供更大的
分配和使用泛型类型的灵活性。例如
协变类型参数使您可以使指定看起来
很像普通的多态性。假设您有一个基类和一个
派生类,命名为Base并派生。多态性使您能够
将派生的实例指定给Base类型的变量。同样地,
因为IEnumerable(of T)接口的类型参数为
协变,可以指定IEnumerable的实例
(VisualBasic中的IEnumerable(指派生的)到类型为的变量
数不清
通常,协变类型参数可以用作返回类型
和逆变类型参数可以用作
参数类型。对于接口,可以使用协变类型参数
用作接口方法的返回类型,并且是逆变的
类型参数可以用作接口的参数类型
方法
出于某种原因,当您选中“包含”时,列表是否为空?据我所知,它只有一个元素。虽然我没有检查它是否有任何东西。这有关系吗?Contains
使用Equals
所以是的,你必须实现它。也许在Equals
方法中设置一个断点来验证列表是否确实在调用它。我想这里的问题是你必须重写对象。Equals
,而不是创建一个新的。或者,正如OP怀疑的那样,他可以在从Actividad派生的每种类型上实现IEquatable。但是,在Actividad
中重写object.Equals
是更好的方法,因此+1。(另外,您需要在示例代码中使用override关键字。)这很顺利:)。我还得继承他的遗产IEquatable@Fawques,您实际上不必从IEquatable继承,因为所有对象都有一个Equals方法。我刚刚为我的对象对Equals进行了重写,它工作得很好。谢谢
public class Actividad_a : Actividad{ [...] }
private void loadDisponibles() {
foreach (Actividad_a act in Program.Asignaturas) {
if (!user1.ActAcademicas.Contains(act)) {
doSomething();
}
}
}
public override bool Equals(object otra)
{
var actividad = otra as Actividad;
if (actividad == null) return false;
return this.Codigo == actividad.Codigo;
}