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