C#HasSet

原文鏈接:https://docs.microsoft.com/zh-cn/dotnet/api/system.collections.generic.hashset-1?view=netstandard-2.1

        .NET3.5多了個HasSet<T>用來存儲集合。從名稱可以看出,它是基於Hash的。HashSet<T>類提供高性能的設置操作。類似於訪問Dictionary<TKey, TValue> 或Hashtable集合的鍵。 簡而言之 HashSet<T> 可以將類視爲Dictionary<TKey, TValue>沒有值的集合。簡單的說它的Contains方法的性能在大數據量時比List <T>好得多。HashSet<T>的Contains方法複雜度是O(1),List<T>的Contains方法複雜度是O(n)。
       HashSet<T> 集合未進行排序,並且不能包含重複元素。 如果順序或元素複製比應用程序的性能更重要,請考慮結合List<T> Sort使用類和方法。

    List與HashSet互相轉換,可以達到List去重的目的:

List<int> lis = new List<int>() { 1,2,1,1,1};
HashSet<int> hs = new HashSet<int>(lis);
lis = new List<int>(hs);

      Linq set 操作和HashSet<T>操作之間的主要區別在於,linq set 操作始終返回新IEnumerable<T>集合,而HashSet<T>等效方法修改當前集合。

       通常情況下,如果您必須創建新的集或您的應用程序只需要訪問所提供的 set 操作,則對任何IEnumerable<T> 集合或數組使用 LINQ set 操作都足夠了。 但是,如果你的應用程序需要訪問其他設置操作,或者如果不需要或不需要創建新集合,請使用HashSet<T> 類。

方法:

HashSet<int> hasA = new HashSet<int>() { 1, 2, 3 };
HashSet<int> hasB = new HashSet<int> { 2, 3, 4 };

//合併兩個不同的集
hasA.UnionWith(hasB);   //結果: { 1,2,3,4 }

//交集,修改當前的 HashSet<T> 對象,以僅包含該對象和指定集合中存在的元素。
hasA.IntersectWith(hasB);  //結果: { 2,3 }

//減法,從當前 HashSet<T> 對象中移除指定集合中的所有元素。
hasA.ExceptWith(hasB);  //結果: { 1 }

//交集取反
hasA.SymmetricExceptWith(hasB); // 結果: { 1,4 }

//將 HashSet<T> 集合中的元素複製到數組中。
int[] ii = new int[hasA.Count];
hasA.CopyTo(ii);

 

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