9.Dictionary

9.常用泛型数据结构类-Dictionary


9.1 知识点

Dictionary的本质

可以将Dictionary理解为拥有泛型的Hashtable,它也是基于键的哈希代码组织起来的键/值对。键值对类型从Hashtable的object变为了可以自己制定的泛型。

Dictionary的申明

需要引用命名空间 using System.Collections.Generic

Dictionary<int, string> dictionary = new Dictionary<int, string>();
Dictionary<int, string> dictionary = new Dictionary<int, string>()
{
    {1, "One"},
    {2, "Two"},
    {3, "Three"}
};

Dictionary的增删查改和遍历

当前dictionary

{}

Add方法:直接尾部添加元素。

dictionary.Add(1, "111");
dictionary.Add(2, "222");
dictionary.Add(3, "333");
// 注意:不能出现相同键
// dictionary.Add(3, "123");// 运行的时候才会报错

当前dictionary

{ 1:"111", 2:"222", 3:"333" }

当前dictionary

{ 1:"111", 2:"222", 3:"333" }

Remove方法:通过键去删除。

dictionary.Remove(1);
dictionary.Remove(4); // 删除不存在键,没有反应

Clear方法:清空。

// dictionary.Clear();// 为了方便后面演示,注释

当前dictionary

{ 2:"222", 3:"333" }

当前dictionary

{ 2:"222", 3:"333" }

Dictionary[x]索引器get:通过键查看值。

Console.WriteLine(dictionary[2]); // 222
// Console.WriteLine(dictionary[4]);// 找不到,运行时直接报错,Hashtable不会报错会返回空

ContainsKey方法:查看键是否存在。

if (dictionary.ContainsKey(2))
{
    Console.WriteLine("存在键为2的键值对"); // 存在键为2的键值对
}

ContainsValue方法:查看值是否存在。

if (dictionary.ContainsValue("222"))
{
    Console.WriteLine("存在值为222的键值对"); // 存在值为222的键值对
}

当前dictionary

{ 2:"222", 3:"333" }

Dictionary[x] = xx索引器set:通过键修改值。

Console.WriteLine(dictionary[2]); // 222
dictionary[2] = "555";
Console.WriteLine(dictionary[2]); // 555

当前dictionary

{ 2:"555", 3:"333" }

遍历

当前dictionary

{ 2:"555", 3:"333" }

Count方法:返回Dictionary的长度。

Console.WriteLine(dictionary.Count);

foreach循环:遍历所有键Dictionary.Keys

foreach (int item in dictionary.Keys)
{
    Console.WriteLine(item);
    Console.WriteLine(dictionary[item]);
    // 2
    // 555
    // 3
    // 333
}

foreach循环:遍历所有值Dictionary.Values

foreach (string item in dictionary.Values)
{
    Console.WriteLine(item);
    // 555
    // 333
}

foreach循环:用KeyValuePair<键类型, 值类型>键值对一起遍历Dictionary。

foreach (KeyValuePair<int, string> item in dictionary)
{
    Console.WriteLine("键:" + item.Key + " 值:" + item.Value);
    // 键:2 值:555
    // 键:3 值:333
}

当前dictionary

{ 2:"555", 3:"333" }

9.2 知识点代码

using System;
using System.Collections.Generic;

