C# HashSet

参考文章HashSet<T> 类 (System.Collections.Generic) | Microsoft Learn

HashSet 是 C# 中的一种集合类型,位于 System.Collections.Generic 命名空间内。它主要用于存储一组不重复的元素,这些元素没有固定的顺序。HashSet 是基于哈希表实现的,这意味着它的内部结构允许高效的查找、添加和删除操作,通常情况下这些操作的时间复杂度接近 O(1),即常数时间复杂度。

构造函数

HashSet<T>()

初始化 HashSet<T> 类的新实例,该实例为空,并为集类型使用默认相等比较器。

HashSet<T>(IEnumerable<T>)

初始化 HashSet<T> 类的新实例,该实例使用集类型的默认相等比较器,包含从指定集合复制的元素,并且有足够的容量来容纳复制的元素数。

HashSet<T>(IEnumerable<T>, IEqualityComparer<T>)

初始化 HashSet<T> 类的新实例,该实例使用集类型的指定相等比较器,包含从指定集合复制的元素,并且有足够的容量来容纳复制的元素数。

HashSet<T>(IEqualityComparer<T>)

初始化 HashSet<T> 类的新实例,该实例为空,并为集类型使用指定的相等比较器。

HashSet<T>(Int32)

初始化 HashSet<T> 类的新实例,该实例为空,但为 capacity 项保留空间,并为集类型使用默认相等比较器。

HashSet<T>(Int32, IEqualityComparer<T>)

初始化 HashSet<T> 类的新实例,该实例使用集类型的指定相等比较器,并且有足够的容量来容纳 capacity 元素。

HashSet<T>(SerializationInfo, StreamingContext)

已过时.

使用序列化的数据初始化 HashSet<T> 类的新实例。

方法

Add(T)

将指定的元素添加到集。

Clear()

从 HashSet<T> 对象中删除所有元素。

Contains(T)

确定 HashSet<T> 对象是否包含指定的元素。

CopyTo(T[])

将 HashSet<T> 对象的元素复制到数组。

CopyTo(T[], Int32)

从指定的数组索引开始,将 HashSet<T> 对象的元素复制到数组。

CopyTo(T[], Int32, Int32)

从指定的数组索引开始,将 HashSet<T> 对象的指定元素数复制到数组。

CreateSetComparer()

返回一个 IEqualityComparer 对象,该对象可用于 HashSet<T> 对象的相等性测试。

EnsureCapacity(Int32)

确保此哈希集可以保留指定数量的元素,而无需进一步扩展其后盾存储。

Equals(Object)

确定指定的对象是否等于当前对象。

(继承自 Object)
ExceptWith(IEnumerable<T>)

从当前 HashSet<T> 对象中删除指定集合中的所有元素。

GetEnumerator()

返回循环访问 HashSet<T> 对象的枚举数。

GetHashCode()

用作默认哈希函数。

(继承自 Object)
GetObjectData(SerializationInfo, StreamingContext)

已过时.

实现 ISerializable 接口并返回序列化 HashSet<T> 对象所需的数据。

GetType()

获取当前实例的 Type

(继承自 Object)
IntersectWith(IEnumerable<T>)

修改当前 HashSet<T> 对象以仅包含该对象和指定集合中存在的元素。

IsProperSubsetOf(IEnumerable<T>)

确定 HashSet<T> 对象是否为指定集合的适当子集。

IsProperSupersetOf(IEnumerable<T>)

确定 HashSet<T> 对象是否为指定集合的适当超集。

IsSubsetOf(IEnumerable<T>)

确定 HashSet<T> 对象是否为指定集合的子集。

IsSupersetOf(IEnumerable<T>)

确定 HashSet<T> 对象是否为指定集合的超集。

MemberwiseClone()

创建当前 Object的浅表副本。

(继承自 Object)
OnDeserialization(Object)

实现 ISerializable 接口,并在反序列化完成时引发反序列化事件。

Overlaps(IEnumerable<T>)

确定当前 HashSet<T> 对象和指定的集合是否共享公共元素。

Remove(T)

从 HashSet<T> 对象中删除指定的元素。

RemoveWhere(Predicate<T>)

从 HashSet<T> 集合中删除与指定谓词定义的条件匹配的所有元素。

SetEquals(IEnumerable<T>)

确定 HashSet<T> 对象和指定的集合是否包含相同的元素。

SymmetricExceptWith(IEnumerable<T>)

修改当前 HashSet<T> 对象以仅包含该对象或指定集合中存在的元素,但不包含两者。

ToString()

返回一个表示当前对象的字符串。

(继承自 Object)
TrimExcess()

将 HashSet<T> 对象的容量设置为它包含的实际元素数,向上舍入到附近特定于实现的值。

TryGetValue(T, T)

搜索集合中的给定值,并返回其查找的等值(如果有)。

UnionWith(IEnumerable<T>)

修改当前 HashSet<T> 对象,以包含本身、指定集合或两者中存在的所有元素。

以下是 HashSet 的一些主要特点和操作:

  1. 唯一性HashSet 中的每个元素都是唯一的,试图向 HashSet 中添加一个已经存在的元素不会改变 HashSet 的状态,同时返回 false 表示添加操作未能成功执行。

  2. 无序性:虽然元素是以某种内部结构存储的,但 HashSet 不保证元素的存储顺序,元素的存储顺序可能与插入顺序不同。

  3. 高效性:由于 HashSet 内部使用哈希表实现,所以它提供了非常快的查找、插入和删除操作。

  4. 集合操作HashSet 提供了一系列集合操作方法,比如 UnionWith(并集)、IntersectWith(交集)、ExceptWith(差集)、IsSubsetOf(是否为子集)、IsSupersetOf(是否为超集)、Overlaps(重叠)等。

  5. 初始化:可以通过多种方式初始化 HashSet,包括直接创建空的 HashSet,或者通过集合初始化器一次性添加多个元素。

  6. 遍历:可以使用 foreach 循环遍历 HashSet 中的元素,但不能通过索引访问元素,因为 HashSet 不支持索引。

  7. 容量调整HashSet 可以自动调整其内部存储容量以适应元素数量的变化。

示例代码

以下是一个简单的 HashSet 使用示例,展示了如何创建、添加元素、检查元素是否存在以及执行集合操作:

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        // 创建一个整数类型的 HashSet
        HashSet<int> numbers = new HashSet<int>();

        // 添加元素
        numbers.Add(1);
        numbers.Add(2);
        numbers.Add(3);

        // 尝试添加一个已存在的元素
        bool added = numbers.Add(2); // 返回 false,因为元素 2 已经存在

        // 检查元素是否存在
        bool exists = numbers.Contains(2); // 返回 true

        // 执行集合操作
        HashSet<int> moreNumbers = new HashSet<int> { 3, 4, 5 };
        numbers.UnionWith(moreNumbers); // 合并两个集合

        // 输出集合中的所有元素
        foreach (int num in numbers)
        {
            Console.WriteLine(num);
        }

        // 输出结果可能是:1 2 3 4 5(顺序不定)
    }
}

在这个例子中,numbersmoreNumbers 两个 HashSet 通过 UnionWith 方法合并成了一个更大的集合。注意输出的结果中元素的顺序不是固定的,因为 HashSet 不保证元素的顺序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值