C# HashSet 用法

.NET 3.5在System.Collections.Generic命名空間中包含一個新的集合類:HashSet。這個集合類包含不重複項的無序列表。這種集合稱爲“集(set)”。集是一個保留字,所以該類有另一個名稱HashSet。這個名稱很容易理解,因爲這個集合基於散列值,插入元素的操作非常快,不需要像List類那樣重排集合。

HashSet類提供的方法可以創建合集和交集。
在這裏插入圖片描述

在這裏插入圖片描述

在示例代碼中,創建了3個字符串類型的新集,並用一級方程式汽車填充。HashSet類實現了ICollection接口。但是在該類中,Add()方法是顯式實現的,還提供了另一個Add()方法。Add()方法的區別是返回類型,它返回一個布爾值,說明是否添加了元素。如果該元素已經在集中,就不添加它,並返回false。

HashSet < string > companyTeams =new HashSet < string > (){ "Ferrari", "McLaren", "Toyota", "BMW","Renault", "Honda" };

HashSet < string > traditionalTeams =new HashSet < string > (){ "Ferrari", "McLaren" };

HashSet < string > privateTeams =new HashSet < string > (){ "Red Bull", "Toro Rosso", "Spyker","Super Aguri" };

if (privateTeams.Add("Williams"))
    Console.WriteLine("Williams added");
if (!companyTeams.Add("McLaren"))
    Console.WriteLine("McLaren was already in this set");

兩個Add()方法的輸出寫到控制檯上:

Williams added

McLaren was already in this set

方法IsSubsetOf()和IsSupersetOf()比較集和實現了IEnumerable接口的集合,返回一個布爾結果。這裏,IsSubsetOf()驗證traditionalTeams中的每個元素是否都包含在companyTeams中,IsSupersetOf()驗證traditionalTeams是否沒有與companyTeams比較的額外元素。

if (traditionalTeams.IsSubsetOf(companyTeams))
{
  Console.WriteLine("traditionalTeams is " +"subset of companyTeams");
}

if (companyTeams.IsSupersetOf(traditionalTeams))
{
  Console.WriteLine("companyTeams is a superset of " +"traditionalTeams");
}

這個驗證的結果如下:

traditionalTeams is a subset of companyTeams

companyTeams is a superset of traditionalTeams

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/pretyjfh/archive/2010/08/08/579493.aspx

HashSet 用法

.NET 3.5在System.Collections.Generic命名空間中包含一個新的集合類:HashSet。這個集合類包含不重複項的無序列表。這種集合稱爲“集(set)”。集是一個保留字,所以該類有另一個名稱HashSet。這個名稱很容易理解,因爲這個集合基於散列值,插入元素的操作非常快,不需要像List類那樣重排集合。

HashSet類提供的方法可以創建合集和交集。

創建HashSet:

HashSet hs = new HashSet();

HashSet companyTeams = new HashSet() { “Ferrari”, “McLaren”, “Toyota”, “BMW”, “Renault”, “Honda” };

HashSet改變集的值的方法:

Add(): 如果某元素不在集合中,Add()方法就把該元素添加到集合中。在其返回值Boolean中,返回元素是否添加的信息

eg:

if (!companyTeams.Add(“McLaren”))
Console.WriteLine(“McLaren was already in this set”);

Clear():方法Clear()刪除集合中的所有元素

eg: companyTeams.Clear();

Remove():Remove()方法刪除指定的元素

eg: companyTeams.Remove(“McLaren”);

RemoveWhere(): RemoveWhere()方法需要一個Predicate委託作爲參數。刪除滿足謂詞條件的所有元素

Predicate 可以委託給一個函數或者一個拉姆達表達式:

委託給拉姆達表達式:

eg:
companyTeams.RemoveWhere(company => { if (company.Length > 5) { return true; } else { return false; } });

委託給一個函數:

eg:

companyTeams.RemoveWhere(CheckLength);

public bool CheckLength(string company)
{
return company.Length > 5 ? true : false;
}

CopyTo(): CopyTo()把集合中的元素複製到一個數組中

eg:

string[] strArray = new string[companyTeams.Count];
companyTeams.CopyTo(strArray);
foreach (string str in strArray)
{
Console.WriteLine(str);
}

ExceptWith():ExceptWith()方法把一個集合作爲參數,從集中刪除該集合中的所有元素

eg:

companyTeams.ExceptWith(privateTeams);
foreach (var str in companyTeams)
{
Console.WriteLine(str);
}

UnionWith():UnionWith()方法把傳送爲參數的集合中的所有元素添加到集中

eg:

companyTeams.UnionWith(privateTeams);
foreach (var str in companyTeams)
{
Console.WriteLine(str);
}

