欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C#字典Dictionary的用法(注重性能版)

程序员文章站 2024-03-23 13:28:58
...

内容会持续更新,有错误的地方欢迎指正,谢谢!

前言

以键值对Dictionary<[key], [value]>形式存值,和哈希表很像也是一种无序的结构。

要使用Dictionary,需要先导入C#泛型命名空间System.Collections.Generic

Dictionary需要注意的特性

1.任何键都必须是唯一的 ——> 不能添加相同key的键值对,不然就报错:
C#字典Dictionary的用法(注重性能版)
如果要修改已有key对应的value,可以这样做:
C#字典Dictionary的用法(注重性能版)

2.Unity5.4以下的版本,最好不要用foreach来遍历字典:
法一:foreach遍历字典,会生成GC:
C#字典Dictionary的用法(注重性能版)
C#字典Dictionary的用法(注重性能版)

法二:对于我这种需求,使用for循环,会生成更多的GC,因为存在mActMergeRedPointKey这个局部List变量
C#字典Dictionary的用法(注重性能版)
C#字典Dictionary的用法(注重性能版)

法三:使用迭代器,不会生成GC:
C#字典Dictionary的用法(注重性能版)
C#字典Dictionary的用法(注重性能版)

3.根据key取value,最好使用 TryGetValue 而不是 ContainsKey+根据key索引value:
法一:ContainsKey+根据key索引value,不好,用了两次查找,第一次:ContainsKey,第二次:myDictionary[key]

if(myDictionary.ContainsKey(key))
{
    // 通过key索引value
    int resValue = myDictionary[key];
}

法二:TryGetValue的方法:

int resValue ;
myDictionary.TryGetValue(key, out resValue);

使用TryGetValue更快,性能更好,因为只用了一次查找,TryGetValue 比 ContainsKey后使用[key]取value,速度快一倍;
TryGetValue更安全,找不到value时返回false;而使用ContainsKey后使用[key]取value取不到时,会抛出异常导致真机卡死。

用法

一般用法:key和value都为基本类型,举例:key为int类型,value为string类型

// 声明和初始化
Dictionary<int,string> myDictionary = new Dictionary<int,string>();
// 添加元素
myDictionary.Add(key,value);
// 判断是否包含键
if(myDictionary.ContainsKey(key))
// 总个数
myDictionary.Count

// 遍历
foreach(string key in myDictionary.Keys) // myDictionary.Keys:所有键的集合
{
    int resValue = myDictionary[key];
}
//调用成员Keys,会产生额外GC:Dictionary本身储存数据是成对储存的,也就是KeyValuePair,所以
//要单独拿出Keys时会新建一个数组,这也使得GC增加,推荐大家如果不需要单独存储Keys,尽量避免调用。

// 移除指定键和值
myDictionary.Remove(key);

实例应用

    private Dictionary<uint, MyPet> myPets;
    public List<MyPet> GetShowPets()
    {
        List<MyPet> pets = new List<MyPet>();
        if (null != myPets)
        {
            var e = myPets.GetEnumerator();
            while (e.MoveNext())
            {
                if (CheckPetShow(e.Current.Key))
                {
                    pets.Add(e.Current.Value);
                }
            }
        }

        //根据配置表权重进行升序排序
        pets.Sort(
            delegate (MyPet pet1, MyPet pet2) 
            {
                return pet1.PetRankWeight.CompareTo(pet2.PetRankWeight);
            });

        return pets;
    }