有时候会用到Dictionary字典,所以记录一下字典的使用方法,方便以后使用,简单记录一下,不喜勿喷哦, 大家好,我是心疼你的一切,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 有问题 欢迎点赞评论哦. 下面就让我们进入正文吧 !
哈希函数 字典的Key——Value映射是利用哈希函数来建立的。 什么是哈希函数呢? 把一个对象转换成唯一且确定值的函数就叫做哈希函数,也叫做散列函数。 这个值就叫做哈希码(hashCode),在C#里一般是一个32位正整数。 就好比每一个人都对应一个身份证号码。不能存在相同的键,否则就会报错
字典源码
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.里面保存的是一个分数,一个时间
public class userscore
{
public List<string> fen; //分数
public List<string> time; //时间
}
public Dictionary<string, userscore> DicScore = new Dictionary<string, userscore>(); //账户 分数/// <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;
}//返回账户分数的最大值
/// <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 ();
}//根据字典键确定 值中最高分的时间
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;
} /// <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;
}简单记录一下,如果喜欢关注一下吧,谢谢

补充:
优先使用不可变类型(如string, int)
避免使用会改变哈希值的可变对象作为键
当值为结构体时,优先使用TryGetValue避免装箱
允许TValue为null(需用Nullable)
TKey不能为null(默认情况下)
var caseInsensitiveDict = new Dictionary<string, int>(
StringComparer.OrdinalIgnoreCase
);本次总结的就是字典的使用方法,既有取字典的键,也有取字典的值,有需要会继续添加新的 如能帮助到你,就帮忙点个关注吧,三连更好哦,谢谢 你的点赞就是对博主的支持,有问题记得留言评论哦! 不定时更新Unity开发技巧,觉得有用记得一键三连哦。么么哒