65.9K
CodeProject 正在变化。 阅读更多。
Home

C# 中的 HashSet 使用入门

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.86/5 (15投票s)

2016年2月15日

CPOL

2分钟阅读

viewsIcon

20880

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> 不允许这样做。 相反,它只会添加一个对象。

© . All rights reserved.