.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);