本文實例講述了C#實現自定義Dictionary類。分享給大家供大家參考。具體如下:
1.關于MyDictionary類
本文中實現的MyDictionary類具有如下功能
1)可以增加、修改、刪除鍵值對
2)可以通過索引器,找到一個鍵對應的值
3)可以遍歷打印類中全部的鍵值對
4)可以將類中的序列轉化為有序的(不排序、升序、降序)List類型
MyDictionary類是一個具有兩個參數的泛型類,內部機制采用以鍵值對(KeyValuePair)類型為元素的雙向鏈表(LinkedList)實現
2.實現代碼
class MyDictioinary<TKey, TValue>{ LinkedList<KeyValuePair<TKey, TValue>> llDictionary = new LinkedList<KeyValuePair<TKey, TValue>>(); /// <summary> /// 索引器,輸入TKey可以找到對應的TValue /// </summary> /// <param name="tk">鍵值</param> /// <returns></returns> public TValue this[TKey tk] { get { foreach(KeyValuePair<TKey, TValue> kvp in llDictionary) { if (tk.Equals(kvp.Key)) { return kvp.Value; } } return default(TValue); } } /// <summary> /// 添加一組數據 /// </summary> /// <param name="tk"></param> /// <param name="tv"></param> public void Add(TKey tk, TValue tv) { foreach (KeyValuePair<TKey, TValue> kvp in llDictionary) { if (tk.Equals(kvp.Key)) { throw new Exception("新增失?。褐麈I已經存在"); } } llDictionary.AddLast(new KeyValuePair<TKey, TValue>(tk, tv)); } /// <summary> /// 刪除一組數據 /// </summary> /// <param name="tk"></param> public void Delete(TKey tk) { foreach (KeyValuePair<TKey, TValue> kvp in llDictionary) { if (tk.Equals(kvp.Key)) { llDictionary.Remove(kvp); return; } } throw new Exception("刪除失敗:不存在這個主鍵"); } /// <summary> /// 修改一組數據 /// </summary> /// <param name="tk"></param> /// <param name="tv"></param> public void Modify(TKey tk, TValue tv) { LinkedListNode<KeyValuePair<TKey, TValue>> lln = llDictionary.First; while (lln != null ) { if (tk.Equals(lln.Value.Key)) { llDictionary.AddBefore(lln, new KeyValuePair<TKey, TValue>(tk, tv)); llDictionary.Remove(lln); return; } lln = lln.Next; } throw new Exception("修改失?。翰淮嬖谶@個主鍵"); } /// <summary> /// 打印整個Dictionary內的全部數據 /// </summary> public void PrintData() { Console.WriteLine("=================="); Console.WriteLine("輸出數據"); Console.WriteLine("=================="); foreach (KeyValuePair<TKey, TValue> kvp in llDictionary) { Console.WriteLine(kvp.Key.ToString() + "/t:" + kvp.Value.ToString()); } Console.WriteLine(string.Format("共計輸出 {0} 項", llDictionary.Count)); Console.WriteLine(DateTime.Now.ToLongTimeString()); Console.WriteLine("=================="); } /// <summary> /// 決定按什么順序打印Dictionary內的數據 /// </summary> public enum PrintType { Normal = 0, //不排序 Ascend = 1, //升序排列 Descend = 2 //降序佩列 }; /// <summary> /// 返回List類型的數據 /// </summary> /// <param name="printType">List內數據的排序情況</param> /// <returns></returns> public List<KeyValuePair<TKey, TValue>> ToList(PrintType printType = PrintType.Normal) { switch (printType) { case PrintType.Normal: { return llDictionary.ToList(); } case PrintType.Ascend: { if (llDictionary.Count == 0) return null; LinkedList<KeyValuePair<TKey, TValue>> newll = new LinkedList<KeyValuePair<TKey, TValue>>(); try { LinkedListNode<KeyValuePair<TKey, TValue>> lln = llDictionary.First; while (lln != null) { LinkedListNode<KeyValuePair<TKey, TValue>> lln2 = newll.First; while (lln2 != null) { //Key是字符串的情況 if (llDictionary.First.Value.Key.GetType() == "string".GetType()) { if (string.Compare(lln2.Value.Key.ToString(), lln.Value.Key.ToString()) > 0) { newll.AddBefore(lln2, new LinkedListNode <KeyValuePair<TKey, TValue>>(lln.Value)); break; } } else //Key可以被轉化為浮點數的情況 { if (double.Parse(lln2.Value.Key.ToString()) > double.Parse(lln.Value.Key.ToString())) { newll.AddBefore(lln2, new LinkedListNode <KeyValuePair<TKey, TValue>>(lln.Value)); break; } } lln2 = lln2.Next; } if (lln2 == null) { newll.AddLast(new LinkedListNode <KeyValuePair<TKey, TValue>>(lln.Value)); } lln = lln.Next; } } catch (Exception ex) { Console.WriteLine(ex.Message); } return newll.ToList(); } case PrintType.Descend: { if (llDictionary.Count == 0) return null; LinkedList<KeyValuePair<TKey, TValue>> newll = new LinkedList<KeyValuePair<TKey, TValue>>(); try { LinkedListNode<KeyValuePair<TKey, TValue>> lln = llDictionary.First; while (lln != null) { LinkedListNode<KeyValuePair<TKey, TValue>> lln2 = newll.First; while (lln2 != null) { //Key是字符串的情況 if (llDictionary.First.Value.Key.GetType() == "string".GetType()) { if (string.Compare(lln2.Value.Key.ToString(), lln.Value.Key.ToString()) < 0) { newll.AddBefore(lln2, new LinkedListNode <KeyValuePair<TKey, TValue>>(lln.Value)); break; } } else //Key可以被轉化為浮點數的情況 { if (double.Parse(lln2.Value.Key.ToString()) < double.Parse(lln.Value.Key.ToString())) { newll.AddBefore(lln2, new LinkedListNode <KeyValuePair<TKey, TValue>>(lln.Value)); break; } } lln2 = lln2.Next; } if (lln2 == null) { newll.AddLast(new LinkedListNode <KeyValuePair<TKey, TValue>>(lln.Value)); } lln = lln.Next; } } catch (Exception ex) { Console.WriteLine(ex.Message); } return newll.ToList(); } default: return null; } }}
3.Main函數調用示例
static void Main(string[] args){ MyDictioinary<string, string> dic = new MyDictioinary<string, string>(); //插入兩組數據 dic.Add("1", "MERCURY"); dic.Add("2", "VENUS"); //嘗試插入重復主鍵的數據 報警:主鍵不存在 try { dic.Add("1", "EARTH"); } catch (Exception ex) { Console.WriteLine(ex.Message); } //刪除一組數據 dic.Delete("1"); //添加一組數據 dic.Add("1", "MARS"); //修改兩組數據 dic.Modify("1", "JUPITER"); dic.Modify("2", "SATURN"); //添加兩組數據 dic.Add("6", "SUN"); dic.Add("5", "MOON"); dic.Add("8", "URANUS"); dic.Add("9", "NEPTUNE"); dic.PrintData(); //通過索引找到對應值 Console.WriteLine("key為6的元素value為:" + dic["6"]); Console.WriteLine("key為3的元素value為:" + dic["3"]); List<KeyValuePair<string, string>> l; //輸出升序排列好的List l = dic.ToList(MyDictioinary<string, string>.PrintType.Ascend); Console.WriteLine("升序排列后的List:"); for (int i = 0; i < l.Count; i++) { Console.WriteLine(l[i].Key.ToString() + "/t:" + l[i].Value.ToString()); } //輸出降序排列好的List l = dic.ToList(MyDictioinary<string, string>.PrintType.Descend); Console.WriteLine("降排列后的List:"); for (int i = 0; i < l.Count; i++) { Console.WriteLine(l[i].Key.ToString() + "/t:" + l[i].Value.ToString()); } Console.ReadLine();}
4.運行示例
希望本文所述對大家的C#程序設計有所幫助。
新聞熱點
疑難解答