1

我有StudentsList100多名学生。

   public class Student
    {
        private string _name;
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }

        private string _subject;
        public string Subject
        {
            get { return _subject; }
            set { _subject = value; }
        }

        private int _age;
        public int Age
        {
            get { return _age; }
            set { _age= value; }
        }
    }

当我输入一个主题时,我想单独List<string>列出所有注册该主题的学生的姓名。

我试过了-

    List<string> results= new List<string>();

    results = students.Where(x => x.Subject.Contains("Science")).SelectMany(x => x.Name).ToList();

当我尝试这个 Linq 查询时,它生成了 Null 结果。列表中没有任何内容。

预期成绩

4

3 回答 3

6

您需要使用.Select()而不是.SelectMany()

   results = students
               .Where(x => x.Subject.Contains("Science"))  //Filter by Subject
               .Select(x => x.Name)              //Select only Name. 
               .ToList();                        //Convert to List

我们什么时候使用.SelectMany()

让我们考虑一下,在我们拥有List<School>的每所学校中 List<Student>,我们想要所有学校的所有理科学生,那时我们需要从学校列表中展平学生列表。

我们什么时候使用.Select()

当我们想要遍历学生列表并生成新表单时,即从中读取名称。

于 2020-08-13T17:26:51.523 回答
3

您正在检查主题字符串是否包含子字符串“Science”,而不是像您想要的那样检查具有“Science”主题的学生。你的代码应该是这样的;

var results = students.Where(s => s.Subject == "Science").ToList();

编辑:如果你只想要名称而不是Student对象,你可以Select()在查询中添加一个:

var names = students
               .Where(s => s.Subject == "Science")
               .Select(s => s.Name)
               .ToList();
于 2020-08-13T17:29:48.680 回答
2

听起来您实际上想要使用Select()而不是SelectMany(). 前者会将单个属性投影到新的集合中。

尝试这个:

results = students.Where(x => x.Subject.Contains("Science")).Select(x => x.Name).ToList();
于 2020-08-13T17:27:39.980 回答