1.例子一:
static void SelectMany() { //方式一:Query Syntax Console.WriteLine("方式一:Query Syntax"); List<string> nameList = new List<string>() { "Kate", "Hanna" }; IEnumerable<char> methodSyntax = nameList.SelectMany(x => x); foreach(char c in methodSyntax) { Console.Write(c + " "); } Console.WriteLine(""); //方式二:Method Syntax: Console.WriteLine("方式二:Method Syntax"); IEnumerable<char> querySyntax = from str in nameList from ch in str select ch; foreach (char c in querySyntax) { Console.Write(c + " "); } Console.ReadKey(); }
测试结果如下:
2.例子二:
1)先构造数据:
public class Student2 { public int ID { get; set; } public string Name { get; set; } public string Email { get; set; } public List<string> Programming { get; set; } public static List<Student2> GetStudents() { return new List<Student2>() { new Student2(){ID = 1, Name = "James", Email = "James@j.com", Programming = new List<string>() { "C#", "Jave", "C++"} }, new Student2(){ID = 2, Name = "Sam", Email = "Sara@j.com", Programming = new List<string>() { "WCF", "SQL Server", "C#" }}, new Student2(){ID = 3, Name = "Patrik", Email = "Patrik@j.com", Programming = new List<string>() { "MVC", "Jave", "LINQ"} }, new Student2(){ID = 4, Name = "Sara", Email = "Sara@j.com", Programming = new List<string>() { "ADO.NET", "C#", "LINQ" } } }; } }
2)代码如下:
static void SelectManyExp2() { //方式一:Query Syntax Console.WriteLine("方式一:Query Syntax"); IEnumerable<string> QuerySyntax = from std in Student2.GetStudents() from program in std.Programming select program; //Printing the values foreach (string program in QuerySyntax) { Console.WriteLine(program); } //方式二:Method Syntax Console.WriteLine("方式二:Method Syntax"); List<string> MethodSyntax = Student2.GetStudents().SelectMany(std => std.Programming).ToList(); //Printing the values foreach (string program in MethodSyntax) { Console.WriteLine(program); } }
3)测试结果如下:
这边夹杂着自己的疑问,Select与SelectMany的区别在哪?做如下试验:
static void SelectVSSelectMany() { //方式一:Query Syntax Console.WriteLine("方式一:Query Syntax"); var QuerySyntax = from std in Student2.GetStudents() select std.Programming; //Printing the values foreach (List<string> program in QuerySyntax) { Console.WriteLine(program); } //方式二:Method Syntax Console.WriteLine("方式二:Method Syntax"); var MethodSyntax = Student2.GetStudents().Select(std => std.Programming); //Printing the values foreach (List<string> program in MethodSyntax) { Console.WriteLine(program); } }
测试结果如下:
这时,我在想,要打印出与SelectMany相同的结果,只要下面的循环再多一层子循环就行:
这样子写法,再回去对照SelectMany,会不会有更进一步的理解?(特别是Method Syntax的写法,Select和SelectMany的写法,其实都一致,但结果会不一样,Select只返回上一层,SelectMany可以返回下一层具体的。)