繁体   English   中英

从列表中删除项目有困难吗?

[英]Difficulty in Removing Items From List?

我有两个清单。 第一个是所有学生,第二个是选定的学生。 我想如果我一次选择一些学生,他们将从所有学生名单中删除。 这是我的代码,但不是。 学生不会被删除。

foreach (var li in ListSelectedStudents.ToList())
{
    if (ListAllStudents.Contains(li))
    {
        ListAllStudents.Remove(li);
    }
}

Contains将使用相等性来确定什么是“相等”,我在这里假设您的自定义类未提供自定义相等性实现,这意味着将为该类型提供默认的equatable,而只是使用引用相等性。 因此,即使您认为两件事是“相等的”, Contains方法也不是,因此也不会进入Remove调用。

要获得特定代码的行为,你需要做的是提供一个实现IEquatable<Student>Student类,如在备注说明这里

在这种情况下,实际上并不需要Contains因为Remove将执行相同的检查。 如果没有要删除的内容,则Remove调用将是透明的,实际上什么也没做。

就像在我有机会提供信息之前在注释中陷入的一样, Remove也将依赖于IEquatable<Student>docs ),因此您仍然需要提供一个实现,但这会使您的代码看起来更IEquatable<Student>

foreach (var li in ListSelectedStudents.ToList())
{
    ListAllStudents.Remove(li);
}

无需实现接口,可以有多种方法来执行此操作,但是您将无法使用当前代码。 我将在周五留下其他答案来回答这些替代方案,而我的大脑仍无法正常运行。

您是否尝试过使用linq:

ListAllStudents.RemoveAll(m => ListSelectedStudents.Contains(m));

如果不起作用,则对象中实现的默认比较可能有问题,您可以修复比较器,或者执行类似的操作:

ListAllStudents.RemoveAll(m => ListSelectedStudents.Any(n=>n.Id == m.Id)); // Assume the Id is the primary key of the object...

尝试这个:

ListSelectedStudents = ListSelectedStudents.Where(a => !ListSelectedStudents.Contains(a)).Select(a => a).ToList();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM