C#中正确使用enum累做Key的姿势

C#中自定义enum,然后将其作为Dictionary的Key,通常的做法如下:

using System;
using System.Text;
using System.Collections.Generic;

namespace ConsoleApplication1
{
    enum ClothType
    {
        Hair,
        Coat,
        Shoes,
    }

    class Cloth
    {

    }

    class Program
    {
        static void Main(string[] args)
        {
            Dictionary<ClothType, Cloth> dicCloth = new Dictionary<ClothType, Cloth>();
            dicCloth.Add(ClothType.Coat, new Cloth());
            Console.ReadKey();
        }
    }
}

但是这样在调用Add方法的时候,会间接地造成封箱操作,这样就带来了不必要的性能消耗。当然了,不只是Add方法。

下面的方法可以解决该问题:

using System;
using System.Text;
using System.Collections.Generic;
using System.Collections;

namespace ConsoleApplication1
{
    enum ClothType
    {
        Hair,
        Coat,
        Shoes,
    }

    //新加比较器类
    class ClothTypeEnumComparer : IEqualityComparer<ClothType>
    {
        public bool Equals(ClothType x, ClothType y)
        {
            return x == y;          //x.Equals(y);  注意这里不要使用Equals方法,因为也会造成封箱操作
        }

        public int GetHashCode(ClothType x)
        {
            return (int)x;
        }
    }

    class Cloth
    {

    }

    class Program
    {
        static void Main(string[] args)
        {
            ClothTypeEnumComparer myEnumComparer = new ClothTypeEnumComparer();         //在实际项目中,比较器可以保存一份,方便服用,测试暂且如此
            Dictionary<ClothType, Cloth> dicCloth = new Dictionary<ClothType, Cloth>(myEnumComparer);
            dicCloth.Add(ClothType.Coat, new Cloth());
            Console.ReadKey();
        }
    }
}

原文地址:https://www.cnblogs.com/luguoshuai/p/8962329.html

时间: 2024-11-08 19:41:34

C#中正确使用enum累做Key的姿势的相关文章

Unity3D研究之多语言用中文做KEY

 做多语言的时候用中文做KEY绝对是有100%的优点,假设用英文表示那么代码里面给文字赋值的地方全都是英文.写的代码多了以后维护起来就没有人能看懂了,或者看起来非常费劲. 对PoolManager不了解的能够看下初探PoolManager插件非常适合新手学习. 说说用中文做KEY的原理:Unity中给文字赋值的地方就两处, 一个是提前预制在UI Prefab上的文字.另一个是写在代码里面的文字.那么在开发阶段我们在Prefab和代码里面直接就写中文,等项目后期通过工具把所有中文的地方所有提取

在linux中给你的应用做压力测试

在linux中给你的应用做压力测试 作者: 立地 邮箱: [email protected] QQ: 511363759 一.webbench 1.在Ubuntu中安装webbench —支持get,head等请求,但不支持post请求 wget http://blog.zyan.cc/soft/linux/webbench/webbench-1.5.tar.gz tar zxvf webbench-1.5.tar.gz cd webbench-1.5 make && make insta

NLP中的用N-gram语言模型做英语完型填空的环境搭建

本文是对github上fork的xing_NLP中的用N-gram语言模型做完型填空这样一个NLP项目环境搭建的一个说明,本来写在README.md中.第一次用github中的wiki,想想尝试一下也不错,然而格式非常的混乱,自己都不满意,所以先在博客园记录一下,等github博客搭建成功了再说. 1. 操作系统: 作为programer,linux自然是首先选择,ubuntu,centos等等都可以.我用的是CentOS7.3,之前用Centos6.5各种报错,建议装最新版的linux系统,何

ArcGIS Engine中正确释放打开资源

转自原文 ArcGIS Engine中正确释放打开资源 AE中对MDB,SDE等数据库操作时,打开后却往往不能及时释放资源,导致别人操作提示对象被锁定. 很多帖子说了很多原理,看的也烦且不实用,比如一句话概括的用System.Runtime.InteropServices.Marshal.ReleaseComObject(object o)释放,说的很不清楚,很多人试过觉的释放不掉. 事实上,的确是用该方法,但释放的技巧在于,新建几个AE对象就要逐步释放几个,例如: IWorkspaceFact

zend framework获取数据库中枚举类enum的数据并将其转换成数组

在model中建立这样的模型,在其中写入获取枚举类的方法 class Student extends Zend_Db_Table{ protected $_name ='student'; protected $_primary ='id'; function getPartyEnum($enumname){ //适配器并获取数据 $db = $this->getAdapter(); $db->query("SET NAMES GBK"); $sql = $db->q

【转】Java并发中正确使用volatile

Java并发中正确使用volatile 原文链接 http://ifeve.com/how-to-use-volatile/ 作者:一粟   整理和翻译自Twitter实时搜索的PPT 前几天并发编程群里有同学对volatile的用法提出了疑问,刚好我记得Twitter有关实时搜索的这个PPT对这个问题解释的很清晰并有一个实际的应用场景,于是周末把这个问题摘录了一些和并发相关的内容如下: 并发 – 定义 悲观锁 – Pressimistic locking 一个线性在执行一个操作时持有对一个资源

求救:如何在Eclipse IDE for C/C++ Developers中正确编译GTK程序?

出现错误信息如下,请问大牛该如何解决? 00:52:56 **** Incremental Build of configuration Debug for project Again **** make all  Building file: ../why.c Invoking: GCC C Compiler gcc "../why.c" -I/usr/include/glib-2.0 -I/usr/include/atk-1.0 -I/usr/include/gdk-pixbuf-

传参在mybatis的sql映射文件中正确获取

1.单个参数: 非自定义对象 传参:getStuById(Integer id): 取值:#{id} 单个基本类型参数,随便取值都行:#{ok} 对象: 传参:saveStudent(Student student) 取值:#{属性名} 2.多个参数: 传参:getStudentByLastNameAndAge(String lastName,Integer age) 取值:#{参数名}不好使:报错提示可用的参数是[0,1,param1,param2] 可用的取值方式: 1)#{参数索引} #{

jstack:将Process Explorer中看到的进程ID做16进制转换,到ThreadDump中加上0x 前缀即能找到对应线程(转)

原文链接:http://www.iteye.com/topic/1133941 症状: 使用Eclipse win 64位版本,indigo及kepler都重现了,使用tomcat 6.0.39,jdk1.6.u45及1.7u45均尝试了,也重现. 重现步骤很简单,使用debug模式启动时较容易出来,debug启动tomcat,(我的是webapp)然后在页面上随便点点即发现eclipse僵死,且任何从浏览器发出的请求都卡住不能被接收执行. 1.然后从任务管理器直接杀掉eclipse对应的jav