当前位置: 首页 > news >正文

C#高级:利用LINQ进行实体列表的集合运算

问题引入: 

Teacher实体的唯一标识符是Name和Classes字段(或者说这两个字段唯一确定一条数据),如何对两个实体列表做交集、差集运算呢?(并集直接调用AddRange方法即可)

一、重写方法实现

1.原理

        重写 Equals() GetHashCode() 方法,使用Intersect() Except() 方法在比较时就会基于这些字段来判断对象是否相等

2.快速生成代码

3.代码

public class Teacher
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Classes { get; set; }

    public override bool Equals(object obj)
    {
        return obj is Teacher teacher &&
               Name == teacher.Name &&
               Classes == teacher.Classes;
    }

    public override int GetHashCode()
    {
        return HashCode.Combine(Name, Classes);
    }
}

class Program
{
    static void Main()
    {
        // 创建两个示例列表
        List<Teacher> listA = new List<Teacher>
        {
            new Teacher { Id = 1, Name = "Alice", Classes = "Math" },
            new Teacher { Id = 2, Name = "Bob", Classes = "Science" },
            new Teacher { Id = 3, Name = "Charlie", Classes = "English" }
        };

        List<Teacher> listB = new List<Teacher>
        {
            new Teacher { Id = 2, Name = "Bob", Classes = "Science" },
            new Teacher { Id = 3, Name = "Charlie", Classes = "English" },
            new Teacher { Id = 4, Name = "David", Classes = "History" }
        };

        // 求交集
        var intersection = listA.Intersect(listB).ToList();

        // 求差集 A - B
        var difference = listA.Except(listB).ToList();


        // 输出结果
        Console.WriteLine("交集:");
        foreach (var teacher in intersection)
        {
            Console.WriteLine($"Id: {teacher.Id}, Name: {teacher.Name}, Classes: {teacher.Classes}");
        }

        Console.WriteLine("\n差集 A - B:");
        foreach (var teacher in difference)
        {
            Console.WriteLine($"Id: {teacher.Id}, Name: {teacher.Name}, Classes: {teacher.Classes}");
        }
    }
}

二、嵌套查询实现

1.原理

var intersection = listA.Where(a => listB.Any(b => b.Name == a.Name && b.Classes == a.Classes)).ToList();
var difference = listA.Where(a => !listB.Any(b => b.Name == a.Name && b.Classes == a.Classes)).ToList();

        where-Any相当于A表内连接B表( A ∩ B );

        where-!Any相当于A表左外连接B表并剔除匹配到的数据(A - B)。

2.代码

public class Teacher
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Classes { get; set; }
}

class Program
{
    static void Main()
    {
        // 创建两个示例列表
        List<Teacher> listA = new List<Teacher>
        {
            new Teacher { Id = 1, Name = "Alice", Classes = "Math" },
            new Teacher { Id = 2, Name = "Bob", Classes = "Science" },
            new Teacher { Id = 3, Name = "Charlie", Classes = "English" }
        };

        List<Teacher> listB = new List<Teacher>
        {
            new Teacher { Id = 2, Name = "Bob", Classes = "Science" },
            new Teacher { Id = 3, Name = "Charlie", Classes = "English" },
            new Teacher { Id = 4, Name = "David", Classes = "History" }
        };

        // 自定义方法来比较 Name 和 Classes
        var intersection = listA.Where(a => listB.Any(b => b.Name == a.Name && b.Classes == a.Classes)).ToList();
        var difference = listA.Where(a => !listB.Any(b => b.Name == a.Name && b.Classes == a.Classes)).ToList();

        // 输出交集
        Console.WriteLine("交集:");
        foreach (var teacher in intersection)
        {
            Console.WriteLine($"Id: {teacher.Id}, Name: {teacher.Name}, Classes: {teacher.Classes}");
        }

        // 输出差集
        Console.WriteLine("\n差集 A - B:");
        foreach (var teacher in difference)
        {
            Console.WriteLine($"Id: {teacher.Id}, Name: {teacher.Name}, Classes: {teacher.Classes}");
        }
    }
}

相关文章:

  • 基于SpringBoot的网上订餐系统(源码+数据库+万字文档+开题报告+ppt)
  • 核心知识——Spark核心数据结构:RDD
  • Libevent TCP开发指南
  • Python Web 框架 django-vue3-admin快速入门 django后台管理
  • STM32智能手表——任务线程部分
  • anaconda安装 创建虚拟环境+pycharm中conda环境配置
  • 复杂的数据类型03--指针和数组
  • 线程等待与唤醒的几种方法与注意事项
  • Scala 正则表达式
  • 【技术白皮书】ChatBI架构设计:如何构建上下文感知的企业级问答引擎?
  • 搭建FTP服务器
  • Mac 终端命令大全
  • 太阳能储能路灯杆:点亮绿色未来的新篇章
  • 视频孪生赋能电力数字化转型:构建智能电网的未来蓝图
  • 图解AUTOSAR_SWS_CANNetworkManagement
  • APScheduler定时
  • root账号修改密码
  • 【WRF工具】GIS4WRF详细介绍:配置 WPS/WRF
  • Metabase:一个免费开源的BI平台
  • Vue Transition组件类名+TailwindCSS
  • 中国旅马大熊猫“福娃”和“凤仪”启程回国
  • 多图|多款先进预警机亮相雷达展,专家:中国预警机已达世界先进水平
  • 气急败坏!20多名台湾艺人被台当局列为“重点核查对象”
  • 大外交丨3天拿下数万亿美元投资,特朗普在中东做经济“加法”和政治“减法”
  • 世界数字教育大会发布“数字教育研究全球十大热点”
  • 国家防汛抗旱总指挥部对15个重点省份开展汛前实地督导检查