1

如果我尝试:

List<Student> students = new List<Student>();
List<Group> Groups = new List<Group>();
Groups = students.Remove(f => f.StudentID.Equals(studentID));

我在这一行得到一个错误:f => f.StudentID.Equals(studentID)

我在以前的帖子中遇到了困难https://stackoverflow.com/questions/10116685/linq-deleted-users-still-associated-with-groups和这里WCF 中的删除方法

所以我想也许我可以删除组中包含的学生,但我收到一个错误,无法将 lambda 表达式转换为 Student 类型,因为它不是委托类型。

只是关于我要做什么的快速更新,假设学生 A可以属于多个组。然后,如果我删除该学生,则该学生不应再列出任何组。但确实如此。但是,如果我搜索让我们说组计算学生不在那里。似乎只有当我带学生并搜索他所属的组(即使他被删除)时,它才会返回我最初将他添加到的组。这不应该发生

4

3 回答 3

7

如果您尝试传入谓词,则必须使用RemoveAll方法。Remove方法接受单个元素

var numRemoved = students.RemoveAll(f => f.StudentID == studentID);

此外,RemoveAll 方法不会返回“更新”列表,它会更新列表。所以students将更新列表,即它不会有学生StudentID == studentID

如果要保留students原样,请将元素复制到新列表

var newStudentList = new List<Student>(students);

然后过滤该列表

PS 两个列表中的公共对象是相同的,即如果一个对象在一个列表中更新,它也会在第二个列表中更新。如果需要第二个副本,则必须实施深度克隆。这只是来自同一对象池的两个列表。

var numRemoved = newStudentList.RemoveAll(f => f.StudentID == studentID);

随着您的更新,您似乎正在寻找

students.RemoveAll(s => s.StudentID == studentID);
Groups.ForEach(g => g.Groupsz.RemoveAll(gs => gs.StudentID == studentID));
于 2012-04-12T17:31:02.740 回答
2

尝试RemoveAll............

于 2012-04-12T17:31:05.793 回答
2

List<T>.Remove()返回类型为bool. 所以你不会得到一个List<Group>from List<Student>.Remove()

您可以使用var removed = students.RemoveAll(f => f.StudentID.Equals(studentID));获取从列表中删除的学生的列表。

但是您需要做更多的工作才能使该学生列表成为List<Group>. 您的问题中没有足够的信息来判断是否存在转换的可能性。

于 2012-04-12T17:32:16.460 回答