我有两个清单。第一个是所有学生,第二个是选定的学生。我希望如果我一次选择某个学生,他们将从所有学生列表中删除。这是我的代码,但事实并非如此。学生不会被开除。
foreach (var li in ListSelectedStudents.ToList())
{
if (ListAllStudents.Contains(li))
{
ListAllStudents.Remove(li);
}
}
Contains
将使用相等来确定什么是“相等”,我在这里假设您的自定义类没有提供自定义相等实现,这意味着将为该类型提供默认的相等,并且它只是使用引用相等。所以即使你认为两件事是“平等的”,Contains
方法没有,所以不会进入Remove
call.
要让该特定代码执行您需要做的事情,需要提供一个实现IEquatable<Student>
on the Student
类,如备注中所述here http://msdn.microsoft.com/en-us/library/bhkz42b3%28v=vs.110%29.aspx.
在这种情况下,Contains
实际上并不需要Remove
将进行相同的检查。如果没有什么要删除的,Remove
调用将是透明的,实际上什么都不做。
正如在我有机会提供信息之前就在评论中发现的那样,Remove
也会依靠IEquatable<Student>
(docs http://msdn.microsoft.com/en-us/library/cd666k3e%28v=vs.110%29.aspx)所以你仍然需要提供一个实现,但它会让你的代码看起来更干净一些:
foreach (var li in ListSelectedStudents.ToList())
{
ListAllStudents.Remove(li);
}
可能有多种方法可以做到这一点,而无需实现接口,但您将无法使用当前的代码。我将留下其他答案来解决这些替代方案,因为今天是星期五,我的大脑尚未正常运作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)