从列表中删除项目有困难吗?
我有两个清单。 第一个是所有学生,第二个是选定的学生。 我想如果我有一次选择他们将从全部学生名单中删除的学生。 这是我的代码,但事实并非如此。 学生不会被删除。
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
调用将是透明的,实际上什么都不做。
正如我在有机会提供信息之前已经IEquatable
, Remove
也将依赖于IEquatable
( docs ),所以你仍然需要提供一个实现,但它会让你的代码看起来更清晰:
foreach (var li in ListSelectedStudents.ToList()) { ListAllStudents.Remove(li); }
在不需要实现接口的情况下,可能有多种方法可以执行此操作,但您将无法使用当前代码。 我会留下其他答案,因为它是星期五,而我的大脑还没有正常运作。
试试这个:
ListSelectedStudents = ListSelectedStudents.Where(a => !ListSelectedStudents.Contains(a)).Select(a => a).ToList();