C#實(shí)現(xiàn)自定義Dictionary類實(shí)例
本文實(shí)例講述了C#實(shí)現(xiàn)自定義Dictionary類。分享給大家供大家參考。具體如下:
1.關(guān)于MyDictionary類
本文中實(shí)現(xiàn)的MyDictionary類具有如下功能
1)可以增加、修改、刪除鍵值對
2)可以通過索引器,找到一個鍵對應(yīng)的值
3)可以遍歷打印類中全部的鍵值對
4)可以將類中的序列轉(zhuǎn)化為有序的(不排序、升序、降序)List類型
MyDictionary類是一個具有兩個參數(shù)的泛型類,內(nèi)部機(jī)制采用以鍵值對(KeyValuePair)類型為元素的雙向鏈表(LinkedList)實(shí)現(xiàn)
2.實(shí)現(xiàn)代碼
class MyDictioinary<TKey, TValue>
{
LinkedList<KeyValuePair<TKey, TValue>> llDictionary
= new LinkedList<KeyValuePair<TKey, TValue>>();
/// <summary>
/// 索引器,輸入TKey可以找到對應(yīng)的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>
/// 添加一組數(shù)據(jù)
/// </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已經(jīng)存在");
}
}
llDictionary.AddLast(new KeyValuePair<TKey, TValue>(tk, tv));
}
/// <summary>
/// 刪除一組數(shù)據(jù)
/// </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>
/// 修改一組數(shù)據(jù)
/// </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內(nèi)的全部數(shù)據(jù)
/// </summary>
public void PrintData()
{
Console.WriteLine("==================");
Console.WriteLine("輸出數(shù)據(jù)");
Console.WriteLine("==================");
foreach (KeyValuePair<TKey, TValue> kvp in llDictionary)
{
Console.WriteLine(kvp.Key.ToString() + "\t:" + kvp.Value.ToString());
}
Console.WriteLine(string.Format("共計輸出 {0} 項(xiàng)", llDictionary.Count));
Console.WriteLine(DateTime.Now.ToLongTimeString());
Console.WriteLine("==================");
}
/// <summary>
/// 決定按什么順序打印Dictionary內(nèi)的數(shù)據(jù)
/// </summary>
public enum PrintType
{
Normal = 0, //不排序
Ascend = 1, //升序排列
Descend = 2 //降序佩列
};
/// <summary>
/// 返回List類型的數(shù)據(jù)
/// </summary>
/// <param name="printType">List內(nèi)數(shù)據(jù)的排序情況</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可以被轉(zhuǎn)化為浮點(diǎn)數(shù)的情況
{
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可以被轉(zhuǎn)化為浮點(diǎn)數(shù)的情況
{
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函數(shù)調(diào)用示例
static void Main(string[] args)
{
MyDictioinary<string, string> dic = new MyDictioinary<string, string>();
//插入兩組數(shù)據(jù)
dic.Add("1", "MERCURY");
dic.Add("2", "VENUS");
//嘗試插入重復(fù)主鍵的數(shù)據(jù) 報警:主鍵不存在
try
{
dic.Add("1", "EARTH");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
//刪除一組數(shù)據(jù)
dic.Delete("1");
//添加一組數(shù)據(jù)
dic.Add("1", "MARS");
//修改兩組數(shù)據(jù)
dic.Modify("1", "JUPITER");
dic.Modify("2", "SATURN");
//添加兩組數(shù)據(jù)
dic.Add("6", "SUN");
dic.Add("5", "MOON");
dic.Add("8", "URANUS");
dic.Add("9", "NEPTUNE");
dic.PrintData();
//通過索引找到對應(yīng)值
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.運(yùn)行示例

希望本文所述對大家的C#程序設(shè)計有所幫助。
- Lua Table轉(zhuǎn)C# Dictionary的方法示例
- C#中數(shù)組、ArrayList、List、Dictionary的用法與區(qū)別淺析(存取數(shù)據(jù))
- C#數(shù)組中List, Dictionary的相互轉(zhuǎn)換問題
- C#常見的幾種集合 ArrayList,Hashtable,List<T>,Dictionary<K,V> 遍歷方法對比
- C#中Dictionary泛型集合7種常見的用法
- C#中查找Dictionary中的重復(fù)值的方法
- C#中Dictionary類使用實(shí)例
- C#針對xml文件轉(zhuǎn)化Dictionary的方法
- C#泛型集合Dictionary<K,V>的使用方法
- C#中Dictionary的作用及用法講解
- C#泛型Dictionary的用法實(shí)例詳解
- C#探秘系列(一)——ToDictionary,ToLookup
- C#中查找Dictionary中重復(fù)值的方法
- C# Hashtable/Dictionary寫入和讀取對比詳解
- C# Dictionary和SortedDictionary的簡介
相關(guān)文章
C#實(shí)現(xiàn)數(shù)據(jù)包加密與解密實(shí)例詳解
這篇文章主要介紹了C#實(shí)現(xiàn)數(shù)據(jù)包加密與解密的方法,是一項(xiàng)很實(shí)用的技能,需要的朋友可以參考下2014-07-07
桌面浮動窗口(類似惡意廣告)的實(shí)現(xiàn)詳解
本篇文章是對桌面浮動窗口的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
深入多線程之:深入生產(chǎn)者、消費(fèi)者隊列分析
本篇文章是對生產(chǎn)者與消費(fèi)者隊列進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
C#實(shí)現(xiàn)讓ListBox適應(yīng)最大Item寬度的方法
這篇文章主要介紹了C#實(shí)現(xiàn)讓ListBox適應(yīng)最大Item寬度的方法,涉及ListBox控件的操作技巧,需要的朋友可以參考下2015-05-05
C#讀取word中表格數(shù)據(jù)的方法實(shí)現(xiàn)
本文主要介紹了C#讀取word中表格數(shù)據(jù)的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06

