记一次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排序也未尝不可

时间: 2024-08-29 11:30:00

记一次SortedDictionary的不当使用的相关文章

记一个由于不当使用fgets与strcmp而引起的bug

使用C语言处理行输入的时候,使用fgets(). 现在我要在某行输入“ENDOFINPUT”的时候,终止处理. 所以果断就写了以下: char buf[256]; fgets(buf, 256, stdin); while ( strcmp(buf, "ENDOFINPUT") != 0) { ... } 按理说我在某行读入ENDOFINPUT的时候,while循环的条件应该不满足,然后终止循环.可是strcmp的比较好像没用一样,循环不能终止. 使用printf查看strcmp的值,

记一次系统稳定性问题的分析处理过程(因CallContext使用不当而造成bug)

问题描述: 一个项目现场反馈,“差旅费类型的单据审批,在出现业务规则没满足的情况时(即业务报错,需要人机交互),审批仍然通过了”.从技术的角度上说,就是业务构件中的业务规则报错后,事务没有回滚.但是,维护的同事对事务回滚的代码增加了日志,通过日志发现事务回滚的代码显式的执行了,也没有出现任何异常.并且该问题可以反复重现,与并发也没有关系,单用户执行也会有问题. 分析过程: 接到这个问题时,我感觉很奇怪:从表面上看貌似跟该类单据的数据有关系,但从技术分析上看是与数据库事务控制有关系.按照道理上来讲

记一次Oracle Clusterware成功安装后的故障处理

记一次Oracle Clusterware安装成功后的故障处理 1. 环境 [[email protected] rac1]$ cat /etc/issue Red Hat Enterprise Linux Server release 5.8 (Tikanga) Kernel \r on an \m 2. 问题描述在安装RAC的过程中, 成功安装好grid (clusterware) 后关闭了各节点. 在下次开启各节点后, 检查crs资源状态, 出现如下错误: [[email protecte

记一次获得 3 倍性能的 go 程序优化实践,及 on-cpu / off-cpu 火焰图的使用

转自:https://mp.weixin.qq.com/s/9IKaXeWTiiQTFlvZzxgsEA 记一次获得 3 倍性能的 go 程序优化实践,及 on-cpu / off-cpu 火焰图的使用 原创 2017-07-27 petergz 唯技术 先把结论列在前面: 1.Golang的性能可以做到非常好,但是一些native包的性能很可能会拖后腿,比如regexp和encoding/json.如果在性能要求较高的场合使用,要根据实际情况做相应优化. 2.on-cpu/off-cpu火焰图

2018第一发:记一次【Advanced Installer】打包之旅

一.前言 2017年最后几天,你们都高高兴兴的跨年,博主还在加班制作.net安装包.因为年前要出来第一版的安装包,所以博主是加班加点啊.本来想用VS自带的制作工具,不过用过的人都知道,真是非常好(tong)用(ku),各种包需要单独下载不说,界面也不美观,所以决定弃用之.同事推荐用Advanced Installer,不过同事也是很久不用了,记不起来具体用法.所以博主是边摸索边前进,所以不免跳进坑里,为了避免后来人跳进同样的坑里,作文以记之. 好了,不说废话,正文开始! 二.画流程图 俗话说的好

贝纳利(Benelli )飓风302提车记(我人生中的第一辆摩托车)

贝纳利(Benelli )飓风302提车记(我人生中的第一辆摩托车) 说起这次提车的心情得从一年前的考去驾驶证说起 1.驾驶证增驾 大飞哥的E本增驾考试经历 因为我是异地考取的驾驶证增驾需转入本地 2017.08.31 京顺车管所将驾驶证转入北京(很顺利)2017.09.02 报名(增驾E本)2017.09.10 法训(之前已经学习科目一课程驾校指定一个软件(学车不))2017.09.11 打电话预约科目一考试(摩托车预约网络在线不可以预约)2017.09.18 收到短信说19号上午科目一预约成

微信运动记步原理,及刷步数方法大揭密

随着"微信运动"功能的开启,朋友圈里燃起了每天刷步的热情,每天为了争夺运动封面第一名,不惜下班还在楼下多绕一圈儿再回家.那么你们都知道微信运动是如何记录我们每日行程步数的吗?这个数据到底准不准确呢?今天小编就为大家来一个大揭密. 原理: 手机内置了振动传感器或协助处理器,根据这些设备的震动频率来储存数据.简单地说,就是人在步行时重心都有一点上下移动,传感器和协作器感应到这种重心移动并进行记数. 设备: iPhone 5S/6/6 Plus三款苹果手机因为自带M7/M8协处理器,无需任何

.NET Core爬坑记 1.0 项目文件

前言: 之所以要写这个系列是因为在移植项目到ASP.NET Core平台的过程中,遇到了一些“新变化”,这些变化有编译方面的.有API方面的,今天要讲的是编译方面的一些问题.我把它们整理后分享出来,以便各位博友不要再遇到这些坑. 在Dotnet Core RC2版本中,project.json 管理着整个项目,包括编译文件.依赖包管理.版本信息.平台依赖与发布等功能. 关于项目中引用: 比如我们一般看到Project.json中一般会有如下内容: "dependencies": { &

最美的时光在路上 - 记第一次深马

昨天跑了深圳马拉松的半马,这是我的第二马,家门口跑马还是有些兴奋的,就因为这个兴奋劲儿,凌晨两点才入睡,朦朦胧胧睡了三个小时,5点半就不得不爬起来洗洗涮涮了,吃了准备好的早餐,坐第一班地铁奔赴市民中心,到达市民中心,已经是人山人海了,各方跑友汇聚于此.话说,这两年跑步是越来越火,我是觉得和现在各种跑步APP的兴起有关,有了这些记步APP,跑了步晒下,朋友们点点赞,这些正向反馈让你跑步的心气就有更足了,其他运动可能很难通过什么APP有这样的体验. 时间紧,存了包,就赶紧往起点一点点的挤(人多,真的