C#实现自定义Dictionary类实例

 更新时间:2015年08月14日 15:46:53   作者:北风其凉  
这篇文章主要介绍了C#实现自定义Dictionary类,较为详细的分析了Dictionary类的功能、定义及用法,具有一定参考借鉴价值,需要的朋友可以参考下
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

本文实例讲述了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#图像处理之木刻效果实现方法

    C#图像处理之木刻效果实现方法

    这篇文章主要介绍了C#图像处理之木刻效果实现方法,可实现类似木刻效果的黑白照效果,需要的朋友可以参考下
    2015-04-04
  • c#中WebService的介绍及调用方式小结

    c#中WebService的介绍及调用方式小结

    这篇文章主要给大家介绍了关于c#中的WebService及其调用方式的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-11-11
  • C# using三种使用方法

    C# using三种使用方法

    这篇文章主要为大家详细介绍了C# using三种使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • C#自定义HttpFilter模块完善实例

    C#自定义HttpFilter模块完善实例

    这篇文章主要介绍了C#自定义HttpFilter模块完善的方法,以实例的形式具体讲述了C#自定义HttpFilter模块的原理与完善的方法,非常实用,需要的朋友可以参考下
    2014-10-10
  • 基于WPF实现跳动的字符效果

    基于WPF实现跳动的字符效果

    这篇文章主要和大家介绍一个好玩但实际作用可能不太大的动画效果:跳动的字符,本文将利用WPF实现这一效果,感兴趣的小伙伴可以学习一下
    2023-08-08
  • C#调用Python的URL接口的示例

    C#调用Python的URL接口的示例

    这篇文章主要介绍了C#调用Python的URL接口的示例,帮助大家更好的理解和学习c#,感兴趣的朋友可以了解下
    2020-10-10
  • C#实现单例模式的多种方式

    C#实现单例模式的多种方式

    这篇文章介绍了C#实现单例模式的多种方式,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-01-01
  • C#实现json格式转换成对象并更换key的方法

    C#实现json格式转换成对象并更换key的方法

    这篇文章主要介绍了C#实现json格式转换成对象并更换key的方法,涉及C#操作json格式数据的相关技巧,需要的朋友可以参考下
    2015-06-06
  • C#简单实现IOC容器的示例代码

    C#简单实现IOC容器的示例代码

    IoC 的原理是通过将对象的创建和依赖关系的管理交给外部容器来实现,从而降低了代码的耦合度,提高了代码的可维护性和可测试性,下面我们就来看看如何通过C#实现一个IOC容器吧
    2024-02-02
  • C#中使用XmlDocument类来创建和修改XML格式的数据文件

    C#中使用XmlDocument类来创建和修改XML格式的数据文件

    这篇文章主要介绍了C#中使用XmlDocument类来创建和修改XML格式的数据文件的方法,XmlDocument类被包含在.NET框架中,需要的朋友可以参考下
    2016-04-04

最新评论

?


http://www.vxiaotou.com