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()});