c#_HashSet

Posted x1angzeeD.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c#_HashSet相关的知识,希望对你有一定的参考价值。

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中没有的元素将会输出:

以上是关于c#_HashSet的主要内容,如果未能解决你的问题,请参考以下文章

Python设置交集比Rust HashSet交集更快

JavaSE_坚持读源码_HashSet对象_Java1.7

java基础进阶篇_HashSet------java源码栈

定义:啥是HashSet?

《java入门第一季》之HashSet存储元素保证唯一性的代码及图解

discuz X3.1 源代码阅读,记录代码片段