C#开发-集合使用和技巧(十)Union用法-并集

在 C# 中,IEnumerable 的 Union 方法用于返回两个序列的并集。Union 方法会去除重复的元素,确保结果集中每个元素都是唯一的。以下是 Union 方法的基本用法:

基本语法

csharp 复制代码
public static IEnumerable<TSource> Union<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second);

public static IEnumerable<TSource> Union<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second, IEqualityComparer<TSource>? comparer);

参数说明

  • first: 第一个序列。
  • second: 第二个序列。
  • comparer:自定义比较器

示例

简单示例

假设我们有两个整数集合,我们希望将它们合并成一个集合,并去除重复的元素。

csharp 复制代码
var list1 = new List<int> { 1, 2, 3, 4, 5 };
var list2 = new List<int> { 4, 5, 6, 7, 8 };

使用 Union 方法

csharp 复制代码
var unionList = list1.Union(list2);

foreach (var item in unionList)
{
    Console.WriteLine(item);
}

输出

csharp 复制代码
1
2
3
4
5
6
7
8

在这个示例中,Union 方法将 list1 和 list2 合并成一个新的集合 unionList,并且去除了重复的元素 4 和 5。

自定义类型

如果你有一个自定义类型,你可以通过重写 Equals 和 GetHashCode 方法来确保 Union 方法正确地识别重复元素。

定义示例类

定义一个Person类,有ID和Name,我们定义只有Id和Name都相同才表示是相同

csharp 复制代码
public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }

    public override bool Equals(object obj)
    {
        if (obj is Person other)
        {
            return Id == other.Id && Name == other.Name;
        }
        return false;
    }

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

测试数据

csharp 复制代码
            var people1 = new List<Person>
            {
                new Person { Id = 1, Name = "丁一" },
                new Person { Id = 2, Name = "王二" },
            };

            var people2 = new List<Person>
            {
                new Person { Id = 2, Name = "王二" },
                new Person { Id = 3, Name = "张三" },
            };

使用 Union 方法

使用Union进行并集操作

csharp 复制代码
var unionPeople = people1.Union(people2);
foreach (var person in unionPeople)
{
    Console.WriteLine($"Id: {person.Id}, Name: {person.Name}");
}

输出

可以看到过滤到了里面的重复对象

测试数据2

csharp 复制代码
    var people1 = new List<Person>
    {
        new Person { Id = 1, Name = "丁一" },
        new Person { Id = 2, Name = "王二" },
    };

    var people2 = new List<Person>
    {
        new Person { Id = 2, Name = "王二1" },
        new Person { Id = 3, Name = "张三" },
    };

测试结果

可以看到名字不相同就没有过滤

注意事项

Union 方法默认使用元素的 Equals GetHashCode 方法来比较元素。

• 如果你需要自定义比较逻辑,可以使用 Union 的重载方法,该方法接受一个 IEqualityComparer 参数。

使用自定义比较器

在这个示例中,我们使用了一个自定义的 PersonComparer 来比较 Person 对象,确保 Union 方法根据 Id 进行比较。

使用自定义比较器进行 Union,创建一个自定义比较器PersonComparer 来比较,里面以Id为基准

csharp 复制代码
public class PersonComparer : IEqualityComparer<Person>
{
    public bool Equals(Person x, Person y)
    {
        if (x is null && y is null) return true;
        if (x is null || y is null) return false;
        return x.Id == y.Id;
    }

    public int GetHashCode(Person obj)
    {
        return obj.Id.GetHashCode();
    }
}

然后使用Union进行比较

csharp 复制代码
var customComparer = new PersonComparer();
var unionPeopleCustom = people1.Union(people2, customComparer);

foreach (var person in unionPeopleCustom)
{
    Console.WriteLine($"Id: {person.Id}, Name: {person.Name}");
}

结果

根据比较器,只根据Id进行了过滤

相关推荐
(Charon)几秒前
【C++】网络缓冲区设计(二):Ring Buffer环形缓冲区、head/tail与跨界读写
开发语言·c++
Java后端的Ai之路11 分钟前
LangChain Deep Agents 从入门到企业实战
开发语言·人工智能·python·langchain·deepagents
2601_9623815812 分钟前
Mac和Windows,哪种电脑适合新手学Python|数智码力分享
windows·python·mac·编程环境·学习入门
海盗123413 分钟前
微软技术周报 2026-08-31~09-07:GPT-6 Astra 登陆 Foundry、M365 全球认证故障复盘、C# 15 封闭层级
gpt·microsoft·c#
会飞的拖把15 分钟前
Python文件操作详解:从文件读写到os、shutil模块实战
开发语言·python
RS迷途小书童20 分钟前
Python 解析大疆无人机 SRT 字幕日志
开发语言·python·无人机
点心的游戏开发世界1 小时前
GDScript 入门笔记(十六):文件读写与数据持久化
开发语言·笔记·游戏引擎·godot
会飞的拖把1 小时前
Python序列详解:列表、元组、字符串的通用操作(超详细版)
开发语言·windows·python
reasonsummer1 小时前
【办公类-115-01】20260906育儿知识(家园小报)批量制作(2026年9月-2027年6月)
开发语言·数据库·c#
君顾11 小时前
智慧场馆解决方案小程序系统实战:从架构设计到上线指南
java·开发语言·智慧场馆