当前位置: 移动技术网 > IT编程>开发语言>c# > C#泛型集合Dictionary<K,V>的使用方法

C#泛型集合Dictionary<K,V>的使用方法

2019年07月18日  | 移动技术网IT编程  | 我要评论
1、要使用dictionary集合,需要导入c#泛型命名空间   system.collections.generic(程序集:mscorlib) 2、描述    1

1、要使用dictionary集合,需要导入c#泛型命名空间

  system.collections.generic(程序集:mscorlib)

2、描述

   1)、从一组键(key)到一组值(value)的映射,每一个添加项都是由一个值及其相关连的键组成
   2)、任何键都必须是唯一的
   3)、键不能为空引用null(vb中的nothing),若值为引用类型,则可以为空值
   4)、key和value可以是任何类型(string,int,custom class 等)

3、创建及初始化

复制代码 代码如下:

   dictionary<int, string> mydictionary = new dictionary<int, string>();

4、添加元素

复制代码 代码如下:

   mydictionary.add("c#",0);
   mydictionary.add("c++",1);
   mydictionary.add("c",2);
   mydictionary.add("vb",2);

5、查找元素by key

复制代码 代码如下:

  if(mydictionary.containskey("c#"))
  {
    console.writeline("key:{0},value:{1}", "c#", mydictionary["c#"]);
  }

6.遍历元素 by keyvaluepair

复制代码 代码如下:

  foreach (keyvaluepair<string, int> kvp in mydictionary)
  {
    console.writeline("key = {0}, value = {1}",kvp.key, kvp.value);
  }

7、仅遍历键 by keys 属性

复制代码 代码如下:

  dictionary<string, int>.keycollection keycol = mydictionary.keys;
  foreach (string key in keycol/*string key in mydictionary.keys*/)
  {
    console.writeline("key = {0}", key);
  }

8、仅遍历值by valus属性

复制代码 代码如下:

  dictionary<string, int>.valuecollection valuecol = mydictionary.values;
  foreach (int value in valuecol)
  {
    console.writeline("value = {0}", value);
  }

9.移除指定的键值by remove方法

复制代码 代码如下:

  mydictionary.remove("c#");
  if (mydictionary.containskey("c#"))
  {
    console.writeline("key:{0},value:{1}", "c#", mydictionary["c#"]);
  }
  else
  {
    console.writeline("不存在 key : c#");
      }

在system.collections.generic命名空间中,与arraylist相对应的泛型集合是list<t>,与 hashtable相对应的泛型集合是dictionary<k,v>,其存储数据的方式与哈希表相似,通过键/值来保存元素,并具有泛型的全部特征,编译时检查类型约束,读取时无须类型转换。

电话本存储的例子中,使用dictionary<k,v>来存储电话本信息,代码如下:

复制代码 代码如下:

dictionary<string,telnote> ht=new dictionary<string,telnote>();

在dictionary<k,v>声明中,“<string,telnote>”中的string表示集合中key的类型,telnote表示value的类型,定义dictionary<k,v>泛型集合中的方法如下:

复制代码 代码如下:

dictionary<k,v> students=new dictionary<k,v>();

其中“k”为占位符,具体定义时用存储键“key”的数据类型代替,“v”也是占位符,用元素的值“value”的数据类型代替,这样就在定义该集合时,声明了存储元素的键和值的数据类型,保证了类型的安全性。

dictionary<k,v>中元素的操作方法与hashtable相似,添加元素,获取元素,删除元素,遍历集合元素的方法基本相同。

dictionary<k,v>和hashtable的区别
dictionary<k,v>和hashtable的相同点:添加元素,删除元素,通过键访问值的方法相同。
dictionary<k,v>和hashtable的不同点:
dictionary<k,v>对添加的元素具有类型约束,hashtable可添加任意类型的元素。
dictionary<k,v>不需要装箱、拆箱操作,hashtable添加时装箱,读取时拆箱。

在dictionary<k,v>集合中,除了通过键获取值的方法外,还有一种trygetvalue(key)方法,可以通过键获取值,该方法返回值为布尔型,如果存在和键相对应的值,则返回true,否则返回false。避免了因获取不到相应值发生的异常。

复制代码 代码如下:

