You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用C# HashSet时如何实现添加重复元素强制抛出异常?

实现添加重复项抛出异常的HashSet等效结构

你可以通过以下两种常用方案实现需求:

方案一:继承HashSet并重写Add方法

直接继承HashSet<T>,仅修改Add方法的行为,当添加重复元素时抛出异常,其余方法完全复用HashSet的实现:

public class ThrowingHashSet<T> : HashSet<T>
{
    public new void Add(T item)
    {
        if (!base.Add(item))
        {
            throw new ArgumentException($"元素 {item} 已存在于集合中", nameof(item));
        }
    }
}

这个方案的优势是无需重新实现HashSet的其他功能(如Contains、Remove、遍历等),直接拥有HashSet的全部特性,仅改变重复添加时的处理逻辑,和Dictionary的Add行为完全对齐。

方案二:用Dictionary<T, object>封装

利用Dictionary<T, object>的Add方法本身会在键重复时抛出异常的特性,用字典模拟HashSet的行为,值使用一个占位符对象:

public class ThrowingHashSet<T>
{
    private readonly Dictionary<T, object> _innerDict = new Dictionary<T, object>();
    private static readonly object _placeholder = new object();

    public void Add(T item)
    {
        _innerDict.Add(item, _placeholder);
    }

    // 按需封装HashSet的其他核心方法
    public bool Contains(T item) => _innerDict.ContainsKey(item);
    public bool Remove(T item) => _innerDict.Remove(item);
    public int Count => _innerDict.Count;
    public void Clear() => _innerDict.Clear();
}

这个方案适合仅需要HashSet核心功能的场景,无需依赖HashSet的继承体系,同时天然复用Dictionary的重复键校验逻辑。

内容的提问来源于stack exchange,提问作者Eugene

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 17:03:11