难以从列表中删除项目?

时间:2013-12-13 09:12:27

标签: c# linq

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

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

3 个答案:

答案 0 :(得分:4)

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

要使特定代码能够执行您需要执行的操作,请在IEquatable<Student>类上提供Student的实现,如备注here中所述。

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

正如我有机会提供信息之前在评论中发现的那样,Remove也将依赖IEquatable<Student>docs),因此您仍然需要提供实施,但是它会让你的代码看起来更清洁:

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

可能有多种方法可以在不需要实现接口的情况下执行此操作,但您将无法使用当前代码。我会留下其他答案来解决这些问题,因为它是星期五,我的大脑还没有正常运作。

答案 1 :(得分:2)

你尝试过使用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...

答案 2 :(得分:0)

试试这个:

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