集合命名空間: using system.collections. 非泛型集合 using system.collections.Generic. 泛型集合 為什麼要用集合: 1、數組一旦聲明長度就固定了。 2、集合有很多方法可以用 等 常用集合: 類似數組集合:ArrayList List<> 鍵 ...
集合命名空間:
using system.collections. 非泛型集合
using system.collections.Generic. 泛型集合
為什麼要用集合:
1、數組一旦聲明長度就固定了。
2、集合有很多方法可以用
等
常用集合:
類似數組集合:ArrayList List<>
鍵值對集合:Hashtable Dictionary<K V>
棧集合:Stack
隊列:Queye
等
ArrayList:
class Program { static void Main(string[] args) { ArrayList arrayList = new ArrayList(); arrayList.Add(1); //增加一個元素 arrayList.AddRange(new int[] { 2, 3 });//增加一個集合 arrayList.Insert(0, "開始:");//在指定位子插入一個元素 arrayList.InsertRange(4, new string[] { "一", "二", "三" });//指定位置插入集合 arrayList.RemoveAt(7); arrayList.Clear();//清空集合 for (int i = 0; i < arrayList.Count; i++) { Console.WriteLine(arrayList[i]); } } }
Remove()不是根據對象來判斷的,而是根據值來判斷。
Contains()是否包含某個值,也是根據值來判斷的。
集合轉為數組:.ToArray().
排序: 1、.sort() 升序 沒有降序 可以用.Reverse()顛倒位置實現。
2、想讓任何集合實現排序需要實現 IComparable介面 。
3、直接調用sort是使用ICompareble 介面的預設方式來排序。可以用sort的重載,使用自己的比較器。
Hashtable:
簡單添加和獲取:
class Program { static void Main(string[] args) { Hashtable hashtable = new Hashtable(); hashtable.Add("Sam", "Sam"); hashtable.Add("Penny", new Person() { Name = "Penny" }); Console.WriteLine(hashtable["Sam"]); Person Penny = hashtable["Penny"] as Person; Console.WriteLine(Penny.Name); } }
鍵值對集合的鍵不能重覆。
判斷是否存在某個鍵:.ContentsKey() 是否存在某個值:.ContentsValue()
遍歷Hash table:
class Program { static void Main(string[] args) { Hashtable hashtable = new Hashtable(); hashtable.Add("Sam", "Sam"); hashtable.Add("Penny", "Penny"); //遍歷鍵 foreach (object item in hashtable.Keys) { Console.WriteLine("Key:{0}----Value:{1}",item,hashtable[item]); } //遍歷值 foreach (object item in hashtable.Values) { Console.WriteLine("Value:{0}",item); } //遍歷鍵值對 foreach (DictionaryEntry item in hashtable) { Console.WriteLine("Key:{0}---Value{1}",item.Key,item.Value); } } }
集合小練習:
兩個ArrryList集合的並集。
class Program { static void Main(string[] args) { ArrayList A = new ArrayList(new string[] {"a","b"}); ArrayList B = new ArrayList(new string[] { "a", "b","c","d" }); for (int i = 0; i <B.Count; i++) { if (!A.Contains(B[i])) { A.Add(B[i]); } } for (int i = 0; i < A.Count; i++) { Console.WriteLine(A[i]); } } }
隨機生成十個1-100之間的數放到arraylist中,這些數必須是偶數且不能重覆。
class Program { static void Main(string[] args) { ArrayList arrayList = new ArrayList(); Random random = new Random(); while (arrayList.Count<10) { int r = random.Next(1, 101); if (!arrayList.Contains(r)&&((r%2)==0)) { arrayList.Add(r); } } for (int i = 0; i < arrayList.Count; i++) { Console.WriteLine(arrayList[i]); } } }
上面程式把random放迴圈外面效率更好,因為無參的random構造函數以系統時間為種子,而一遍迴圈完了以後時間還沒來得及變,就會生成相同的數。
泛型集合:
List<string> list = new List<string> ()
和 arraylist相比:
數據類型固定,有更多的方法可以用。
Dictionary<string, int> dic = new Dictionary<string, int> ;
和hashtable相比:
鍵和值都有類型約束。
遍歷鍵值對:
class Program { static void Main(string[] args) { Dictionary<string, int> dic = new Dictionary<string, int>(); dic.Add("Sam", 22); dic.Add("Penny", 23); foreach (KeyValuePair<string,int> item in dic) { Console.WriteLine("keys:{0}--value:{1}",item.Key,item.Value); } } }
判斷字元串中每個字母出現的次數:
class Program { static void Main(string[] args) { string str = "wellcome to china"; Dictionary<char, int> dict = new Dictionary<char, int>(); for (int i = 0; i < str.Length; i++) { if (char.IsLetter(str[i])) { if (dict.ContainsKey(str[i])) { dict[str[i]]++; } else { dict.Add(str[i], 1); } } } foreach (KeyValuePair<char,int> item in dict) { Console.WriteLine("{0}----{1}",item.Key,item.Value); } } }