using system;
using system.collections.generic;
class program
{
static void main()
{
   //创建dictionary<k,v>,然后添加元素
   dictionary < string, string > film = new dictionary < string, string > ();
   film.add("韦小宝", "鹿鼎记");
   film.add("陆小凤", "陆小凤传奇");
   film.add("张无忌", "倚天屠龙记");
   film.add("杨过", "神雕侠侣");
   film.add("令狐冲", "笑傲江湖");
   console.writeline("集合现在的元素个数为{0}", film.count);
   film.remove("杨过");
   //遍历集合
   console.writeline("武侠电影的主角及电影名");
   console.writeline("/t主角/t电影");
   foreach (keyvaluepair < string, string > kvp in film)
   {
    console.writeline("/t{0}/t{1}", kvp.key, kvp.value);
   }
   //检查元素是否存在,如不存在,添加
   if (!film.containskey("段誉"))
   {
    film.add("段誉", "天龙八部");
   }
   //获取键的集合
   dictionary < string, string > .keycollection keys = film.keys;
   //遍历键的集合
   console.writeline("受欢迎的武侠片中主角名");
   foreach (string str in keys)
   {
    console.writeline(str);
   }
   dictionary < string, string > .valuecollection values = film.values;
   //遍历值的集合
   console.writeline("最受欢迎的武侠片");
   foreach (string strfilm in values)
   {
    console.writeline(strfilm);
   }
   //遍历元素的另一种方法
   console.writeline("和哈希表相同的遍历元素方法");
   foreach (string strname in film.values)
   {
    console.writeline(strname);
   }
   //获取键对应的值
   string myfilm = film["令狐冲"];
   console.writeline("主角为令狐冲的电影名{0}", myfilm);
   //获取键对应值的trygetvalue方法
   string objfilm = string.empty;
   if (film.trygetvalue("段誉", out objfilm))
   {
    console.writeline("主角为段誉的电影是{0}", objfilm);
   }
   else
    console.writeline("没有主角为段誉的电影");
   console.readkey();
}
}

代码创建了一个dictionary<k,v>集合,键和值的数据类型是string类型,后边代码的元素添加,删除都和哈希表处理方法相同,遍历元素时不需要进行数据类型强制转换。dictionary<k,v>通过键取值的trygetvalue方法,此方法包括两个参数,一个是要查询的键,另一个是获取的值,注意值前面使用out关键字。

注意:使用trygetvalue方法时,参数一定要使用out关键字,否则编译失败。

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

  • 如何使用C# 捕获进程输出

    intro很多时候我们可能会需要执行一段命令获取一个输出,遇到的比较典型的就是之前我们需要用 ffmpeg 实现视频的编码压缩水印等一系列操作,当时使用的是 f... [阅读全文]
  • 全面分析c# LINQ

    大家好,这是 [c#.net 拾遗补漏] 系列的第 08 篇文章,今天讲 c# 强大的 linq 查询。linq 是我最喜欢的 c# 语言特性之一。linq 是... [阅读全文]
  • C# DataTable常见用法汇总

    c# datatable 的常见用法:(1)新建数据表。(2)向表添加列。(3)设置表特定行与列的数据值。(4)将某行数据加入到表。(5)合并表。(6)复制表。... [阅读全文]
  • C# 如何解析获取Url参数值

    今天遇到一个需求,需要处理通过接口传过来的一个参数,参数内容为一个拼接好的url地址,且该地址还会携带了一些额外的参数,包括但不限于数字,字符串,json串。样... [阅读全文]
  • C# 实现dataGridView选中一行右键出现菜单的示例代码

    在窗体中添加datagridview控件和contextmenustrip1控件,修改datagridview属性,将contextmenustrip控件绑定d... [阅读全文]
  • WPF实现手风琴式轮播图切换效果

    WPF实现手风琴式轮播图切换效果

    本文实例为大家分享了wpf实现轮播图切换效果的具体代码,供大家参考,具体内容如下实现效果如下:步骤:1、自定义控件myimagecontrol实现图片的裁切和动... [阅读全文]
  • WPF实现3D翻牌式倒计时特效

    WPF实现3D翻牌式倒计时特效

    本文实例为大家分享了wpf实现3d翻牌式倒计时的具体代码,供大家参考,具体内容如下实现效果如下:思路:使用自定义控件,设置一个背板 mycardcontrolb... [阅读全文]
  • WPF实现平面三角形3D运动效果

    WPF实现平面三角形3D运动效果

    本文实例为大家分享了wpf实现平面三角形3d运动效果的具体代码,供大家参考,具体内容如下实现效果如下:思路:封装三角形三个顶点和路径的三角形类,图形渲染时同步更... [阅读全文]
  • WPF实现3D粒子波浪效果

    WPF实现3D粒子波浪效果

    本文实例为大家分享了wpf实现3d粒子波浪效果的具体代码,供大家参考,具体内容如下实现效果如下:步骤:1、3d粒子类particle.cs2、粒子系统parti... [阅读全文]
  • 谈谈c#中的索引器

    概念索引器(indexer) 允许类中的对象可以像数组那样方便、直观的被引用。当为类定义一个索引器时,该类的行为就会像一个 虚拟数组(virtual array... [阅读全文]
验证码:
移动技术网