我有两个清单。第一个是所有学生,第二个是选定的学生。我想如果我有一次选择他们将从全部学生名单中删除的学生。这是我的代码,但事实并非如此。学生不会被删除。
foreach (var li in ListSelectedStudents.ToList())
{
if (ListAllStudents.Contains(li))
{
ListAllStudents.Remove(li);
}
}
答案 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();