我有一个List,每个学校对象都有一个List。学生有性别M或F.
我想做的是获得有学生性别M的学校名单。
我想维护对象格式(列表中的列表),所以 SelectMany 我认为这不会起作用,因为它会使结构变平。
public class School
{
private string name;
private string address;
private IList<Student> students;
}
public class Student
{
private string name;
private int age;
private char gender;
}
注意:这只是一个示例性结构。
答案 0 :(得分:4)
据我所知,你的问题很简单:
var result = schools.Where(school => school.Students
.Any(student => student.Gender == 'M'));
当然,如果需要,你可以result.ToList()
。
答案 1 :(得分:2)
var maleSchools = schools
.Select(s => new School { name = s.name, address = s.address, students = s.students.Where(stud => stud.gender == 'M').ToList() })
.ToList();
答案 2 :(得分:1)
没有必要改造对象,如果对象更复杂,这将很快失控。
如果你寻找学校,那就更容易和更清洁(任何(学生是男性))
var maleSchools = schools.Where(school => school.students.Any(student => student.gender == 'M'))
回答你关于让学生#34;学校的财产只显示男学生,我看到三种非杂乱的方式,按优先顺序列出。
一个 - 使用该集合时进行过滤 - 一个简单的Where子句,仅过滤到男性。 (可能不可行,不知道你的用例 - 请继续阅读。)
二,创建一个包含未经修改的学校的类型,但与其所有男学生一起创建:
var maleStudents = schools.Select(school => {
School = school,
MaleStudents = school.students.Where(student => student.gender == 'M')
});
三,向School添加属性,方法或扩展方法,以显示您正在寻找的已过滤的集合。
答案 3 :(得分:0)
为什么不:
var q =
from s in schools
where s.students.Any(st => st.gender == 'M')
select s;
我错过了什么吗?你并不是说你想过滤学生,只是说你想要只有M学生的学校。所以它应该有用。
顺便说一下,你们的成员是私人的,当然必须改变。