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();
}
}
}

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

  1. Dictionary里使用struct,enum做key

    首先看下Dictionary的源码 public void Add (TKey key, TValue value) { if (key == null) throw new ArgumentNull ...

  2. android中正确导入第三方jar包

    android中正确导入第三方jar包 andriod中如果引入jar包的方式不对就会出现一些奇怪的错误. 工作的时候恰好有一个jar包需要调用,结果用了很长时间才解决出现的bug. 刚开始是这样引用 ...

  3. Java中如何使用Redis做缓存

    基本功能测试 1.程序基本结构 2.主要类 1)功能类 package com.redis; import java.util.ArrayList; import java.util.Iterator ...

  4. API接口自动化之3 同一个war包中多个接口做自动化测试

    同一个war包中多个接口做自动化测试 一个接口用一个测试类,每个测试用例如下,比如下面是4个测试用例,每个详细的测试用例中含有请求入参,返回体校验,以此来判断每条测试用例是否通过 一个war包中,若含 ...

  5. 正确使用Enum的FlagsAttribute

    正确使用Enum的FlagsAttribute FlagsAttribute 标志枚举对象的值可以包括多个枚举成员,每个成员代表枚举值中的一个位域 使用步骤 添加标记[Flags] 用 2 的幂(即 ...

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

     做多语言的时候用中文做KEY绝对是有100%的优点,假设用英文表示那么代码里面给文字赋值的地方全都是英文.写的代码多了以后维护起来就没有人能看懂了,或者看起来非常费劲. 对PoolManager ...

  7. Android 中如何使用 enum / 枚举

    如何在Android开发中合理的使用enum 欢迎大家访问我的Github开源库,这里有好玩的App源码,想和大家分享.https://github.com/ChoicesWang 转载请注明:htt ...

  8. 《挑战30天C++入门极限》新手入门:C/C++中枚举类型(enum)

        新手入门:C/C++中枚举类型(enum) 如果一个变量你需要几种可能存在的值,那么就可以被定义成为枚举类型.之所以叫枚举就是说将变量或者叫对象可能存在的情况也可以说是可能的值一一例举出来. ...

  9. Delphi2007中正确调用SetWindowLong隐藏程序任务栏图标

    http://terony.blog.sohu.com/71347192.html‍ Delphi2007中正确调用SetWindowLong隐藏程序任务栏图标 标签: Delphi2007 SetW ...

随机推荐

  1. 自动加载 autoload

    自动加载  是什么时候调用的 是实例化某个对象的时候,在当前脚本中没有找到对应类的时候 ,如果当前找到了就不会调用__autoload方法 例如:例子一,找到类 <?php function _ ...

  2. 关于QStandardItemModel

    类QabstractItemModel,QabstractListModel,QAbstractTableModel不保存数据,用户需要从这些类派生出子类,并在子类中定义某种数据结构来保存数据.与此不 ...

  3. 解读 Q_D, Q_Q 指针

    见 qglog.h文件定义: #define Q_D(Class) Class##Private * const d = d_func()    #define Q_Q(Class) Class * ...

  4. [转载] iframe嵌入网页的用法

    iframe并不是很常用的,在标准的网页中非常少用.但是有朋友经常问到,下面我简单地介绍一下它的用法,你只要熟练掌握这些参数足矣. <iframe>也应该是框架的一种形式,它与<fr ...

  5. noip杂题题解

    这道题没有什么可说的,先统计,然后几次快排,答案就出来了 Code(整齐但不简洁的代码) #include<iostream> #include<cstdio> #includ ...

  6. Metasploit应用举例

    本篇文章包含以下几方面内容: 1.Metasploit端口扫描: 2.用其他模块 3.metasploit smb获取系统信息 4.Metsploit服务识别 5.ftp识别: 6.metasploi ...

  7. POJ 1236 Network of Schools(tarjan)题解

    题意:一个有向图.第一问:最少给几个点信息能让所有点都收到信息.第二问:最少加几个边能实现在任意点放信息就能传遍所有点 思路:把所有强连通分量缩成一点,然后判断各个点的入度和出度 tarjan算法:问 ...

  8. How can I list all foreign keys referencing a given table in SQL Server?

    How can I list all foreign keys referencing a given table in SQL Server?  how to check if columns in ...

  9. Where is HttpContent.ReadAsAsync?

    It looks like it is an extension method (in System.Net.Http.Formatting): HttpContentExtensions Class ...

  10. Planar Shadow

    Unity上平面阴影的计算与实现 //如何求顶点投影到平面上的点(阴影点) //当平面上取不相等的任意两个点组成一个向量,与平面的法线总是垂直的,向量垂直点乘为0,因此可以通过一个点和一个法线来定义, ...