C#数据结构 HashSet 用法
原文链接:https://www.cnblogs.com/jk-2048/p/18030587
https://blog.csdn.net/xiongyanglai/article/details/136473932
1、所属命名空间
.NET 3.5在 System.Collections.Generic 命名空间中包含一个新的集合类:HashSet
这个集合类包含不重复项的无序列表称作HashSet。(类似C++的unordered_set?)
这个集合基于散列hash值,插入元素的操作非常快,不需要像List类那样重排集合。
2、操作函数表
Add重载:
Hashset还提供了另一个Add()方法重载。它返回一个布尔值,说明是否添加了元素。如果该元素已经在集中,就不添加它,并返回false。
以下代码优化:
if (dto.EkorgCode == "1" || dto.EkorgCode == "2" || dto.EkorgCode == "3" || dto.EkorgCode == "4") { }
优化后:
// 定义EkorgCode的集合 var ekorgCodes = new HashSet<string> { "1", "2", "3", "4" }; // 检查dto的EkorgCode是否在ekorgCodes集合中 if (ekorgCodes.Contains(dto.EkorgCode)) { }
总结
HashSet 是C#中的一个集合类,它位于 System.Collections.Generic 命名空间中。HashSet 实现了 ISet 接口,并且是一个无序的集合,它不允许有重复的元素。HashSet 使用哈希算法来存储和检索元素,这意味着查找、添加和删除操作通常具有接近O(1)的平均时间复杂度,这是非常高效的。
下面是HashSet的一些主要特点和用法:
特点
无序性:HashSet不保证元素的顺序,也就是说,元素的插入顺序可能与遍历时的顺序不同。
唯一性:HashSet不允许有重复的元素。尝试添加一个已经存在的元素将不会有任何效果。
高性能:由于使用哈希表作为内部数据结构,HashSet提供了非常快速的查找、添加和删除操作。
不支持索引:由于是无序的,HashSet不支持通过索引来访问元素。
线程不安全:HashSet不是线程安全的,如果在多线程环境中使用,需要额外的同步措施
基本示例:
using System; using System.Collections.Generic; class Program { static void Main() { // 创建一个HashSet<int>的实例 HashSet<int> numbers = new HashSet<int>(); // 向HashSet中添加元素 numbers.Add(1); numbers.Add(2); numbers.Add(3); // 尝试添加一个已经存在的元素,不会有任何效果 numbers.Add(2); // 检查一个元素是否在HashSet中 bool containsFour = numbers.Contains(4); // 返回false,因为4不在集合中 // 遍历HashSet中的所有元素 foreach (int number in numbers) { Console.WriteLine(number); } // 移除一个元素 numbers.Remove(1); // 清除所有元素 numbers.Clear(); } }