无法转换lambda表达式

时间:2012-04-12 17:25:54

标签: c# wcf linq web-services

如果我尝试:

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-groupsDelete method in WCF

中遇到了问题

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

只是快速了解我想要做什么,让我们说学生A 可以属于多个群组。然后,如果我删除该学生,学生不应再列出任何组。但确实如此。但是,如果我搜索,请说小组计算,学生不在那里。只是当我带着学生并搜索他所属的组(即使他被删除)时,它才会返回我最初添加他的组。这个应该发生的事情

3 个答案:

答案 0 :(得分:7)

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

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

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

如果您想保留students,请将元素复制到新列表

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

然后过滤该列表

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

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

根据您的更新,您似乎正在寻找

students.RemoveAll(s => s.StudentID == studentID);
Groups.ForEach(g => g.Groupsz.RemoveAll(gs => gs.StudentID == studentID));

答案 1 :(得分:2)

尝试使用RemoveAll ...........

答案 2 :(得分:2)

List<T>.Remove()的返回类型为bool。因此,您不会从List<Group>获得List<Student>.Remove()

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

但是你需要多做一点才能让学生名单成为List<Group>。您的问题中没有足够的信息来判断是否存在转换可能性。