在C#编程中,有一种特殊的数据类型叫做"字典"(Dictionary)。它是一种具有键值对的数据结构,其中每个键都是唯一的。这种类型在C#的System.Collections.Generic命名空间中,具体类型是Dictionary<TKey, TValue>。
字典特性
- Dictionary<TKey, TValue> 存储键值对。
- 属于System.Collection.Generic命名空间。
- 实现 IDictionary <TKey,TValue>接口。
- 键值对。每个元素都由一个唯一的键和一个值组成,不能为null。
- 值可以为null或重复。
- 快速查找。可以通过在索引器中传递相关键来访问值,例如 myDictionary[key]
- 元素存储为 KeyValuePair <TKey,TValue> 对象。
- 可动态调整大小。字典的大小可以根据需要动态调整
字典的主要作用如下:
- 存储数据:字典可以存储大量的数据,并且可以快速地查找和访问这些数据。
- 键值对:字典以键值对的形式存储数据,这种结构使得查找和访问数据非常高效。
字典的语法
Dictionary<TKey, TValue> dictionary = new Dictionary<TKey, TValue>();//语法格式
//TKey是键的类型,TValue是值的类型
示例代码:
Dictionary<string, int> myDictionary = new Dictionary<string, int>();
//字典的键是字符串类型,值是整数类型。
//通过键来添加、获取或删除值。
添加元素到字典:
dictionary.Add(key, value);
获取字典中的值:
TValue value = dictionary[key];
检查字典中是否包含某个键:
bool containsKey = dictionary.ContainsKey(key);
获取字典中的所有键或所有值:
ICollection<TKey> keys = dictionary.Keys;
ICollection<TValue> values = dictionary.Values;
使用字典来存储和访问数据
字典的声明和初始化(创建字典)、简单使用:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DictionaryType
{
internal class Program
{
static void Main(string[] args)
{
//声明、初始化(创建字典)
Dictionary<string, int> myDictionary = new Dictionary<string, int>();
// 添加键值对(添加元素)
myDictionary.Add("Apple", 1);//添加苹果1个
myDictionary.Add("Orange", 10);//添加橙子10个
// 获取键对应的值
int appleCount = myDictionary["Apple"];//获取Apple对应的值1
int OrangeCount = myDictionary["Orange"];//获取Orange对应的值10
Console.WriteLine("苹果数量: {0}",appleCount);//苹果数量:1
Console.WriteLine("橙子数量: {0}",OrangeCount); //橙子数量:10
}
}
}
//报错提醒:
Dictionary<string, int> myDictionary = new Dictionary<string, int>();
//已经固定了该字典,键为string类型,值为int类型。
Dictionary<string, string> studentInfo = new Dictionary<string, string>();
//已经固定了该字典,键为string类型,值为string类型。因此就不再报错了。
字典的创建、添加、删除、更新完整示例代码:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DictionaryType
{
internal class Program
{
static void Main(string[] args)
{
//string,int
Dictionary<string, int> myDictionary = new Dictionary<string, int>();
//string,string
Dictionary<string, string> studentInfo = new Dictionary<string, string>();
// 添加一个键值对
myDictionary.Add("Apple", 1);
myDictionary.Add("Orange", 10);
studentInfo.Add("Name","ZhangSan");
// 获取键对应的值
int appleCount = myDictionary["Apple"];//获取Apple对应的值1
int OrangeCount = myDictionary["Orange"];//获取Orange对应的值10
string stuName = studentInfo["Name"];//获取Name对应的值ZhangSan
//删除键值对
//现在不想要“Apple”了
myDictionary.Remove("Apple");
//
//Console.WriteLine(myDictionary["Apple"]);//由于不存在“Apple”会报错
Console.WriteLine(myDictionary["Orange"]);//10
Console.WriteLine("橙子数量: {0}",OrangeCount);//橙子数量:10
Console.WriteLine("学生姓名: "+stuName);
//修改字典中键值对的值
//由于“Orange”数量是10,现在需要增加到20
//修改字典中键值对的值
int OrangeCount2 = myDictionary["Orange"];//再次获取Orange,对应的值20
Console.WriteLine("橙子数量: {0}", OrangeCount2);//橙子数量:20
//现在又想把橙子Orange20个换成香蕉Banana20个
//方法:无法把橙子Orange直接修改成香蕉,只有先删除后添加
myDictionary.Remove("Orange");//先删除
myDictionary.Add("Banana",20);//后添加
int BananaCount = myDictionary["Banana"];//获取Orange对应的值20
Console.WriteLine("香蕉数量: {0}", OrangeCount2);//橙子数量:20
}
}
}
为什么不能直接修改字典中键呢?比如"Orange", 20直接修改"Banana",20。
在C#中,规定不能直接修改字典(Dictionary)中的键(Key)。原因是字典中的键必须是唯一的,如果试图更改现有的键,那么可能会出现两个键相同的情况,这违反了字典的数据结构规则。
然而,可以通过以下步骤来实现修改字典键值的目标:
- 删除原有的键值对。
- 添加新的键值对。
提示:
在C#中,字典(Dictionary)的值可以是任何类型。当你创建一个字典时,你需要指定键(Key)和值(Value)的类型。值的类型可以是任何有效的C#数据类型,包括基本数据类型(如 int、double、string 等)、自定义类、接口、委托、数组等。自定义类、接口、委托后面会陆续学到。
个人学习观点(针对新手入门)仅供参考:在学习到某个知识点时(比如本节,字典)以学习字典的相关知识点为主,如果涉及到学过的,那就去回顾,如果出现新的概念或者知识点,不要纠结,知道这个概念或者知识点存在关联即可,随着学习到是概念、知识点越来越多,印象也会进一步加深,各知识点之间的关联也会进一步加强,直到融会贯通。
常见字典键值的类型:
Dictionary<string, int> dictionary1 = new Dictionary<string, int>();
// 键为字符串,值为整数
Dictionary<int, string> dictionary2 = new Dictionary<int, string>();
// 键为整数,值为字符串
Dictionary<string, CustomClass> dictionary3 = new Dictionary<string, CustomClass>();
// 键为字符串,值为自定义类
Dictionary<string, List<int>> dictionary4 = new Dictionary<string, List<int>>();
// 键为字符串,值为整数列表
常见的字典用法示例代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DictionaryType2
{
internal class Program
{
static void Main(string[] args)
{
Dictionary<string, int> dictionary = new Dictionary<string, int>();
dictionary.Add("Apple", 1);
dictionary.Add("Banana", 2);
dictionary.Add("Orange", 3);
int appleCount = dictionary["Apple"]; // 获取"Apple"对应的值
int bananaCount = dictionary["Banana"]; // 获取""Banana"对应的值
int orangeCount = dictionary["Orange"];// 获取""Orange"对应的值
bool containsKey = dictionary.ContainsKey("Banana"); // 检查字典中是否包含"Banana"这个键
ICollection<string> keys = dictionary.Keys; // 获取字典中的所有键
ICollection<int> values = dictionary.Values; // 获取字典中的所有值
Console.WriteLine(dictionary["Apple"]);//1
Console.WriteLine(dictionary["Banana"]);//2
Console.WriteLine(dictionary["Orange"]);//3
Console.WriteLine(containsKey);//True
}
}
}