其實一直想把幾個集合類分清楚,哪些可放重複元素,哪些效率高,排序等等。
1.ArrayList
ArrayList arrayList = new ArrayList(9);
arrayList.Add(1);
arrayList.Add("a");
arrayList.Add(1);
arrayList.Add(null);
arrayList.Add("");
1.1注意屬性
capacity:獲取或設置可包含的元素個數。
count:實際包含的元素個數。
如上訴例子,capacity=9,count=5。
如果初始化沒有設置個數或者設置個數小於實際的元素數量,capacity就會成指數增長。
比如 ArrayList arrayList = new ArrayList(1); 那麼capacity=2的3次方=8,直到大於實際元素個數5個。
可見,ArrayList元素是object類型,可存放重複和null元素,統計元素個數時,會將null也統計在內。
但是效率低,因爲可存放object,操作時會涉及到頻繁的裝箱和拆箱。
2.List<T>
用得最多的就是這個了!因爲是泛型,聲明時必須制定存儲的數據類型。
List<string> list = new List<string>();
list.Add("a");
list.Add("b");
list.Add("a");
list.Add(null);
有序,可存放重複元素,可null。3.HashSet<T>
hashset和list類似,不過前者不能存放重複元素,因爲無序,所以不能用索引訪問元素。
HashSet<string> list = new HashSet<string>() { "a", "b", "c" };
list.Add("a");
list.Add(null);
foreach (var item in list)
{
Console.WriteLine(item);
}
輸出:a,b,c
HashSet的Add方法其實是一個bool,如果元素重複返回false。
優點:HashSet檢索性能高,單的說它的Contains方法的性能在大數據量時比List<T>好得多。HashSet<T>的Contains方法複雜度是O(1),List<T>的Contains方法複雜度是O(n)。
4.SortedSet<T>
無序,不包含重複元素
SortedSet<string> list = new SortedSet<string>(){ "a", "e", "c" };
list.Add("d");
list.Add("c");
foreach (var item in list)
{
Console.WriteLine(item);
}
輸出a,c,d,e。重複元素被刪除,且輸出排序。
摘自網上的一段說明:
-
HashSet和SortSet主要的作用是用來進行,兩個集合求交集、並集、差集等運算.集合中包含一組不重複出現且無特性順序的元素。前者不會自動排序,後者會加入元素後,自動排序。
-
兩者都無法從特定位置訪問其中某個元素。
-
可以使用其查找功能:
Set.Contains("value"); 返回true或false。
-
對集合做操作:
-
SymmetricExceptWith: 僅包含該對象或指定集合中存在的元素(但不可同時包含兩者中的元素)。去除交集,剩下兩個集合元素
-
UnionWith: 包含該對象本身和指定集合中存在的所有元素。並集
-
ExceptWith: 從當前 HashSet<T> 對象中移除指定集合中的所有元素。差集
-
IntersectWith: 僅包含該對象和指定集合中存在的元素。交集
5.SortedSet對象,可以調用GetViewBetween、Max、Min 方法。
6.除了SortedSet外,System.Collections.Generic命名空間下,還提供了SortedDictionary和SortedList兩個類。
5.Queue(隊列)
無序,先進先出的集合,對尾插入,隊首刪除。
Queue queue = new Queue();
queue.Enqueue(1);
queue.Enqueue("a");
queue.Enqueue(1);
//var s = queue.Dequeue();
//Console.WriteLine(s);
foreach (var item in queue)
{
Console.WriteLine(item);
}
遍歷時,不會刪除重複元素。6.Stack(棧)
無序,先進後出
Stack stack = new Stack();
stack.Push("a");//進棧
stack.Push(1);
stack.Push("b");
stack.Push(null);
stack.Pop();//出棧
//var s = queue.Dequeue();
//Console.WriteLine(s);
foreach (var item in stack)
{
Console.WriteLine(item);
}
輸出:b,1,a