C# 中的 HashSet 使用入门






3.86/5 (15投票s)
HashSet 是 .NET/C# 中非常有用的,但同时也是被低估的功能之一。让我们深入探讨一下...
引言
在数学意义上,Hashset
是一个新项目的集合,它不允许你在其中存储重复项。这种行为在许多场景中都很有用,例如,你正在维护一个部门的员工列表,在这种情况下,你必须确保没有员工被添加两次。在这种情况下,HashSet 将强制执行该规则。最流行且过度使用的泛型类型 - List<T>
在这种情况下无法提供帮助。
谁应该阅读这篇文章?
任何试图在他们的应用程序中使用 HashSet<T>
数据结构的 C# 开发者。
使用代码
让我们直接进入编码,并动手实践一下。
创建一个控制台应用程序来探索它。并将以下代码放入其中。
HashSet<int> intSet = new HashSet<int>();
intSet.Add(1);
intSet.Add(2);
intSet.Add(3);
intSet.Add(2);
foreach (var item in intSet)
{
Console.WriteLine(item);
}
Console.ReadLine();
上面,我们声明了一个 HashSet<int>
对象。 在该对象中,我们添加了 4 个整数 1,2,3,2。 所以我们两次添加了整数 2。 当我们枚举集合并显示它时,我们会看到它只显示 1,2,3,2 没有被第二次添加。
使用 HashSet 进行数学运算
我们可以使用 HashSet<T>
进行基于集合的运算。
使用交集
var set1 = new HashSet<int>() { 1, 2, 3 }; var set2 = new HashSet<int>() { 2, 3, 4 }; set1.IntersectWith(set2); foreach (var item in set1) { Console.WriteLine(item); }
所以我们有两个集合,并且我们正在尝试找到它们之间的交集。 尝试这个程序并查看它的输出。 它应该是 { 2 , 3 }。
使用并集
var set1 = new HashSet<int>() { 1, 2, 3 }; var set2 = new HashSet<int>() { 2, 3, 4 }; set1.UnionWith(set2); foreach (var item in set1) { Console.WriteLine(item); }
使用 UnionWith
我们可以得到两个集合的并集。 上述程序的输出应该是 { 1,2,3,4 }。
使用 HashSet<T> 比较两个对象
当添加具有相同属性的两个对象时,HashSet
会毫不犹豫地添加它们。
HashSet<Employee> set = new HashSet<Employee>(); set.Add(new Employee { Name = "Subha" }); set.Add(new Employee() { Name = "Subha" }); foreach (var item in set) { Console.WriteLine(item.Name); }
在上面的例子中,HashSet<T>
没有关于 Employee
对象是否相同的信息。 因此,它会将它们都添加为它们是单独的对象引用。
但是,绝对不能将相同的对象引用添加到 HashSet<T> 中。
HashSet<Employee> set = new HashSet<Employee>(); var employee = new Employee() { Name = "Subham"}; set.Add(employee); set.Add(employee); foreach (var item in set) { Console.WriteLine(item.Name); }
在上面的例子中,由于我们试图添加相同的对象引用,HashSet<T>
不允许这样做。 相反,它只会添加一个对象。