Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么';包含我的代码的工作?_C#_List_Contains - Fatal编程技术网

C# 为什么';包含我的代码的工作?

C# 为什么';包含我的代码的工作?,c#,list,contains,C#,List,Contains,我正在使用List.Contains来判断变量是否在列表中,但当变量在列表中时,它会不断返回它不在列表中 我查了一下,发现我必须继承IEquatable并实现自己的.Equals方法。实际的类继承自另一个类,因此我在基类中编写了.Equals方法 下面是“Actividad”类的代码: 这是检查列表中是否有内容的代码: private void loadDisponibles() { foreach (Actividad_a act in Program.Asignaturas) {

我正在使用List.Contains来判断变量是否在列表中,但当变量在列表中时,它会不断返回它不在列表中

我查了一下,发现我必须继承IEquatable并实现自己的.Equals方法。实际的类继承自另一个类,因此我在基类中编写了.Equals方法

下面是“Actividad”类的代码:

这是检查列表中是否有内容的代码:

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;
}