簡體   English   中英

如何在使用linq維護對象的原始形式的同時過濾列表中的列表?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM