如何在使用linq维护对象的原始形式的同时过滤列表中的列表?

时间:2014-04-16 11:26:14

标签: c# .net linq lambda

我有一个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;  
}  

注意:这只是一个示例性结构。

4 个答案:

答案 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学生的学校。所以它应该有用。

顺便说一下,你们的成员是私人的,当然必须改变。