在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关键字,否则编译失败。

http://hi.baidu.com/panjundao/blog/item/eb38e70c2ed558e1ab6457b1.html

C#泛型-泛型集合DictionaryK,V相关推荐

  1. mysql结果集键值对_键值对集合DictionaryK,V根据索引提取数据

    java stopwatch 功能 C#中有一个stopwatch的功能,主要是用来监测程序执行时间的.java之前一直都在用如下方式完成: public static void main(Strin ...

  2. C# 篇基础知识11——泛型和集合

    .NET提供了一级功能强大的集合类,实现了多种不同类型的集合,可以根据实际用途选择恰当的集合类型. 除了数组 Array 类定义在System 命名空间中外,其他的集合类都定义在System.Coll ...

  3. sqlite工具类 java_Java之泛型、集合工具类

    集合工具类 在我们讲完常用的基本集合后,我们就要介绍下位于java.util包下的collections类,注意:我们之前的collection是集合的接口,而collections是一个类.coll ...

  4. .net core精彩实例分享 -- 泛型和集合

    文章目录 介绍 具体案例 限制泛型参数只能使用值类型 泛型参数的输入和输出 将抽象类作为类型约束 使用Span提升处理字符串的性能 多个Task同时操作ConcurrenBag集合 跨线程访问Bloc ...

  5. SCJP笔记_章七_泛型与集合

    第七章 泛型与集合 7.1 重写hashCode()和equals()方法 考试目标6.2 区分hashCode()和equals()方法的正确设计和错误设计,并解释 == 和equals()方法的不 ...

  6. 01.08学习Java的day18【泛型与集合】

    day18[泛型] 主要内容 泛型 Collection集合 学习目标 能够使用泛型定义类.接口.方法 能够理解泛型上限 能够阐述泛型通配符的作用 能够识别通配符的上下限 能够熟练使用Collecti ...

  7. (10)Java泛型-Map集合-集合框架工具类-可变参数-静态导入

    -- 部分1.5新特性Java泛型-Map集合-集合框架工具类 泛型 概述: JDK1.5版本以后出现的新特性,用于解决安全问题,是一个类型安全机制. 对于泛型可以这样理解: 没有使用泛型时,只要是对 ...

  8. Java实用教程笔记 泛型与集合框架

    泛型与集合框架 Generics 链表 LinkedList < E >泛型类 接口回调 常用方法 LinkedList< E >泛型类实现Link< E >泛型接 ...

  9. Java集合之Collection集合、泛型 【集合综合案例:赌神、赌侠、赌神斗地主】

    第一章. Collection集合 1.1 集合概述 集合:集合是java中提供的一种容器,可以用来存储多个数据. 集合和数组既然都是容器,它们有啥区别呢? 数组的长度是固定的.集合的长度是可变的. ...

最新文章

  1. android5.1内核版本,Android-x86现已基于5.1.1 Lollipop:支持UEFI和64位内核
  2. linux shell 使用代理 proxychains 简介
  3. javascript 函数声明与函数表达式的区别
  4. 2.羽翼sqlmap学习笔记之MySQL注入
  5. utf8 and unicode
  6. c++编码风格指南_带回家的编码挑战的基本指南
  7. 解决E: Package ‘libmysqlclient-dev‘ has no installation candidate报错
  8. POJ 1694 An Old Stone Game ★(排序+树+递归)
  9. lecture 5:Policy Optimization 1
  10. 【Java面试题】40 你所知道的集合类都有哪些?主要方法?
  11. JAVA学习总结-面向对象
  12. Linux之动态网页——搭建博客
  13. 服务器后端开发系列——《实战Nginx高性能Web服务器》 (转载)
  14. 一共有多少种操作系统
  15. matlab矩阵二阶微分方程求解,MATLAB解含参数方程、矩阵方程、二阶微分方程组
  16. windows server2016忘记密码,windows重置密码,windows破解密码,win10忘记密码,win10破解密码,windows server2016破解密码
  17. 【OpneWRT】编译ipk
  18. 《Beyond Part Models: Person Retrieval with Refined Part Pooling 》PCB论文解读
  19. 计算机上的放大快捷键,电脑放大镜热键 怎么取消电脑放大镜快捷键?
  20. arcoshx怎么用计算机算,双曲函数

热门文章

  1. 线性回归损失函数为什么要用平方形式
  2. 全球及中国造纸行业十四五产量调研与运营能力状况分析报告2022版
  3. 全球及中国智能照明行业应用状况及竞争格局展望报告2021-2027年
  4. 微商谋定重整纠正错误走路-经信研究:李玉庭谈微商营销
  5. 学习笔记27—python中numpy.ravel() 和 flatten()函数
  6. 45度炸队Alpha冲刺博客集
  7. 【转】采用dlopen、dlsym、dlclose加载动态链接库
  8. 判断滚动条是否到某个位置,还有滑动的方向,以此来判断什么时候阻止滚动条滚动...
  9. grep 打印出过滤字段及后3行内容
  10. Hadoop 部署实例