Unity的C#编程教程_59_字典 Dictionary 详解及应用练习

2023-11-17

C# Dictionary: Introduction

  • 字典
    • key 和 value 的配对

依然使用 Item 脚本作为案例:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[System.Serializable] // 在 Inspector 中可见
public class Item
{
    public string name;
    public int id;
    public Sprite icon;

}

建立 ItemDatabase 挂载到 Main Camera 上面:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ItemDatabase : MonoBehaviour
{
    public List<Item> itemList; // 创建一个物品的列表

    public Dictionary<int, Item> itemDictionary = new Dictionary<int, Item>(); // 创建一个物品的字典并初始化(初始化是必须的)
    // key 的类型为 int,value 的类型为 Item
    // key 和 value 形成配对

    // Start is called before the first frame update
    void Start()
    {
        Item sword = new Item(); // 初始化一个物品
        sword.name = "Sword"; // 设定物品的名字
        sword.id = 0; // 设定物品的 id

        itemList.Add(sword); // 为物品列表添加一个元素
        itemDictionary.Add(sword.id, sword); // 为物品字典添加一个元素

        // 使用列表的时候,我们需要通过遍历整个列表来查找某个元素
        // 使用字典的时候,我们可以通过物品的 id 直接查找到对应的元素

        var item = itemDictionary[sword.id];
        Debug.Log(item.name); // 通过 sword 的 id 就可以查找到对应物品
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

C# Dictionary: Looping through Dictionary

  • 循环遍历字典元素

建立 Item:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[System.Serializable] // 在 Inspector 中可见
public class Item
{
    public string name;
    public int id;
    public Sprite icon;
}

建立 ItemDatabase:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ItemDatabase : MonoBehaviour
{
    public Dictionary<int, Item> itemDictionary = new Dictionary<int, Item>();
    // 创建一个物品的字典并初始化(初始化是必须的)

    // Start is called before the first frame update
    void Start()
    {
        Item sword = new Item(); // 初始化一个物品
        sword.name = "Sword"; // 设定物品的名字
        sword.id = 0; // 设定物品的 id

        Item axe = new Item();
        axe.name = "Axe";
        axe.id = 1;

        Item bike = new Item();
        bike.name = "Bike";
        bike.id = 2;

        itemDictionary.Add(sword.id, sword); // 为物品字典添加一个元素
        itemDictionary.Add(axe.id, axe);
        itemDictionary.Add(bike.id, bike);

        // 遍历字典:
        foreach(KeyValuePair<int,Item> item in itemDictionary)
        {
            Debug.Log("Key: " + item.Key);
            Debug.Log("Value: " + item.Value.name);
        }
        // 这里我们也可以写成 foreach(var item in itemDictionary)

        // 遍历字典的 key:
        foreach(var key in itemDictionary.Keys)
        {
            Debug.Log("Key: " + key);
        }
        // 这里的 key 是 int 类型
        // 所以也可以写成 foreach(int key in itemDictionary.Keys)

        // 遍历字典的 value:
        foreach (var value in itemDictionary.Values)
        {
            Debug.Log("Item Name: " + value.name);
        }

    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

注意:字典中,key 值是不能有重复的,value 可以重复。

另外,在字典中查找的时候,输入的 key 必须存在,否则会报错,为了避免这种情况,可以在前面插入一个检查的程序:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ItemDatabase : MonoBehaviour
{
    public Dictionary<int, Item> itemDictionary = new Dictionary<int, Item>();
    // 创建一个物品的字典并初始化(初始化是必须的)

    // Start is called before the first frame update
    void Start()
    {
        Item sword = new Item(); // 初始化一个物品
        sword.name = "Sword"; // 设定物品的名字
        sword.id = 0; // 设定物品的 id

        Item axe = new Item();
        axe.name = "Axe";
        axe.id = 1;

        Item bike = new Item();
        bike.name = "Bike";
        bike.id = 2;

        itemDictionary.Add(sword.id, sword); // 为物品字典添加一个元素
        itemDictionary.Add(axe.id, axe);
        itemDictionary.Add(bike.id, bike);

        if (itemDictionary.ContainsKey(60)) // 检测 60 号物品是否存在
        {
            Debug.Log(itemDictionary[60].name); // 存在的话打印名字
        }
        else
        {
            Debug.Log("Key does not exist."); // 否则打印不存在
        }

        if (itemDictionary.ContainsKey(1)) // 检测 1 号物品是否存在
        {
            Debug.Log(itemDictionary[1].name); // 存在的话打印名字
        }
        else
        {
            Debug.Log("Key does not exist."); // 否则打印不存在
        }

    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

C# Dictionary: When to Use

  • 什么时候使用字典
    • 当我们在操作大型的列表时候,该用字典会更为便利
    • 比如我们的道具系统,玩家购买道具的时候,发出指令(输入对应的物品 id)
    • 如果使用列表,我们需要遍历整个列表来查找该物品,而使用字典的话可以直接通过 key 和 value 配对找到
    • 另外比如我们的物品栏,每个空格对应一个 key,然后可以链接不同的物品(即 value)

C# Dictionary: Using Dictionary for Player Connections

  • 在线玩家监测系统
    • 每个玩家登陆游戏的时候分配一个 id
    • 使用字典把 id 和玩家进行配对组合
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player
{
    public string name;
    public int id;

    public Player(int id) // 构造函数,id是必须的属性
    {
        this.id = id;
    }
}


public class Main : MonoBehaviour
{
    public Dictionary<int, Player> playersDict = new Dictionary<int, Player>();
    // 设定一个登陆玩家的字典,并初始化

    Player p1;
    Player p2;

    // Start is called before the first frame update
    void Start()
    {
        p1 = new Player(21); // 登陆一个玩家,分配一个 id
        p1.name = "AA";

        p2 = new Player(34);
        p2.name = "BB";

        playersDict.Add(p1.id, p1); // 把登陆的玩家添加到玩家字典
        playersDict.Add(p2.id, p2);
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space)) // 按下空格键
        {
            if (playersDict.ContainsKey(34)) // 查询玩家 id 是否存在
            {
                Debug.Log("Player Name: " + playersDict[34].name); // 存在的话打印该玩家名字
            }
            else
            {
                Debug.Log("ID not exist!"); // 玩家 id 不存在
            }
        }
    }
}

运行后,会打印 p2 的名字。

C# Dictionary: Using Dictionary with Primitive Types

  • 在字典中使用一些预设的类型,比如 int 和 string

设定一个字典,组成名字和年龄的配对:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class Main : MonoBehaviour
{
    public Dictionary<string, int> player = new Dictionary<string, int>();
    // 建立一个字典,并初始化,key 为玩家名字,value 为玩家年龄

    // Start is called before the first frame update
    void Start()
    {
        player.Add("AA", 20); // 添加玩家
        player.Add("BB", 21);
        player.Add("CC", 34);

        int age = player["BB"]; // 获得第二个玩家的年龄

        Debug.Log("The age of BB is " + age); // 显示年龄
    }

    // Update is called once per frame
    void Update()
    {

    }
}

注意:字典只可以通过 key 来查找 value,而不能反过来。

再设计一个 book 的字典:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class Main : MonoBehaviour
{
    public Dictionary<int, string> book = new Dictionary<int, string>();
    // 建立一个字典,并初始化,key 为玩家名字,value 为玩家年龄

    // Start is called before the first frame update
    void Start()
    {
        book.Add(123, "Good to go"); // 添加书本
        book.Add(22, "What is that");
        book.Add(25, "How to sell");

        foreach(KeyValuePair<int,string> item in book) // 打印所有书目
        {
            Debug.Log("ID: " + item.Key + " Book: " + item.Value);
        }

    }

    // Update is called once per frame
    void Update()
    {

    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity的C#编程教程_59_字典 Dictionary 详解及应用练习 的相关文章

  • 打击垃圾邮件机器人

    我的网站中有 C 表单 希望防止垃圾邮件机器人填写它 诀窍是 我想避免 CAPTHA 或任何其他用户输入 以避免丢失单个注册 以下是我心中的一些技巧 隐藏输入栏 问题 这还有效吗 跟踪时间 从第一个用户输入 关注名字 到发布表单 人类需要
  • 分层架构中的异常处理

    我们正在分层设计中重构 当然还有重新设计 我们的服务 我们有服务操作层 BLL 网络抽象层 gt 处理网络代理 数据抽象层 但我们对我们的异常处理策略有点困惑 我们不想向外界透露太多 BLL 的信息 从其他层到bll就可以了 我们不想让 t
  • 对静态成员变量的未定义引用

    我有一个有静态成员的类 它也是我的程序中其他几个类的基类 这是它的头文件 ifndef YARL OBJECT HPP define YARL OBJECT HPP namespace yarlObject class YarlObject
  • 使用 C++ 拆分“[常规设置]”格式的节字符串

    我是 C 新手 我想读取包含部分和键值对的 ini 文件 根据部分 我想读取相应键的值 首先 我想阅读方括号内的部分 请帮忙 谢谢 对于真正的 INI 文件解析 我强烈建议iniparser库 http ndevilla free fr i
  • WP8.1 C# 绑定联系人图像

    信息很简单 我正在尝试创建一个可以显示用户联系人的应用程序 我也是一名自学成才的程序员 所以我在某些方面有编程经验 但总体来说我对数据绑定相对较新 首先 我有一个 ListView 控件 其中包含图像绑定
  • 在调用堆栈中看到大量 clr!CLR Semaphore::Wait

    我们看到很多像下面这样的调用堆栈 我可以知道什么条件 情况会发生这种情况吗 OS Thread Id 0x48654 559 Current frame ntdll NtWaitForSingleObject 0xa Child SP Re
  • 使用预编译头减少 clang 编译时间

    我正在开发一个数据库项目 该项目将查询 以某种高级语言表示 编译为 C 代码 这段代码由数据库编译并执行 那部分工作得很好 现在 我正在尝试减少 C 查询代码的编译时间 我想知道是否可以使用预编译头来提高性能 该查询被转换为一个名为 Que
  • 宏可以按参数数量重载吗?

    如何this https stackoverflow com q 9183993 153285工作 如何实现 C99 C 11 可变参数宏以仅根据为其提供多少个参数来扩展到不同的事物 编辑 请参阅末尾以获得现成的解决方案 要获得重载的宏 首
  • 无缝滚动瓷砖地图

    我正在开发一个自上而下的角色扮演游戏 并且想要实现无缝滚动地图 也就是说 当玩家探索世界时 地图之间没有加载屏幕 也没有通往下一个区域的 门 我有两种方法可以打破世界 在顶层 我有 区域 它只是 9 个 地图 的集合 这些区域仅由目录表示
  • 是否有一种算法可以在线性时间内计算数组反转?

    我知道有多少倒转 en wikipedia org wiki Inversion 28discrete mathematics 29 in an n 元素数组可以在 O n log n 操作使用增强型归并排序 http www geeksf
  • C++:初始化静态字符串成员

    我在 C 中初始化静态字符串成员时遇到一些问题 我有几个类 每个类都包含几个表示 id 的静态字符串成员 当我通过调用静态函数初始化变量时 一切都很好 但是 当我想为一个变量分配另一个变量的值时 它仍然保留空字符串 这段代码有什么问题 st
  • C for 循环索引:新 CPU 中的前向索引更快吗?

    在我订阅的邮件列表上 两位知识渊博的 IMO 程序员正在讨论一些优化的代码 并说了以下内容 在 5 8 年前发布的 CPU 上 向后迭代 for 循环稍微快一些 e g for int i x 1 i gt 0 i 因为比较i归零比将其与其
  • 带双重检查锁的单例设计模式

    假设您有以下代码 1 为什么我们使用双重检查锁 为什么单锁不够好 请提供详细的例子 2 这种实施方式的主要缺点是什么 我该如何证明呢 Thanks public sealed class SomeSingleton5 private sta
  • Visual Studio Code 调试默认 ASP.NET Core MVC WebApp:不起作用

    我正在使用 Manjaro linux 并尝试调试默认的 ASP NET Core MVC 项目 但调试停止 没有任何错误 我创建了该项目 dotnet new mvc in a Meow文件夹 没什么特别的 然后添加了新的配置 NET C
  • 使用宏计算源文件行数?

    是否可以使用 C C 预处理器将源文件中的行数计算为宏或某种编译时可用值 例如 我可以更换吗MAGIC1 MAGIC2 and MAGIC3在下面 并在使用时以某种方式获取值 4MAGIC3 MAGIC1 can be placed whe
  • TreeView:仅在子节点中存在复选框

    我需要一个树视图控件 根节点没有复选框 只有图像 所有子节点都有一个复选框 图像 C net 2 0 winforms 不是 wpf WinForms树视图默认不支持混合复选框 非复选框节点 您可以在树视图上全局启用复选框 并使用以下命令在
  • char* argv[] 在 c/c++ 中如何工作? [复制]

    这个问题在这里已经有答案了 我知道它用于使用命令行中的参数 但我没有得到声明 字符 argv 它是否意味着指向 char 数组的指针 如果是的话为什么没有大小 如果不是动态数组 就不需要有大小吗 我做了一些研究 发现有人说它会衰减为 cha
  • 如何在 C# 中以编程方式创建柔和的颜色?

    根据所需的颜色数量均匀分布地生成它们 如果指定的计数为 8 则看起来像这样 List
  • 清理堆分配对象的良好实践或约定?

    我正在学习C 我有 C C ObjC 背景 相当高级的语言 在 C 或 ObjC 上 作为函数或方法的结果返回堆分配的对象是很简单的 因为对象的清理是受管理的 按照惯例 会在适当的时候销毁 但我不知道在 C 中应该如何处理这个问题 例如 s
  • 从 STL 列表中删除项目

    我想创建一个函数 如果符合特定条件 则将项目从一个 STL 列表移动到另一个列表 这段代码不是这样做的方法 迭代器很可能会被擦除 函数失效并导致问题 for std list

随机推荐

  • C++学习(四六九)LRU Least Recently Used算法

    LRU是Least Recently Used的缩写 即最近最少使用 最近一段时间最少使用 是一种常用的页面置换算法 选择最近最久未使用的页面予以淘汰 该算法赋予每个页面一个访问字段 用来记录一个页面自上次被访问以来所经历的时间 t 当须淘
  • python解释器多版本安装

    文章目录 1 python解释器的安装 2 配置环境变量 3 在cmd窗口使用python多版本 1 python解释器的安装 要想让计算机能够识别并运行高级语言 要对应类型的翻译官 python这种编程语言的翻译官就是python解释器
  • 网页设计手绘板绘画板,适合初学者学习使用,HTML

    作品如下动态图 下载链接在文末 点我免费下载资源 资源下载链接 https download csdn net download weixin 43474701 34854658
  • Linux系统管理

    磁盘管理 磁盘基本概述 Linux中磁盘的命名方式与磁盘的接口有关 规则如下 传统IDE接口硬盘 dev hd a z SCISI接口硬盘 dev sd a z 虚拟化硬盘 dev vd a z 在设备名称的定义规则如下 其他分区可以以此类
  • MongoDB安装(win)Redis安装

    下载MongoDB 全MonogoDB链接 win安装 进入e盘 找到安装好的文件路径 以E 盘为例 在bin目录同级下创建一个文件夹 data 在data里面创建一个db和logs文件夹 进入logs创建一个文本文档 monogo log
  • 为分布式做准备吧——深入理解JVM

    文章目录 类加载机制 类执行机制 字节码解释执行 运行时 编译执行 反射执行 内存回收 内存空间 收集器 Sun JDK可用的GC 之前我们文章提到过 反射 说的比较浅显 我们这里来理解JVM 一个标准的JVM是这样的 JVM负责装载cla
  • 关于 剪映电脑版无法打开的问题!

    剪映专业版 安装到电脑上使用几次后 突然就打不开了 经过几天的漫长查找网上也无一个答案 说什么字体冲突的 都不是病根 这个bug病根是业务层加载不到veCreator dll 代码里尝试去加载veCreator dll dll 导致异常 下
  • 使用OSWatcher来监控服务器

    OSWatcher是oracle提供的监控服务器资源的工具 配合AWR等工具为调优数据库提供基本信息 OSWatcher有支持不同平台 WINDOWS平台下 OSWatcher For Windows OSWFW LINUX平台 OS Wa
  • RGMII信号是什么样子的----大揭秘

    RGMII信号 测试 1 测试RGMII 先判断RGMII信号频率多少 就知道是千兆百兆的模式 发送时钟信号 速率为Gbit s时 时钟速率为125MHz 速率为100Mbit s时 速率为25MHz 速率为10Mbit s时 速率为2 5
  • java自动化测试语言基础之方法

    java自动化测试语言基础之方法 文章目录 java自动化测试语言基础之方法 Java 方法 Java 方法 在前面几个章节中我们经常使用到 System out println 那么它是什么呢 println 是一个方法 System 是
  • Linux网络通信----htonl()、htons()、ntohl()、ntohs()四个函数

    转载 https blog csdn net miao19920101 article details 69398158 前言 今天在工作中用到htonl 这个函数 不是很理解 查阅资料之后随笔就记录下来 方便以后工作和学习翻阅 首先需要说
  • python反复运行清空plot图_仅清除matplotlib图的一部分

    我正在使用嵌入在Wx Python GUI中的matplotlib图来呈现一些数据 图中的内容 显示的数据 随点击按钮的功能不断变化 数据有两种类型 1 轮廓线 self axes contour x scale map y scale m
  • 并发锁的学习

    锁 锁的定义 锁是用来协调多个线程并发访问同一共享资源时带来的安全问题 频繁用锁必然会带来性能问题 但不用锁又会造成安全问题 1 从性能上分 乐观锁和悲观锁 乐观锁 CAS自旋锁 是非常经典的乐观锁 并发性能比较好 但是自旋会造成很大的开销
  • Python经典练习题——求水仙花数

    严格来说 我并不知道何谓 水仙花数 因为以前读书时根本没听过这种数 也不知道这种数有什么特征 后来从事编程之后反而听说了所谓的 水仙花数 如果通过网络查询 则发现水仙花数的定义也不统一 比如通过baidu百科查到如下定义 水仙花数 Narc
  • 元数据管理工具atlas初探

    元数据管理工具atlas初探 安装 Ambari添加服务 略 Hive配置 将atlas主节点 usr hdp 2 6 3 0 235 atlas hook拷贝到其他节点 自定义hive env HIVE AUX JARS PATH usr
  • 携手区块链技术,踏上可信“双碳”之路

    自中央明确提出碳达峰碳中和的 双碳 目标以来 区块链技术凭借能为碳排放 碳足迹打上可信标签的天赋异禀 引起了政策部门 学术界及产业实践代表们的高度重视 7月11日 在第33个全国节能宣传周之际 全国低碳日前夕 微众区块链联合金链盟 FISC
  • gcc生成静态库与动态库(附带使用方法)

    目录 前言 1 gcc生成静态库 从使用者的角度出发 如何使用别人的静态库 方法1 方法2 直接使用静态库 2 gcc生成动态库 动态库的使用 第二种方法 与使用静态库的方法一样 解决方案 方法3 ldconfig 配置 etc ld so
  • json解析豆瓣数据

    继续上次的文章 我们找到了json的数据包 那么证明我们可以获取到他们的数据 点击Headers Request URL对应的就是json数据的url 找到url之后我们就可以开始爬虫了 import requests import jso
  • Windows和Linux混合系统通过AD域实现用户集中认证

    一 Windows AD域 1 统一认证简介 管理的Linux服务器和Windows服务器如果很多 如果都用本地用户名管理 要管理和记住几十台甚至上百台服务器的不同账号不同密码 这是很难的 但是如果所有服务器账号密码都设置一样 那又完全没有
  • Unity的C#编程教程_59_字典 Dictionary 详解及应用练习

    文章目录 C Dictionary Introduction C Dictionary Looping through Dictionary C Dictionary When to Use C Dictionary Using Dicti