如何在列表中过滤列表,同时使用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;
}
注:这只是一个示例性结构。
据我所知,你的问题很简单:
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名学生。所以它应该起作用。
顺便说一句,你们是私人会员,这当然要改变。