使用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
相关产品推荐
相关产品推荐

