C#實現自定義Dictionary類實例

PC教程網】關于C#實現自定義Dictionary類實例_a/c介紹:本文實例講述了C#實現自定義Dictionary類。分享給大家供大家參考。具體如下: 1.關于MyDictionary類 本文中實現的MyDictionary類具有如下功能 1)可以增加、修改、刪除鍵值對 2)可以通過索,下面小編為您針對C#實現自定義Dictionary類實例進行分享:

本文實例講述了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("新增失敗:主鍵已經存在");
   }
  }
  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#程序設計有所幫助。

相關教程

C#使用IComparer自定義List類實現排序的方法

C#使用IComparer自定義List類實現排序的方法

本文實例講述了C#使用IComparer自定義List類實現排序的方法。分享給大家供大家參考。具體如下: List類中不帶參數的Sort函數可以用來為List類中的元素排序,但如果List類中的元素類型本 …

C#實現自定義FTP操作封裝類實例

本文實例講述了C#實現自定義FTP操作封裝類。分享給大家供大家參考。具體如下: 這個C#類封裝了FTP的常用操作,包括連接ftp服務器、列表服務器上的目錄和文件,從ftp下載文件,上傳 …

C#編程實現自定義熱鍵的方法

本文實例講述了C#編程實現自定義熱鍵的方法。分享給大家供大家參考。具體實現方法如下: using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;usin …

C#實現自定義定時組件的方法

C#實現自定義定時組件的方法

本文實例展示的是一個自定義的定時器組件,有別于.NET Framework里面提供的幾個Timer。首先說說該組件開發背景,發現現在手頭上的工作離不開定時,定時做一個任務,什么都是定時去做 …

Mybatis實現自定義類型轉換器TypeHandler的方法

Mybatis實現自定義類型轉換器TypeHandler的方法

先給大家簡單介紹下mybatis MyBatis是一個支持普通SQL查詢,存儲過程和高級映射的優秀持久層框架。MyBatis消除了幾乎所有的JDBC代碼和參數的手工設置以及對結果集的檢索封裝。MyBatis可以 …

Objective-C實現自定義的半透明導航

本文實例為大家分享了Objective-C半透明導航的具體實現代碼,供大家參考,具體內容如下 #define kScreenWidth [[UIScreen mainScreen] bounds].size.width#define kScreenHeight [[UIScreen mainScreen] bounds].size.hei …

DevExpress實現自定義TreeListNode的Tooltip的方法

DevExpress實現自定義TreeListNode的Tooltip的方法

本文實例展示了DevExpress實現自定義TreeListNode的Tooltip的方法,具體方法如下所示: 主要功能代碼如下: /// summary/// 為節點提供Tooltip/// 說明:/// 1.設置tree.ToolTipController屬性/// 2.ToolTipC …

Android實現自定義華麗的水波紋效果

先來看看效果 實現效果 模擬水波紋的效果:點擊屏幕就有圓環出現,半徑從小到大,透明度從大到小(0為透明) 實現思路 1.自定義類繼承View。 2.定義每個圓環的實體類 Wave,并初始化繪制圓 …

Android實現自定義的彈幕效果

一、效果圖 先來看看效果圖吧~~ 二、實現原理方案 1、自定義 ViewGroup-XCDanmuView ,繼承 RelativeLayout 來實現,當然也可以繼承其他三大布局類哈 2、初始化若干個 TextView (彈幕的 item Vie …

内蒙古十一选五任五推荐号