Dictionary 的基本概念
想象你有一本电话簿,每个人的名字旁边都写着他们的电话号码。如果你想找到某个人的电话号码,你可以通过他们的名字来查找。在这个比喻中,人名就是"键"(Key),电话号码就是"值"(Value)。
在编程中,Dictionary
就像这本电话簿。它是一种数据结构,用于存储键值对。每个键都是唯一的,你可以通过键来访问对应的值。这种通过键查找值的方式非常快,就像在电话簿中通过名字找到电话号码一样。
基本概念
Dictionary
是 C# 中的一种通用集合类,它位于 System.Collections.Generic
命名空间下。Dictionary
类用于存储键值对(key-value pairs),其中每个键(key)都是唯一的,并且每个键都映射到一个特定的值(value)。
用途
Dictionary
常用于以下情况:
快速查找:需要通过键快速查找对应的值。
映射关系:需要存储一对一的映射关系,如学生的学号和姓名。
去重:需要存储唯一的键并确保键的唯一性。
在游戏开发中的用途
在游戏开发中,Dictionary
类非常有用,例如:
管理游戏对象:可以用来存储和管理游戏对象,如根据对象 ID 快速查找对象。
配置和数据管理:可以用来存储游戏配置数据,如物品属性、角色数据等。
事件处理:可以用来存储和管理事件处理函数,快速找到对应的处理函数。
语法规则及声明
要使用 Dictionary
,需要先引入 System.Collections.Generic
命名空间。声明一个 Dictionary
非常简单,只需要指定键和值的类型。例如:
using System.Collections.Generic;
Dictionary<int, string> studentNames = new Dictionary<int, string>();
Dictionary<string, float> productPrices = new Dictionary<string, float>();
Dictionary<Guid, MyClass> objects = new Dictionary<Guid, MyClass>();
常用方法
Add(TKey key, TValue value)
:向字典中添加一个键值对。Remove(TKey key)
:从字典中移除指定键的键值对。ContainsKey(TKey key)
:检查字典中是否包含指定的键。TryGetValue(TKey key, out TValue value)
:尝试获取指定键的值。Count
:获取字典中键值对的数量。Clear()
:清空字典中的所有键值对。Keys
:获取字典中所有的键。Values
:获取字典中所有的值。
示例代码及解释
示例1:基本操作
using System;
using System.Collections.Generic;
public class Program
{
public static void Main()
{
Dictionary<int, string> studentNames = new Dictionary<int, string>();
// 添加键值对
studentNames.Add(1, "Alice");
studentNames.Add(2, "Bob");
studentNames.Add(3, "Charlie");
// 输出字典中的所有键值对
foreach (var kvp in studentNames)
{
Console.WriteLine($"Key: {kvp.Key}, Value: {kvp.Value}");
}
// 获取键值对的数量
Console.WriteLine($"Count: {studentNames.Count}");
// 检查是否包含某个键
bool containsKey2 = studentNames.ContainsKey(2);
Console.WriteLine($"Contains key 2: {containsKey2}");
// 尝试获取某个键的值
if (studentNames.TryGetValue(3, out string value))
{
Console.WriteLine($"Value for key 3: {value}");
}
// 移除键值对
studentNames.Remove(2);
Console.WriteLine($"Count after removal: {studentNames.Count}");
// 清空字典
studentNames.Clear();
Console.WriteLine($"Count after clearing: {studentNames.Count}");
}
}
示例2:在游戏开发中的应用
using System;
using System.Collections.Generic;
public class Enemy
{
public string Name { get; set; }
public int Health { get; set; }
public Enemy(string name, int health)
{
Name = name;
Health = health;
}
public void TakeDamage(int damage)
{
Health -= damage;
Console.WriteLine($"{Name} took {damage} damage, remaining health: {Health}");
}
}
public class Game
{
private Dictionary<int, Enemy> enemies;
public Game()
{
enemies = new Dictionary<int, Enemy>();
}
public void AddEnemy(int id, Enemy enemy)
{
enemies.Add(id, enemy);
}
public void UpdateEnemies()
{
foreach (var enemy in enemies.Values)
{
enemy.TakeDamage(10);
}
}
public void RemoveEnemy(int id)
{
enemies.Remove(id);
}
public void PrintAllEnemies()
{
foreach (var kvp in enemies)
{
Console.WriteLine($"Enemy ID: {kvp.Key}, Name: {kvp.Value.Name}, Health: {kvp.Value.Health}");
}
}
}
public class Program
{
public static void Main()
{
Game game = new Game();
// 添加敌人
game.AddEnemy(1, new Enemy("Goblin", 100));
game.AddEnemy(2, new Enemy("Orc", 150));
// 更新敌人状态
game.UpdateEnemies();
// 打印所有敌人信息
game.PrintAllEnemies();
// 移除一个敌人
game.RemoveEnemy(1);
// 打印所有敌人信息
game.PrintAllEnemies();
}
}
优点和缺点
优点
快速查找:
Dictionary
允许通过键快速查找对应的值,查找时间复杂度为 O(1)。键唯一性:保证每个键在字典中是唯一的,避免了重复键的问题。
灵活性:可以存储任意类型的键和值。
缺点
内存消耗:
Dictionary
由于内部实现机制,可能会占用更多的内存。无序性:
Dictionary
中的键值对是无序的,如果对顺序有要求,就需要额外处理。性能开销:在某些情况下(如高频率的添加和删除操作),可能会影响性能。
基础题目和进阶题目
基础题目
创建一个
Dictionary<int, string>
,并添加一些学生的学号和姓名,然后输出所有学生的信息。创建一个
Dictionary<string, float>
,并实现一个方法从字典中删除所有价格低于指定值的产品。创建一个
Dictionary<string, int>
,计算并输出字典中所有值的总和。
进阶题目
创建一个
Dictionary<string, List<int>>
,其中键是课程名称,值是学生成绩列表。实现一个方法,计算并输出每门课程的平均成绩。创建一个
Dictionary<string, Product>
,其中Product
类包含Name
和Price
属性。实现一个方法,通过产品名称查找产品并输出其信息。创建一个
Dictionary<string, Employee>
,其中Employee
类包含Name
、Position
和Salary
属性。实现一个方法,输出所有职位为Manager
的员工信息。