2017-01-02 53 views
4

比方说,我们有一个类学生lambda参数如何工作?

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

我们想打印出每个学生有类似这样的主题:

汤姆 - ASP.NET

汤姆 - C#

Mike - ADO.NET

Mike - C#

所以我找到答案是

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) 

从我的理解,左侧=>是intput参数,它是学生例如S IN这种情况下,但是=>应该是返回类型相关的右侧给学生实例s,例如,如果我们想获得学生的姓名,s.Name,那么(学生,主题)是什么意思?

回答

2

时的SelectMany超载。见https://msdn.microsoft.com/en-us/library/bb534631(v=vs.110).aspx

s => s.Subjects是您的集合选择 - 将施加到输入的每个元素的变换

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

+0

谢谢。现在我明白了。我应该看到逗号作为分隔符 – grooveline

+0

请增加一些关于's => Subjects'和'(...)=> ...'是不同的东西,而不是s = s。 ...)' –

2

这是因为Subjects在类里定义为List<string>而且你必须单独打印它,所以它需要遍历子列表的集合。在解释查询的所请求的部分(s => s.Subjects, (student, subject)),你应该看看到的.SelectMany

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

作为每方法的签名定义,所述第二参数(Func)正在接受源对象(这里是Student)和IEnumerable集合对象,这里的字符串类型是List<string>

这意味着学生(student, subject)Student类型和主题的会在s.Subjects一个项目,所以.SelectMany将通过收集子将进一步迭代在这里。

如果你想打印像这样(Tom - ASP.NET,C#)意味着你可以在你的情况下做GroupBy你不想这样做,所以使用该代码执行对子列表的迭代;

附加信息:如果结果是基于分组,然后你的代码将是这样的:

var result = Student.GetAllStudents() 
        .GroupBy(s => s.Name) 
        .Select(x=> new { StudentName = x.Key, SubjectName = String.Join(",", 
        x.SelectMany(y=>y.Subjects) 
        .ToList()}); 
+0

那么什么是(学生,主题)?它是一个组合参数吗? – grooveline

+1

您是否回答了被问到的问题? –

+0

@RobertHarvey:是的,我已经更新了答案 –