首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >C#中字典Dictionary的用法详解

C#中字典Dictionary的用法详解

作者头像
心疼你的一切
发布2026-01-20 13:33:57
发布2026-01-20 13:33:57
1220
举报
文章被收录于专栏:人工智能人工智能

👉前言

有时候会用到Dictionary字典,所以记录一下字典的使用方法,方便以后使用,简单记录一下,不喜勿喷哦, 大家好,我是心疼你的一切,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 有问题 欢迎点赞评论哦. 下面就让我们进入正文吧 !

哈希函数介绍

哈希函数 字典的Key——Value映射是利用哈希函数来建立的。 什么是哈希函数呢? 把一个对象转换成唯一且确定值的函数就叫做哈希函数,也叫做散列函数。 这个值就叫做哈希码(hashCode),在C#里一般是一个32位正整数。 就好比每一个人都对应一个身份证号码。不能存在相同的键,否则就会报错

哈希桶

字典源码

代码语言:javascript
复制
private struct Entry {
 	public int hashCode;    // Lower 31 bits of hash code, -1 if unused
	public int next;        // Index of next entry, -1 if last
	public TKey key;        // Key of entry
	public TValue value;    // Value of entry
}

private int[] buckets;		// 哈希桶数组
private Entry[] entries;	// 数据实体数组
...

从源码中可以看到,字典内部使用数组存储数据。 由于key的哈希值范围很大,我们不可能声明一个这么大的数组,让每个hashCode都对应唯一的索引。于是就有了哈希桶。 把hashCode进行分类装到一个个“桶(bucket)”里面,这样就减少了索引的范围。 每次拿到一个 hashCode 就去对应的哈希桶里面去找数据。就可以快速找到了

举个简单的例子,如果知道一个人的身份证号码,想要查找他的住址。 拿身份证号去全国的数据库里查找肯定会很慢,但我们知道,从身份证号可以看出这个人是属于哪个 省份或者地区的。去所在地区的数据库查找,那肯定就比较快了。

👉一、声明一个字典的类型

1.里面保存的是一个分数,一个时间

代码语言:javascript
复制
public class userscore
{
    public List<string> fen; //分数
    public List<string> time; //时间
}
  public Dictionary<string, userscore> DicScore = new Dictionary<string, userscore>(); //账户 分数

👉二、根据字典的值取字典的键

代码语言:javascript
复制
/// <summary>
    /// 根据字典的值取字典的键
    /// </summary>
    /// <param name="str">字典的键</param>
    /// <returns>字典键的值</returns>
    public string Dictionary_Key(string str)
    {
        string strr = "";
        //BaoCunScoreTime.instance.DicScore 是字典
        foreach (var item in BaoCunScoreTime.instance.DicScore)
        {
            foreach (var itrr in item.Value.fen)
            {
                //判断字典里有没有这个分数(字典的值),有了返回出来
                if (itrr.Equals (str))
                {
                    strr= item.Key;                   
                }
            }
        }
        return strr;
    }

👉三、根据字典的键取字典的值

代码语言:javascript
复制
//返回账户分数的最大值
    /// <summary>
    /// 根据字典的键取字典的值
    /// </summary>
    /// <param name="str">字典的键</param>
    /// <returns>字典里最大分值</returns>
    public string  FanhuiZuiDaZhi(string str)
    {
        List<int> liststr = new List<int>();
        //因为分数有很多,需要找到最大的一个
        foreach (var item in BaoCunScoreTime.instance.DicScore[str].fen)
        {          
            liststr.Add(int.Parse(item));
        }
        int sun=0;
        foreach (var item in liststr)
        {
            if (item >sun)
            {
                sun = item;
            }
        }       
        return sun.ToString ();
    }

👉四、 根据字典键确定 值中最高分的时间

代码语言:javascript
复制
//根据字典键确定 值中最高分的时间
    public string ScoreZuiDaZhiTime(string str)
    {
        List<int> liststr = new List<int>();
        List<string> liststring = new List<string>();
        foreach (var item in BaoCunScoreTime.instance.DicScore[str].fen)
        {
            liststr.Add(int.Parse(item));
        }
        foreach (var item in BaoCunScoreTime.instance.DicScore[str].time)
        {
            liststring.Add(item);
        }
        int sun = 0;
        foreach (var item in liststr)
        {
            if (item > sun)
            {
                sun = item;
            }
        }
        string suning="";
        for (int i = 0; i < liststr.Count; i++)
        {
            if (liststr [i]==sun)
            {
                suning = liststring[i];
            }
        }
        return suning;
    }
代码语言:javascript
复制
 /// <summary>
    /// 根据键返回字典的值
    /// </summary>
    /// <param name="dicdata">字典</param>
    /// <param name="Key_">键</param>
    /// <returns></returns>
    public GameObject GetDicValue(Dictionary<Transform, GameObject> dicdata, Transform Key_)
    {
        GameObject trans = null;
        if (dicdata.ContainsKey(Key_))
        {
            trans = dicdata[Key_];
        }
        return trans;
    }
    /// <summary>
    /// 根据值返回字典的键
    /// </summary>
    /// <param name="dicdata">字典</param>
    /// <param name="value_">值</param>
    /// <returns></returns>
    public Transform GetDicKey(Dictionary<Transform, GameObject> dicdata,GameObject value_)
    {
        Transform trans = null;
        if (dicdata.ContainsValue(value_))
        {
            foreach (var item in dicdata)
            {
                if (item.Value.Equals(value_))
                {
                    trans = item.Key;
                }
            }
        }
        return trans;

    }

简单记录一下,如果喜欢关注一下吧,谢谢

请添加图片描述
请添加图片描述

补充:

👉底层原理

  1. 哈希表实现: 使用哈希函数将键(TKey)映射到内部数组(桶数组)的索引 每个桶存储一个链表或类似结构处理哈希冲突(链地址法) 理想情况下查找时间复杂度为O(1),最坏情况O(n)(所有键哈希冲突时)
  2. 动态扩容机制: 默认初始容量为3(.NET Core后优化为0) 当元素数量超过 容量 * 负载因子(默认0.72)时自动扩容(容量翻倍) 扩容时会重新计算所有元素的哈希位置(Rehash),影响性能

👉最佳实践

  1. 键选择原则:

优先使用不可变类型(如string, int)

避免使用会改变哈希值的可变对象作为键

  1. 值类型存储优化:

当值为结构体时,优先使用TryGetValue避免装箱

  1. 空值处理:

允许TValue为null(需用Nullable)

TKey不能为null(默认情况下)

  1. 自定义比较器:
代码语言:javascript
复制
var caseInsensitiveDict = new Dictionary<string, int>(
    StringComparer.OrdinalIgnoreCase
);

👉典型使用场景

  1. 高频查找的键值存储
  2. 数据缓存实现
  3. 替代复杂switch-case结构
  4. 分组统计操作(如LINQ的ToDictionary)

👉总结

本次总结的就是字典的使用方法,既有取字典的键,也有取字典的值,有需要会继续添加新的 如能帮助到你,就帮忙点个关注吧,三连更好哦,谢谢 你的点赞就是对博主的支持,有问题记得留言评论哦! 不定时更新Unity开发技巧,觉得有用记得一键三连哦。么么哒

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-04-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 👉前言
  • 哈希函数介绍
  • 哈希桶
    • 👉一、声明一个字典的类型
    • 👉二、根据字典的值取字典的键
    • 👉三、根据字典的键取字典的值
    • 👉四、 根据字典键确定 值中最高分的时间
  • 👉底层原理
  • 👉最佳实践
  • 👉典型使用场景
  • 👉总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档