HashSet僅返回集的信息、不修改元素的方法。

Contains():如果所傳送的元素在集合中,方法Contains()就返回true

eg:

if (companyTeams.Contains(“BMW”))
{
Console.WriteLine(“companyTeams contains “BMW””);
}

IsSubsetOf():如果參數傳送的集合是集的一個子集,方法IsSubsetOf()就返回true

eg:

if (traditionalTeams.IsSubsetOf(companyTeams))
{
Console.WriteLine("traditionalTeams is " + “subset of companyTeams”);
}

IsSupersetOf():如果參數傳送的集合是集的一個超集,方法IsSupersetOf()就返回true

eg:
if (companyTeams.IsSupersetOf(traditionalTeams))
{
Console.WriteLine("companyTeams is a superset of " + “traditionalTeams”);
}

Overlaps():如果參數傳送的集合中至少有一個元素與集中的元素相同,Overlaps()就返回true

eg:

traditionalTeams.Add(“Williams”);
if (privateTeams.Overlaps(traditionalTeams))
{
Console.WriteLine("At least one team is " + "the same with the traditional " + “and privateteams”);
}

SetEquals():如果參數傳送的集合和集包含相同的元素,方法SetEquals()就返回true

http://www.cnblogs.com/xiaopin/archive/2011/01/08/193050.html

HashSet是以數學Set集合爲基礎的,使用HashSet可以提高集合的運算。使用HashSet集合不自帶排序方法,如果需要排序的需求可以參考使用List集合配合Sort方法。

HashSet的優勢在與運算快,作爲一種存放在內存的數據,可以很快的進行設置和取值的操作。HashSet無法向裏面添加重複的數據,避免添加HashSet裏面的數據重複。我們使用HashSet常常在集合相加集合相減這些集合與集合之間的操作之中。

使用HashSet作爲內存存儲的快速數據庫,這個需要隨時跟新HashSet裏面的數據,因爲在HashSet中一個長時間未被訪問的數據,將被系統自動回收掉,那麼就會導致失敗,那麼如何才能保證HashSet裏面的值是長存在的而且達到不斷的更新裏面的值呢?

首先程序過來訪問我們HashSet裏面有沒有需要的數據,如果有我們需要的數據就直接返回給用戶,不用調用查詢數據庫的操作。如果HashSet裏面沒有我們需要的數據,程序再去查詢一次數據庫是否有該Query數據,如果有返回給用戶同時把查詢的結果添加到HashSet裏面,這麼做可以一定程度的降低查詢數據庫所帶來的不便,但是不能根除,需要進一步提升性能,可以查看前面的緩存策略使用memcached來提高網站查詢和訪問。

兩個集合的並集

HashSet<int> numbers1;
HashSet<int> numbers2;
//分別進行numbers1和numbers2的值初始化或賦值
numbers1.UnionWith(numbers2);//求兩個集合的並集。

求兩個集合的交集

HashSet<int> numbers1;
HashSet<int> numbers2;
//分別進行numbers1和numbers2的值初始化或賦值
numbers1.IntersectWith(numbers2);//求兩個集合的交集。

求兩個集合的差集

HashSet<int> numbers1;
HashSet<int> numbers2;
//分別進行numbers1和numbers2的值初始化或賦值
numbers1.ExceptWith(numbers2);//求兩個集合的差集。

求兩個集合的對稱差集

HashSet<int> numbers1;
HashSet<int> numbers2;
//分別進行numbers1和numbers2的值初始化或賦值
numbers1.SymmetricExceptWith(numbers2);//求兩個集合的對稱差集。

.HashSet常用擴展方法

2.1.Add,將項目添加到HashSet之中。

2.2.Clear,清空HashSet裏面的值。

2.3.Remove,從HashSet中移除值。

2.4Contains,判斷HashSet是否包含指定項目。

2.4Equals(Object),判斷是否相等。

HashSet與Linq操作
HashSet與LINQ的對等的方法

UnionWith ==> Union

IntersectWith ==> Interset

ExceptWith ==> Except

不提供排序 ==> Distinct

那麼我們已經有很多的集合類型如List ,Dictionary<TKey,TValue>或Hashtable等這些集合類型,我們該如何選定我應該採用的哪一個集合類型呢?

“如果你必須建立新的設定,或則如果應用程序只需要存取提供的任務,那麼使用任何的IEnumerable集合都已經足夠了。但是,如果應用程序需要存取其他值,或則不建議不需要建立新的集合,這時可使用HashSet.”

原文鏈接:https://blog.csdn.net/scalzdp/article/details/2734427

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章