Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# lambda参数是如何工作的?_C#_Linq - Fatal编程技术网

C# lambda参数是如何工作的?

C# lambda参数是如何工作的?,c#,linq,C#,Linq,假设我们有一个班的学生 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> lis

假设我们有一个班的学生

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;
    }
}
我可以理解=>的第二个用法,它只是对匿名类型的投影。但我不明白第一部分

s => s.Subjects, (student, subject)

根据我的理解,=>的左侧是intput参数,在本例中它是学生实例s,但是=>的右侧应该是与学生实例s相关的返回类型,例如,s.Name如果我们想要获得学生的名字,那么(学生,主题)做什么呢意思?

这是因为
主题
被定义为类内的
列表
,您必须单独打印,因此它需要迭代子列表的集合。在解释查询的要求部分(
s=>s.Subjects,(student,subject)
)之前,您应该查看
的定义。选择many

public static IEnumerable<TResult> SelectMany<TSource, TResult>(
    this IEnumerable<TSource> source,
    Func<TSource, IEnumerable<TResult>> selector
)

SelectMany过载。看

s=>s.Subjects
是您的集合选择器-将应用于输入的每个元素的转换


(student,subject)=>new{StudentName=student.Name,SubjectName=subject}
是您的结果选择器-应用于中间序列的每个元素的转换函数

那么(student,subject)是什么呢?这是一个组合参数吗?您是否回答了问题?谢谢。现在我明白了。我应该把逗号看作一个分隔符,请添加一些关于
s=>Subjects
(…)=>…
是不同的东西,而不是
s=>s.Subjects,(…)
public static IEnumerable<TResult> SelectMany<TSource, TResult>(
    this IEnumerable<TSource> source,
    Func<TSource, IEnumerable<TResult>> selector
)
var result = Student.GetAllStudents()
                    .GroupBy(s => s.Name)
                    .Select(x=> new { StudentName = x.Key, SubjectName = String.Join(",",
                   x.SelectMany(y=>y.Subjects)
                    .ToList()});