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

LINQ - Concat、Union、Intersect、Except

在 C# LINQ 中,ConcatUnionIntersectExcept 是处理集合合并/筛选的核心方法,覆盖拼接、去重合并、交集、差集四大核心场景。结合你提供的宠物(pets)/宠物主人(people)代码示例,以下是清晰的对比、用法和实操演示:

一、核心方法总览

方法 核心作用 是否去重 顺序/对称性 关键特点
Concat 拼接两个集合(A + B),保留所有元素 ❌ 不去重 有序(A在前,B在后)、不对称 简单拼接,重复元素会保留
Union 合并两个集合并去重(A ∪ B) ✅ 去重 无序、对称(A.Union(B)=B.Union(A)) 合并后仅保留唯一元素
Intersect 取两个集合的交集(同时存在于A和B的元素) ✅ 去重 无序、对称 只保留“共有元素”
Except 取两个集合的差集(A有、B没有的元素) ✅ 去重 有序、不对称(A.Except(B)≠B.Except(A)) 只保留“A独有的元素”

二、结合宠物示例的实操演示

基于你提供的基础代码(pets 含8只宠物,people 关联前6只),逐个演示:

1. Concat(拼接)

场景:拼接“猫集合”和“狗集合”,保留所有元素(包括重复)

// 筛选猫、狗集合
IEnumerable<Pet> cats = pets.Where(p => p.Type == PetType.Cat); // ID:2、3、7、8
IEnumerable<Pet> dogs = pets.Where(p => p.Type == PetType.Dog); // ID:4、5、6// 拼接(猫在前,狗在后,无去重)
var concatResult = cats.Concat(dogs);// 输出:2、3、7、8、4、5、6(共7个元素,无去重)
foreach (var pet in concatResult)
{Console.WriteLine($"Concat: {pet.Name} (ID:{pet.Id})");
}

2. Union(合并去重)

场景:合并“被主人关联的猫”和“所有猫”,自动去重

// 被主人关联的猫(ID:2、3)
IEnumerable<Pet> ownedCats = people.SelectMany(p => p.Pets).Where(p => p.Type == PetType.Cat);
// 所有猫(ID:2、3、7、8)
IEnumerable<Pet> allCats = pets.Where(p => p.Type == PetType.Cat);// 合并去重
var unionResult = ownedCats.Union(allCats);// 输出:2、3、7、8(仅保留唯一元素,无重复)
foreach (var pet in unionResult)
{Console.WriteLine($"Union: {pet.Name} (ID:{pet.Id})");
}

3. Intersect(交集)

场景:找出“既是猫、又被主人关联”的宠物

// 所有猫
IEnumerable<Pet> allCats = pets.Where(p => p.Type == PetType.Cat);
// 被主人关联的宠物(ID:1-6)
IEnumerable<Pet> ownedPets = people.SelectMany(p => p.Pets);// 交集(猫 + 被主人关联)
var intersectResult = allCats.Intersect(ownedPets);// 输出:2(Anthony)、3(Ed)(仅这两只猫被主人关联)
foreach (var pet in intersectResult)
{Console.WriteLine($"Intersect: {pet.Name} (ID:{pet.Id})");
}

4. Except(差集)

场景1:找出“是猫、但未被主人关联”的宠物(A=所有猫,B=被主人关联的宠物)

var unownedCats = allCats.Except(ownedPets);
// 输出:7(Storm)、8(Nyan)(这两只猫无主人)// 场景2:反向差集(B.Except(A))—— 被主人关联、但不是猫的宠物
var ownedNonCats = ownedPets.Except(allCats);
// 输出:1(鱼)、4/5/6(狗)

三、关键注意事项

1. 自定义类型的相等性(核心)

所有方法默认按“引用”比较自定义类(如 Pet),需实现 IEquatable<T> 或重写 Equals/GetHashCode,否则会失效:

