LINQ SelectMany Method in C#

发布时间 2023-09-22 15:14:19作者: katesharing

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可以返回下一层具体的。)