记一次SortedDictionary的不当使用
起初想用SortedDictionary做游戏中的排行榜,代码如下:
using UnityEngine; using System; using System.Collections; using System.Collections.Generic; public class CustomComparer<T> : IComparer<T> { Func<T, T, int> mComparerFunc; public CustomComparer(Func<T, T, int> comparer) { this.mComparerFunc = comparer; } public int Compare(T x, T y) { return mComparerFunc(x, y); } } public class SortedDictTest : MonoBehaviour { SortedDictionary<string, int> mLeaderboard; void Start() { mLeaderboard = new SortedDictionary<string, int>(new CustomComparer<string>((x, y) => mLeaderboard[x].CompareTo(mLeaderboard[y]))); mLeaderboard.Add("Jhon", 10); mLeaderboard.Add("Dark", 40); mLeaderboard.Add("Ellie", 20); foreach (var item in mLeaderboard) { Debug.Log("Name: " + item.Key + " Score: " + item.Value); } } }
结果就是unity死循环
当你get字典中的数值时,它会调用比较器。比较器里又调用了字典,造成死循环
而且这种用法还有一个问题,可排序字典是对key进行排序,操作时内部有类似二分查找的机制。
在做排行榜时又要按名称匹配,又要自动按分数排序,此时是两套排序机制,字典内部顺序混乱,查找速度反而更慢。
解决方法也是有的,使用双字典可以解决:
public class SortedDictTest : MonoBehaviour { Dictionary<string, int> mScoreDict; SortedDictionary<string, int> mLeaderboard; void Start() { mScoreDict = new Dictionary<string, int>(); mLeaderboard = new SortedDictionary<string, int>(new CustomComparer<string>((x, y) => mScoreDict[x].CompareTo(mScoreDict[y]))); mScoreDict.Add("Jhon", 10); mScoreDict.Add("Dark", 40); mScoreDict.Add("Ellie", 20); mLeaderboard.Add("Jhon", 10); mLeaderboard.Add("Dark", 40); mLeaderboard.Add("Ellie", 20); foreach (var item in mLeaderboard) { Debug.Log("Name: " + item.Key + " Score: " + item.Value); } } }
具体看数据量多少来权衡,直接使用List排序也未尝不可
标签:
SortedDictionary
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理