public class Pet : IEquatable<Pet>
{public int Id { get; set; }public string Name { get; set; }public PetType Type { get; set; }public float Weight { get; set; }// 按ID判断相等(业务核心标识)public bool Equals(Pet other) => other != null && Id == other.Id;public override int GetHashCode() => Id.GetHashCode();
}

2. 空值处理

  • Concat:保留所有 null(若集合含 null);
  • Union/Intersect/Except:仅当两边都有 null 时,Intersect 会保留;Union 仅保留一个 null;Except 仅当A有null、B无null时保留。

3. 性能提示

  • 所有方法均为延迟执行,遍历结果时才真正计算;
  • 对大集合操作时,可先转 HashSet<T> 提升效率(如 new HashSet<Pet>(pets).Intersect(ownedPets))。

四、快速记忆口诀

  • Concat:简单拼,不查重;
  • Union:合并后,去重留唯一;
  • Intersect:找共有,两边都有才保留;
  • Except:找独有,只留A有B没有的。
http://www.jsqmd.com/news/139042/

相关文章:

  • 2025年纳西姆真空泵行业口碑排名,纳西姆真空泵好用不 - 工业推荐榜
  • 【质谱AI技术突破】:Open-AutoGLM地址曝光,科研效率提升300%的秘密武器
  • 智谱Open-AutoGLM如何安装?:新手必看的5步极速配置教程
  • 【完整源码+数据集+部署教程】字母识别检测系统源码[一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]
  • 2025 NAKANISHI代理经销商TOP5权威推荐:专业度/售后/交货速度深度测评 - mypinpai
  • 两坝一峡与升船机线路区别解析测评与权威指南:基于实测数据行程选择分析 - 品牌推荐
  • 2025 年心理咨询平台五强推荐:权威认证,专业护航心理健康 - 博客万
  • 在有真实标签 (Ground Truth) 的情况下,常用的指标有哪些?聚类指标有哪些?
  • leetcode 困难题 778. Swim in Rising Water 水位上升的泳池中游泳
  • 【完整源码+数据集+部署教程】智慧交通执法巡检检测系统源码[一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]
  • 移动泵车行业格局:2025年头部企业、实力厂商与知名品牌深度解读 - 品牌推荐大师1
  • 2025年创新数字厨房厂家推荐,数字厨房用品供应商口碑排名全解析 - myqiye
  • 2025.12.25日14:10-fall asleep进入梦乡,睡着
  • Excel获取sheet名称
  • 2025琴式控制柜优质供应商TOP5权威推荐:甄选推荐琴式控制柜制造商 - 工业品牌热点
  • Python圣诞帽圣诞树限时返场
  • docker安装zlmediakit
  • 《对谈校准:一场关于价值如何从“默算”走向“星图”的共鸣》
  • 从部署到优化,Open-AutoGLM连接AI硬件的5大核心步骤,90%的工程师都忽略了第3步
  • 2025年度智能温控烘干机变频烘干机公司TOP5权威推荐 - 工业品牌热点
  • 两坝一峡与升船机线路区别解析测评:基于行程实测与权威游览指南的深度分析 - 品牌推荐
  • 2025特殊作业管理系统推荐榜:作业票管理系统/电子特殊作业票系统/ai特殊作业管理服务商精选 - 品牌推荐官
  • 面向印尼市场,2025年优选Safeguard Global名义雇主EOR服务商 - 品牌2025
  • 详细介绍:关于解决springcloud 创建bean失败的问题
  • FWT 相关做题记录
  • 2025年葡萄酒发酵罐批发厂家权威推荐榜单:不锈钢啤酒罐/厌氧发酵实训设备/蓝莓酒发酵罐源头厂家精选 - 品牌推荐官
  • BP85928D 智能小家电辅助电源芯片 典型应用电路(替代方案FT8451B/FT8451H无需改板)
  • 基于CANN多Stream异步执行的智能推理管道:突破传统串行瓶颈 - 教程
  • 基于CANN多Stream异步执行的智能推理管道:突破传统串行瓶颈 - 教程
  • 2025拓展巴西市场:为何推荐Safeguard Global名义雇主EOR服务 - 品牌2025