zoukankan      html  css  js  c++  java
  • C#泛型集合—Dictionary<K,V>使用技巧

    参考:C#泛型集合—Dictionary<K,V>使用技巧_續寫經典-CSDN博客_c# dictionary泛型

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

    System.Collections.Generic(程序集:mscorlib)

    2、描述

    • 从一组键(Key)到一组值(Value)的映射,每一个添加项都是由一个值及其相关连的键组成  
    • 任何键都必须是唯一的  
    • 键不能为空引用null(VB中的Nothing),若值为引用类型,则可以为空值  
    • Key和Value可以是任何类型(string,int,custom class 等)

    3、创建及初始化

    Dictionary<int, string> myDictionary = new Dictionary<int, string>();

    4、添加元素

    1.  
      myDictionary.Add("C#",0);
    2.  
      myDictionary.Add("C++",1);
    3.  
      myDictionary.Add("C",2);
    4.  
      myDictionary.Add("VB",2);

    5、查找元素By Key

    1.  
      if(myDictionary.ContainsKey("C#"))
    2.  
      {
    3.  
        Console.WriteLine("Key:{0},Value:{1}", "C#", myDictionary["C#"]);
    4.  
      }

    6.遍历元素 By KeyValuePair

    1.  
      foreach (KeyValuePair<string, int> kvp in myDictionary)
    2.  
      {
    3.  
        Console.WriteLine("Key = {0}, Value = {1}",kvp.Key, kvp.Value);
    4.  
      }

    7、仅遍历键 By Keys 属性

    1.  
      Dictionary<string, int>.KeyCollection keyCol = myDictionary.Keys;
    2.  
      foreach (string key in keyCol/*string key in myDictionary.Keys*/)
    3.  
      {
    4.  
        Console.WriteLine("Key = {0}", key);
    5.  
      }

    8、仅遍历值By Valus属性

    1.  
      Dictionary<string, int>.ValueCollection valueCol = myDictionary.Values;
    2.  
      foreach (int value in valueCol)
    3.  
      {
    4.  
        Console.WriteLine("Value = {0}", value);
    5.  
      }

    9.移除指定的键值By Remove方法

    1.  
      myDictionary.Remove("C#");
    2.  
      if (myDictionary.ContainsKey("C#"))
    3.  
      {
    4.  
        Console.WriteLine("Key:{0},Value:{1}", "C#", myDictionary["C#"]);
    5.  
      }
    6.  
      else
    7.  
      {
    8.  
        Console.WriteLine("不存在 Key : C#");
    9.  
      }
       
      using System;
      using System.Collections.Generic;  // c# 泛型命名空间
      
      
      
      namespace aaDictionary
      {
          class Program
          {
              static void Main(string[] args)
              {
      
                  //创建Dictionary
                  Dictionary<string, int> myDictionary = new Dictionary<string, int>();
      
                  //添加元素
                  myDictionary.Add("C#", 0);
                  myDictionary.Add("C++", 1);
                  myDictionary.Add("C", 2);
                  myDictionary.Add("VB", 2);
      
                  //查找
                  //if (myDictionary.ContainsKey("C++"))
                  //{
                  //    Console.WriteLine("Key:{0},Value:{1}", "C++", myDictionary["C++"]);  //Key:C++,Value:1
                  //}
      
                  //遍历
      
                  //foreach (KeyValuePair<string, int> kvp in myDictionary)
                  //{
                  //    Console.WriteLine("Key = {0}, Value = {1}", kvp.Key, kvp.Value);
                  //}
                  ////Key = C#, Value = 0
                  ////Key = C++, Value = 1
                  ////Key = C, Value = 2
                  ////Key = VB, Value = 2
      
                  //遍历key属性
      
                  //Dictionary<string, int>.KeyCollection keyCol = myDictionary.Keys;
                  //foreach (string key in keyCol/*string key in myDictionary.Keys*/)
                  //{
                  //    Console.WriteLine("Key = {0}", key);
                  //}
      
                  ////仅遍历值By Valus属性
                  //Dictionary<string, int>.ValueCollection valueCol = myDictionary.Values;
                  //foreach (int value in valueCol)
                  //{
                  //    Console.WriteLine("Value = {0}", value);
                  //}
      
                  //移除指定的键值By Remove方法
                  myDictionary.Remove("C#");
                  if (myDictionary.ContainsKey("C#"))
                  {
                      Console.WriteLine("Key:{0},Value:{1}", "C#", myDictionary["C#"]);
                  }
                  else
                  {
                      Console.WriteLine("不存在 Key : C#");
                  }
      
      
                  Console.WriteLine("Hello World!");
              }
          }
      }
      

        在System.Collections.Generic命名空间中,

      与ArrayList相对应的泛型集合是List<T>,
      与 HashTable相对应的泛型集合是Dictionary<K,V>,

      其存储数据的方式与哈希表相似,通过键/值来保存元素,并具有泛型的全部特征,编译时检查类型约束,读取时无须类型转换。

      定义Dictionary<K,V>泛型集合:  

      Dictionary<K,V> students=new Dictionary<K,V>();

      其中“K”为占位符,具体定义时用存储键“Key”的数据类型代替,“V”也是占位符,
      用元素的值“Value”的数据类型代替,这样就在定义该集合时,声明了存储元素的键和值的数据类型,保证了类型的安全性。  
      Dictionary<K,V>中元素的操作方法与HashTable相似,添加元素,获取元素,删除元素,遍历集合元素的方法基本相同。

      Dictionary<K,V>和HashTable的区别:

      1.  
        Dictionary<K,V>和HashTable的相同点:添加元素,删除元素,通过键访问值的方法相同。
      2.  
        Dictionary<K,V>和HashTable的不同点:
      3.  
        Dictionary<K,V>对添加的元素具有类型约束,HashTable可添加任意类型的元素。
      4.  
        Dictionary<K,V>不需要装箱、拆箱操作,HashTable添加时装箱,读取时拆箱。

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

      1.  
        using System;
      2.  
        using System.Collections.Generic;
      3.  
        class Program
      4.  
        {
      5.  
        static void Main()
      6.  
        {
      7.  
        //创建Dictionary<K,V>,然后添加元素
      8.  
        Dictionary < string, string > film = new Dictionary < string, string > ();
      9.  
        film.Add("韦小宝", "鹿鼎记");
      10.  
        film.Add("陆小凤", "陆小凤传奇");
      11.  
        film.Add("张无忌", "倚天屠龙记");
      12.  
        film.Add("杨过", "神雕侠侣");
      13.  
        film.Add("令狐冲", "笑傲江湖");
      14.  
        Console.WriteLine("集合现在的元素个数为{0}", film.Count);
      15.  
        film.Remove("杨过");
      16.  
        //遍历集合
      17.  
        Console.WriteLine("武侠电影的主角及电影名");
      18.  
        Console.WriteLine("/t主角/t电影");
      19.  
        foreach (KeyValuePair < string, string > kvp in film)
      20.  
        {
      21.  
        Console.WriteLine("/t{0}/t{1}", kvp.Key, kvp.Value);
      22.  
        }
      23.  
        //检查元素是否存在,如不存在,添加
      24.  
        if (!film.ContainsKey("段誉"))
      25.  
        {
      26.  
        film.Add("段誉", "天龙八部");
      27.  
        }
      28.  
        //获取键的集合
      29.  
        Dictionary < string, string > .KeyCollection keys = film.Keys;
      30.  
        //遍历键的集合
      31.  
        Console.WriteLine("受欢迎的武侠片中主角名");
      32.  
        foreach (string str in keys)
      33.  
        {
      34.  
        Console.WriteLine(str);
      35.  
        }
      36.  
        Dictionary < string, string > .ValueCollection values = film.Values;
      37.  
        //遍历值的集合
      38.  
        Console.WriteLine("最受欢迎的武侠片");
      39.  
        foreach (string strfilm in values)
      40.  
        {
      41.  
        Console.WriteLine(strfilm);
      42.  
        }
      43.  
        //遍历元素的另一种方法
      44.  
        Console.WriteLine("和哈希表相同的遍历元素方法");
      45.  
        foreach (string strname in film.Values)
      46.  
        {
      47.  
        Console.WriteLine(strname);
      48.  
        }
      49.  
        //获取键对应的值
      50.  
        string myfilm = film["令狐冲"];
      51.  
        Console.WriteLine("主角为令狐冲的电影名{0}", myfilm);
      52.  
        //获取键对应值的TryGetValue方法
      53.  
        string objfilm = string.Empty;
      54.  
        if (film.TryGetValue("段誉", out objfilm))
      55.  
        {
      56.  
        Console.WriteLine("主角为段誉的电影是{0}", objfilm);
      57.  
        }
      58.  
        else
      59.  
        Console.WriteLine("没有主角为段誉的电影");
      60.  
        Console.ReadKey();
      61.  
        }
      62.  
        }

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

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

       
       
  • 相关阅读:
    Python使用SMTP模块、email模块发送邮件
    harbor搭建及使用
    ELK搭建-windows
    ELK技术栈之-Logstash详解
    【leetcode】1078. Occurrences After Bigram
    【leetcode】1073. Adding Two Negabinary Numbers
    【leetcode】1071. Greatest Common Divisor of Strings
    【leetcode】449. Serialize and Deserialize BST
    【leetcode】1039. Minimum Score Triangulation of Polygon
    【leetcode】486. Predict the Winner
  • 原文地址:https://www.cnblogs.com/MCSFX/p/15000351.html
Copyright © 2011-2022 走看看