LINQ操作符SelectMany的用法

 更新时间:2022年02月28日 11:25:05   作者:.NET开发菜鸟  
这篇文章介绍了LINQ操作符SelectMany的用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

SelectMany操作符提供了将多个from子句组合起来的功能,相当于数据库中的多表连接查询,它将每个对象的结果合并成单个序列。

示例:

student类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SelectMany操作符
{
    /// <summary>
    /// 学生类
    /// </summary>
    public class Student
    {
        //姓名
        public string Name { get; set; }
        //成绩
        public int Score { get; set; }
        //构造函数
        public Student(string name, int score)
        {
            this.Name = name;
            this.Score = score;
        }
    }
}

teacher类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SelectMany操作符
{
    /// <summary>
    /// Teacher类
    /// </summary>
    public class Teacher
    {
        //姓名
        public string Name { get; set; }
        //学生集合
        public List<Student> Students { get; set; }

        public Teacher(string name, List<Student> students)
        {
            this.Name = name;
            this.Students = students;
        }
    }
}

Program类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SelectMany操作符
{
    class Program
    {
        static void Main(string[] args)
        {
            //使用集合初始化器初始化Teacher集合
            List<Teacher> teachers = new List<Teacher> {
               new Teacher("徐老师",
               new List<Student>(){
                 new Student("宋江",80),
                new Student("卢俊义",95),
                new Student("朱武",45)
               }
               ),
                new Teacher("姜老师",
               new List<Student>(){
                 new Student("林冲",90),
                new Student("花荣",85),
                new Student("柴进",58)
               }
               ),
                new Teacher("樊老师",
               new List<Student>(){
                 new Student("关胜",100),
                new Student("阮小七",70),
                new Student("时迁",30)
               }
               )
            };

            //问题:查询Score小于60的学生
            //方法1:循环遍历、会有性能的损失
            foreach (Teacher t in teachers)
            {
                foreach (Student s in t.Students)
                {
                    if (s.Score < 60)
                    {
                        Console.WriteLine("姓名:" + s.Name + ",成绩:"+s.Score);
                    }
                }
            }

            //查询表达式
            //方法2:使用SelectMany  延迟加载:在不需要数据的时候,就不执行调用数据,能减轻程序和数据库的交互,可以提供程序的性能,执行循环的时候才去访问数据库取数据
            //直接返回学生的数据
            var query = from t in teachers
                        from s in t.Students
                        where s.Score < 60
                        select s;
            foreach (var item in query)
            {
                Console.WriteLine("姓名:" + item.Name + ",成绩:"+item.Score);
            }
            //只返回老师的数据
            var query1 = from t in teachers
                         from s in t.Students
                         where s.Score < 60
                         select new {
                            t,
                            teacherName=t.Name,
                            student=t.Students.Where(p=>p.Score<60).ToList()
                         };
            foreach (var item in query1)
            {
                Console.WriteLine("老师姓名:" + item.teacherName + ",学生姓名:" +item.student.FirstOrDefault().Name+ ",成绩:" + item.student.FirstOrDefault().Score);
            }
            // 使用匿名类 返回老师和学生的数据
            var query2 = from t in teachers
                         from s in t.Students
                         where s.Score < 60
                         select new { teacherName=t.Name, studentName=s.Name,studentScore=s.Score };
            foreach (var item in query2)
            {
                Console.WriteLine("老师姓名:" + item.teacherName + ",学生姓名:" + item.studentName + ",成绩:" + item.studentScore);
            }

            //使用查询方法
            var query3 = teachers.SelectMany(p => p.Students.Where(t=>t.Score<60).ToList());
            foreach (var item in query3)
            {
                Console.WriteLine("姓名:" + item.Name + ",成绩:" + item.Score);
            }
            Console.ReadKey();

        }
    }
}

到此这篇关于LINQ操作符SelectMany的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • C#查找字符串所有排列组合的方法

    C#查找字符串所有排列组合的方法

    这篇文章主要介绍了C#查找字符串所有排列组合的方法,涉及C#字符串操作的相关技巧,非常具有实用价值,需要的朋友可以参考下
    2015-04-04
  • Unity3d使用FairyGUI 自定义字体的操作

    Unity3d使用FairyGUI 自定义字体的操作

    由于本项目ui使用了第三方ui系统 fairyGUI 所以此文章主要讲述unity3d和fairygui搭配使用字体的过程
    2021-04-04
  • 详解如何利用C#实现汉字转拼音功能

    详解如何利用C#实现汉字转拼音功能

    这篇文章主要为大家详细介绍了如何利用C#实现汉字转拼音的功能,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-12-12
  • C#读取本地网络配置信息的方法小结

    C#读取本地网络配置信息的方法小结

    在现代软件开发中,处理网络配置信息是一个常见需求,无论是开发桌面、移动还是服务器应用程序,了解如何在C#中读取和管理网络配置信息都是非常有用的,本文将探讨在C#中读取本地网络配置信息的方法,并提供几个实际应用场景的示例,需要的朋友可以参考下
    2024-10-10
  • 详解C# Lazy Loading(延迟加载)

    详解C# Lazy Loading(延迟加载)

    这篇文章主要介绍了C# Lazy Loading(延迟加载)的相关资料,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下
    2021-04-04
  • C#实现最完整的文件和目录操作类实例

    C#实现最完整的文件和目录操作类实例

    这篇文章主要介绍了C#实现最完整的文件和目录操作类,涉及C#针对文件与目录的创建、获取、检测、删除等常用操作技巧,非常具有实用价值,需要的朋友可以参考下
    2015-05-05
  • C#使用ImitateLogin模拟登录百度

    C#使用ImitateLogin模拟登录百度

    这篇文章主要介绍了C#使用ImitateLogin模拟登录百度 的相关资料,需要的朋友可以参考下
    2015-12-12
  • 六大设计原则之开闭原则

    六大设计原则之开闭原则

    这篇文章介绍了六大设计原则之开闭原则,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-02-02
  • C#基于共享内存实现跨进程队列

    C#基于共享内存实现跨进程队列

    进程通信一般情况下比较少用,但是也有一些使用场景,有些做视频传输的似乎会用多进程来实现,还有在子进程中调用特定的库来避免内存泄漏,笔者最近也遇到了需要使用多进程的场景,本文介绍了C#基于共享内存实现跨进程队列,需要的朋友可以参考下
    2024-07-07
  • C#遍历List并删除某个元素的方法

    C#遍历List并删除某个元素的方法

    这篇文章主要介绍了C#遍历List并删除某个元素的方法,实例分析了正序与倒序遍历list及删除元素的使用技巧,需要的朋友可以参考下
    2015-02-02

最新评论