namespace Lesson08_Dictionary
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Dictionary");

            #region 知识点一 Dictionary的本质
            //可以将Dictionary理解为 拥有泛型的Hashtable
            //它也是基于键的哈希代码组织起来的 键/值对
            //键值对类型从Hashtable的object变为了可以自己制定的泛型
            #endregion

            #region 知识点二 Dictionary的申明
            //需要引用命名空间 using System.Collections.Generic
            Dictionary<int, string> dictionary = new Dictionary<int, string>();
            #endregion

            #region 知识点三  Dictionary的增删查改和遍历

            #region 增

            //当前dictionary {}

            //Add方法 直接尾部添加元素
            dictionary.Add(1, "111");
            dictionary.Add(2, "222");
            dictionary.Add(3, "333");
            //注意:不能出现相同键
            //dictionary.Add(3, "123");//运行的时候才会报错

            //当前dictionary {1:"111",2:"222",3:"333"}
            #endregion

            #region 删

            //当前dictionary {1:"111",2:"222",3:"333"}

            //Remove方法 通过键去删除
            dictionary.Remove(1);
            dictionary.Remove(4);//删除不存在键 没反应

            //Clear方法 清空
            //dictionary.Clear();//为了方便后面演示 注释

            //当前dictionary {2:"222",3:"333"}

            #endregion

            #region 查

            //当前dictionary {2:"222",3:"333"}

            //Dictionary[x] 通过键查看值
            Console.WriteLine(dictionary[2]);//222
            //Console.WriteLine(dictionary[4]);//找不到 运行时直接报错 Hashtable不会报错会返回空

            //ContainsKey方法 查看键是否存在
            if (dictionary.ContainsKey(2))
            {
                Console.WriteLine("存在键为2的键值对");//存在键为2的键值对
            }

            //ContainsValue方法 查看值是否存在
            if (dictionary.ContainsValue("222"))
            {
                Console.WriteLine("存在值为222的键值对");//存在值为222的键值对
            }

            //当前dictionary {2:"222",3:"333"}

            #endregion

            #region 改

            //当前dictionary {2:"222",3:"333"}

            //Dictionary[x] = xx  通过键修改值
            Console.WriteLine(dictionary[2]);//222
            dictionary[2] = "555";
            Console.WriteLine(dictionary[2]);//555

            //当前dictionary {2:"555",3:"333"}

            #endregion

            #region 遍历

            Console.WriteLine("**************");

            //当前dictionary {2:"555",3:"333"}

            //Count方法 返回Dictionary的长度
            Console.WriteLine(dictionary.Count);

            Console.WriteLine("*****foreach循环 遍历所有键*****");
            //foreach循环 遍历所有键Dictionary.Keys
            foreach (int item in dictionary.Keys)
            {
                Console.WriteLine(item);
                Console.WriteLine(dictionary[item]);
                //2
                //555
                //3
                //333
            }

            Console.WriteLine("*****foreach循环 遍历所有值*****");
            //foreach循环 遍历所有值Dictionary.Values
            foreach (string item in dictionary.Values)
            {
                Console.WriteLine(item);
                //555
                //333
            }

            //foreach循环 用KeyValuePair<键类型, 值类型>键值对一起遍历Dictionary
            Console.WriteLine("*****foreach循环 键值对一起遍历*****");
            foreach (KeyValuePair<int, string> item in dictionary)
            {
                Console.WriteLine("键:" + item.Key + "值:" + item.Value);
                //键:2值:555
                //键:3值:333
            }

            //当前dictionary {2:"555",3:"333"}
            #endregion

            #endregion


        }
    }
}

9.3 练习题

使用字典存储0~9的数字对应的大写文字,提供一个方法,返回数的大写

class语句块内,主函数外

// 返回大写数字方法
static string ReturnUppercaseNumber(int num)
{
    // 声明一个<int, string>的字典
    Dictionary<int, string> dic = new Dictionary<int, string>();

    // 把大写数字的映射关系逐个添加到字典中
    dic.Add(0, "零");
    dic.Add(1, "壹");
    dic.Add(2, "贰");
    dic.Add(3, "叁");
    dic.Add(4, "肆");
    dic.Add(5, "伍");
    dic.Add(6, "陆");
    dic.Add(7, "柒");
    dic.Add(8, "捌");
    dic.Add(9, "玖");

    // 声明存储大写数字变量
    string uppercaseNumberString = "";

    // 得百位
    int bai = num / 100;
    if (bai != 0)
    {
        uppercaseNumberString += dic[bai];
    }

    // 得十位数
    int shi = num % 100 / 10;
    if (shi != 0 || uppercaseNumberString != "")
    {
        uppercaseNumberString += dic[shi];
    }

    // 得个位
    int ge = num % 10;
    uppercaseNumberString += dic[ge];

    // 返回存储大写数字变量
    return uppercaseNumberString;
}

主函数内

try
{
    Console.WriteLine("请输入一个不超过3位的数");
    Console.WriteLine(ReturnUppercaseNumber(int.Parse(Console.ReadLine())));
    // 直接把输入的内容传入返回大写数字方法中
}
catch
{
    Console.WriteLine("请输入数字");
}

计算每个字母出现的次数“Welcome to Unity World!”,使用字典存储,最后遍历整个字典,不区分大小写

主函数内

// 声明<char, int>字典
Dictionary<char, int> dic = new Dictionary<char, int>();

string targetString = "Welcome to Unity World!"; // 存储目标字符串
targetString = targetString.ToLower(); // 全部转成小写

