如何在列表中过滤列表,同时使用linq保持对象的原始形式

本文关键字:列表 linq 对象 原始 过滤 | 更新日期: 2023-09-27 17:58:31

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

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

如何在列表中过滤列表,同时使用linq保持对象的原始形式

据我所知,你的问题很简单:

var result = schools.Where(school => school.Students
                                           .Any(student => student.Gender == 'M'));

如果需要的话,你当然可以做result.ToList()

var maleSchools = schools
    .Select(s => new School { name = s.name, address = s.address, students = s.students.Where(stud => stud.gender == 'M').ToList() })
    .ToList();

没有必要对对象进行改革,如果对象更复杂,这将很快失去控制。

如果你寻找学校,这会更容易、更干净

var maleSchools = schools.Where(school => school.students.Any(student => student.gender == 'M'))

为了回答你关于让学校的"学生"属性只显示男学生的评论,我看到了三种不混乱的方式,按偏好顺序列出。

一个-当你使用该集合时进行过滤-一个简单的Where子句,只过滤到雄性。(可能不可行,不知道你的用例-继续阅读。)

第二,创建一个包含未经修改的学校,但与所有男生一起的类型:

var maleStudents = schools.Select(school => {
    School = school, 
    MaleStudents = school.students.Where(student => student.gender == 'M') 
});

第三,向School添加一个属性、方法或扩展方法,使您要查找的已过滤集合浮出水面。

为什么不:

var q = 
    from s in schools
    where s.students.Any(st => st.gender == 'M')
    select s;

我错过什么了吗?你并不是说你想过滤掉学生,只是你希望学校只招收M名学生。所以它应该起作用。

顺便说一句,你们是私人会员,这当然要改变。