OneBigLoser
OneBigLoser
发布于 2024-07-19 / 26 阅读
0
0

Dictionary 的基本概念

Dictionary 的基本概念

想象你有一本电话簿,每个人的名字旁边都写着他们的电话号码。如果你想找到某个人的电话号码,你可以通过他们的名字来查找。在这个比喻中,人名就是"键"(Key),电话号码就是"值"(Value)。

在编程中,Dictionary 就像这本电话簿。它是一种数据结构,用于存储键值对。每个键都是唯一的,你可以通过键来访问对应的值。这种通过键查找值的方式非常快,就像在电话簿中通过名字找到电话号码一样。

基本概念

Dictionary 是 C# 中的一种通用集合类,它位于 System.Collections.Generic 命名空间下。Dictionary 类用于存储键值对(key-value pairs),其中每个键(key)都是唯一的,并且每个键都映射到一个特定的值(value)。

用途

Dictionary 常用于以下情况:

  1. 快速查找:需要通过键快速查找对应的值。

  2. 映射关系:需要存储一对一的映射关系,如学生的学号和姓名。

  3. 去重:需要存储唯一的键并确保键的唯一性。

在游戏开发中的用途

在游戏开发中,Dictionary 类非常有用,例如:

  1. 管理游戏对象:可以用来存储和管理游戏对象,如根据对象 ID 快速查找对象。

  2. 配置和数据管理:可以用来存储游戏配置数据,如物品属性、角色数据等。

  3. 事件处理:可以用来存储和管理事件处理函数,快速找到对应的处理函数。

语法规则及声明

要使用 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();
    }
}

优点和缺点

优点

  1. 快速查找Dictionary 允许通过键快速查找对应的值,查找时间复杂度为 O(1)。

  2. 键唯一性:保证每个键在字典中是唯一的,避免了重复键的问题。

  3. 灵活性:可以存储任意类型的键和值。

缺点

  1. 内存消耗Dictionary 由于内部实现机制,可能会占用更多的内存。

  2. 无序性Dictionary 中的键值对是无序的,如果对顺序有要求,就需要额外处理。

  3. 性能开销:在某些情况下(如高频率的添加和删除操作),可能会影响性能。

基础题目和进阶题目

基础题目

  1. 创建一个 Dictionary<int, string>,并添加一些学生的学号和姓名,然后输出所有学生的信息。

  2. 创建一个 Dictionary<string, float>,并实现一个方法从字典中删除所有价格低于指定值的产品。

  3. 创建一个 Dictionary<string, int>,计算并输出字典中所有值的总和。

进阶题目

  1. 创建一个 Dictionary<string, List<int>>,其中键是课程名称,值是学生成绩列表。实现一个方法,计算并输出每门课程的平均成绩。

  2. 创建一个 Dictionary<string, Product>,其中 Product 类包含 NamePrice 属性。实现一个方法,通过产品名称查找产品并输出其信息。

  3. 创建一个 Dictionary<string, Employee>,其中 Employee 类包含 NamePositionSalary 属性。实现一个方法,输出所有职位为 Manager 的员工信息。


评论