HashSet介绍
HashSet为System.Collections.Generic
命名空间下的 HashSet<T>
类,它具有无序性、唯一性。
由于他的特性所以他不能做排序操作、不能像数组那样使用索引(无法使用for循环(foreach可以))、不能有重复元素。
注意:HashSet 可以存放单个的 null 值;如果你向HashSet中添加重复元素HashSet会忽略此次操作。
HashSet应用
1、根据HashSet的构造函数重载,声明HashSet实例时构造函数实参可以用集类型
static void Main(string[] args)
{
string[] cities = new string[]
{
"Delhi" , "Kolkata",
"New York" , "London",
"Tokyo" , "Washington",
"Tokyo"
};
HashSet<string> hashSet = new HashSet<string>(cities);
foreach (var city in hashSet)
{
Console.WriteLine(city);
}
}
2、判断某一个元素是否在 HashSet 内,建议使用 Contains 进行判断
static void Main(string[] args)
{
HashSet<string> hashSet = new HashSet<string>();
hashSet.Add("A");
hashSet.Add("B");
hashSet.Add("C");
hashSet.Add("D");
if (hashSet.Contains("D"))
Console.WriteLine("The required element is available.");
else
Console.WriteLine("The required element isn’t available.");
Console.ReadKey();
}
3、从 HashSet 中移除元素Remove、RemoveWhere
1)Remove
如果成功找到并移除该元素,则为 true
;否则为 false
。 如果未在 HashSet<T> 对象中找到 item
,则此方法返回 false
。
2)RemoveWhere
参数为Predicate<T> 委托,用于定义要移除的元素应满足的条件。返回值为(Int32)集合中移除的元素数。
我的理解是他拿着这个条件去HashSet实例中去判断元素是否满足移除条件,满足则移除,并返回移除了多少个元素。
HashSet<int> numbers = new HashSet<int>();
for (int i = 0; i < 20; i++) {
numbers.Add(i);
}
// Display all the numbers in the hash table.
Console.Write("numbers contains {0} elements: ", numbers.Count);
DisplaySet(numbers);
// Remove all odd numbers.
numbers.RemoveWhere(IsOdd);
Console.Write("numbers contains {0} elements: ", numbers.Count);
DisplaySet(numbers);
// Check if the hash table contains 0 and, if so, remove it.
if (numbers.Contains(0)) {
numbers.Remove(0);
}
Console.Write("numbers contains {0} elements: ", numbers.Count);
DisplaySet(numbers);
bool IsOdd(int i)
{
return ((i % 2) == 1);
}
void DisplaySet(HashSet<int> set)
{
Console.Write("{");
foreach (int i in set)
Console.Write(" {0}", i);
Console.WriteLine(" }");
}
// This example displays the following output:
// numbers contains 20 elements: { 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 }
// numbers contains 10 elements: { 0 2 4 6 8 10 12 14 16 18 }
// numbers contains 9 elements: { 2 4 6 8 10 12 14 16 18 }
3)clear
如果你想删除 HashSet 中的所有元素,可以调用 Clear ()方法。
4、HashSet 的 set 操作
1)IsProperSubsetOf
它用于判断 HashSet 是否为某一个集合的完全子集
HashSet<string> setA = new HashSet<string>() { "A", "B", "C", "D" };
HashSet<string> setB = new HashSet<string>() { "A", "B", "C", "X" };
HashSet<string> setC = new HashSet<string>() { "A", "B", "C", "D", "E" };
if (setA.IsProperSubsetOf(setC))
Console.WriteLine("setC contains all elements of setA.");
if (!setA.IsProperSubsetOf(setB))
Console.WriteLine("setB does not contains all elements of setA.");
2)UnionWith
它常用于集合的合并
HashSet<string> setA = new HashSet<string>() { "A", "B", "C", "D", "E" };
HashSet<string> setB = new HashSet<string>() { "A", "B", "C", "X", "Y" };
setA.UnionWith(setB);
//SetA集合将会是包括:"A", "B", "C", "D", "E", "X", "Y"
3)IntersectWith
表示两个 HashSet 的交集
HashSet<string> setA = new HashSet<string>() { "A", "B", "C", "D", "E" };
HashSet<string> setB = new HashSet<string>() { "A", "X", "C", "Y"};
setA.IntersectWith(setB);
//setA集合元素结果为:"A", "C"
4)ExceptWith
表示数学上的减法操作,这个时间复杂度是 O(N),假定你有两个HashSet 集合,分别叫 setA 和 setB,并且用了下面的语句。
它返回的元素为:setA中有而setB中没有 的最终结果
HashSet<string> setA = new HashSet<string>() { "A", "B", "C", "D", "E" };
HashSet<string> setB = new HashSet<string>() { "A", "X", "C", "Y" };
setA.ExceptWith(setB);
//setA集合元素结果为:"B", "D", "E"
5)SymmetricExceptWith
常用于修改一个 HashSet 来存放两个 HashSet 都是唯一的元素,换句话说,我要的就是两个集合都不全有的元素
HashSet<string> setA = new HashSet<string>() { "A", "B", "C", "D", "E" };
HashSet<string> setB = new HashSet<string>() { "A", "X", "C", "Y" };
setA.SymmetricExceptWith(setB);
setA中有而setB中没有 和 setB中有而setA中没有的元素将会输出: