假设我们有一个类(class)学生

class Student
{
    public string Name { get; set; }
    public string Gender { get; set; }
    public List<string> Subjects { get; set; }

    public static List<Student> GetAllStudetns()
    {
        List<Student> listStudents = new List<Student>
        {
           new Student
           {
               Name = "Tom",
               Gender = "Male",
               Subjects = new List<string> { "ASP.NET", "C#" }
           },
           new Student
           {
              Name = "Mike",
               Gender = "Male",
               Subjects = new List<string> { "ADO.NET", "C#", "AJAX" }
           }
        };

        return listStudents;
    }
}

我们想打印出每个学生的科目如下:



所以我找到的答案是
var result = Student.GetAllStudents().SelectMany(s => s.Subjects, (student, subject) => new { StudentName = student.Name, SubjectName = subject});

//then use foreach loop to retrieve...

我可以理解 => 的第二个用法,这只是对匿名类型的投影。但我不明白第一部分
s => s.Subjects, (student, subject)

根据我的理解,=>的左边是输入参数,在这种情况下是Student实例s,但=>的右边应该是与Student实例s相关的返回类型,例如s.Name如果我们想要得到学生的名字,那么 (student, subject) 是什么意思?

最佳答案

SelectMany 过载。见 https://msdn.microsoft.com/en-us/library/bb534631(v=vs.110).aspx
s => s.Subjects 是您的集合选择器 - 将应用于输入的每个元素的变换
(student, subject) => new { StudentName = student.Name, SubjectName = subject} 是您的结果选择器 - 应用于中间序列的每个元素的变换函数

关于c# - lambda 参数如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41420656/

10-15 03:50