[英]How do I filter a list within a list while maintaining the original form of the object using linq?
我有一個列表,每個學校對象都有一個列表。 學生的性別為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'))
為了回答您關於讓School的“學生”屬性僅顯示男學生的評論,我看到了三種非凌亂的方式,按照偏好的順序列出。
一個-使用該集合時進行過濾-一個簡單的Where子句,僅過濾男性。 (可能不可行,不知道您的用例-請繼續閱讀。)
第二,創建一個類型,其中包含未修改的School,但與所有男生並列:
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個學生。 因此它應該工作。
順便說一句,您的成員是私人的,當然必須更改。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.