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

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

foreach (var li in ListSelectedStudents.ToList()) { if (ListAllStudents.Contains(li)) { 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... 

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

要使特定代码表现出您需要做的事情,请在Student类上提供IEquatable的实现, IEquatable的备注中所述。

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

正如我在有机会提供信息之前已经IEquatableRemove也将依赖于IEquatable ( docs ),所以你仍然需要提供一个实现,但它会让你的代码看起来更清晰:

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

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

试试这个:

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