// 遍历目标字符串
for (int i = 0; i < targetString.Length; i++)
{
    // 如果字典里有当前这个char,就把数量+1
    if (dic.ContainsKey(targetString[i]))
    {
        dic[targetString[i]] += 1;
    }

    // 如果字典里没有当前这个char,就把当前这个char存入字典中,数量为1
    else
    {
        dic.Add(targetString[i], 1);
    }
}

// 遍历字典,打印各个字母的数量
foreach (char item in dic.Keys)
{
    Console.WriteLine("字母{0}出现了{1}次", item, dic[item]);
    // 字母w出现了2次
    // 字母e出现了2次
    // 字母l出现了2次
    // 字母c出现了1次
    // 字母o出现了3次
    // 字母m出现了1次
    // 字母 出现了3次
    // 字母t出现了2次
    // 字母u出现了1次
    // 字母n出现了1次
    // 字母i出现了1次
    // 字母y出现了1次
    // 字母r出现了1次
    // 字母d出现了1次
    // 字母!出现了1次
}

9.4 练习题代码

using System;
using System.Collections.Generic;

namespace Lesson08_练习题
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Dictionary练习题");

            //主函数内

            #region 练习题一
            //使用字典存储0~9的数字对应的大写文字
            //提示用户输入一个不超过三位的数,提供一个方法,返回数的大写
            //例如:306,返回叁零陆

            try
            {
                Console.WriteLine("请输入一个不超过3位的数");
                Console.WriteLine(ReturnUppercaseNumber(int.Parse(Console.ReadLine())));
                //直接把输入的内容传入返回大写数字方法中
            }
            catch
            {
                Console.WriteLine("请输入数字");
            }

            #endregion

            #region 练习题二
            //计算每个字母出现的次数“Welcome to Unity World!”,使用字典存储,最后遍历整个字典,不区分大小写

            //声明<char, int>字典
            Dictionary<char, int> dic = new Dictionary<char, int>();

            string targetString = "Welcome to Unity World!";//存储目标字符串
            targetString = targetString.ToLower();//全部转成小写

            //遍历目标字符串
            for (int i = 0; i < targetString.Length; i++)
            {
                //如果字典里有当前这个char 就把数量+1
                if (dic.ContainsKey(targetString[i]))
                {
                    dic[targetString[i]] += 1;
                }

                //如果字典里没有当前这个char 就把当前这个char存入字典中 数量为1
                else
                {
                    dic.Add(targetString[i], 1);
                }
            }

            //遍历字典 打印各个字母的数量
            foreach (char item in dic.Keys)
            {
                Console.WriteLine("字母{0}出现了{1}次", item, dic[item]);
                //字母w出现了2次
                //字母e出现了2次
                //字母l出现了2次
                //字母c出现了1次
                //字母o出现了3次
                //字母m出现了1次
                //字母 出现了3次
                //字母t出现了2次
                //字母u出现了1次
                //字母n出现了1次
                //字母i出现了1次
                //字母y出现了1次
                //字母r出现了1次
                //字母d出现了1次
                //字母!出现了1次
            }
            #endregion
        }

        //class语句块内 主函数外

        #region 练习题一

        //返回大写数字方法
        static string ReturnUppercaseNumber(int num)
        {
            //声明一个<int, string>的字典
            Dictionary<int, string> dic = new Dictionary<int, string>();

            //把大写数字的映射关系 逐个添加到字典中
            dic.Add(0, "零");
            dic.Add(1, "壹");
            dic.Add(2, "贰");
            dic.Add(3, "叁");
            dic.Add(4, "肆");
            dic.Add(5, "伍");
            dic.Add(6, "陆");
            dic.Add(7, "柒");
            dic.Add(8, "捌");
            dic.Add(9, "玖");

            //声明存储大写数字变量
            string uppercaseNumberString = "";

            //得百位
            int bai = num / 100;
            if (bai != 0)
            {
                uppercaseNumberString += dic[bai];
            }

            //得十位数
            int shi = num % 100 / 10;
            if (shi != 0 || uppercaseNumberString != "")
            {
                uppercaseNumberString += dic[shi];
            }

            //得个位
            int ge = num % 10;
            uppercaseNumberString += dic[ge];

            //返回存储大写数字变量
            return uppercaseNumberString;
        }

        #endregion
    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