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();
}
}
}
C#中正确使用enum做Key的姿势的更多相关文章
- Dictionary里使用struct,enum做key
首先看下Dictionary的源码 public void Add (TKey key, TValue value) { if (key == null) throw new ArgumentNull ...
- android中正确导入第三方jar包
android中正确导入第三方jar包 andriod中如果引入jar包的方式不对就会出现一些奇怪的错误. 工作的时候恰好有一个jar包需要调用,结果用了很长时间才解决出现的bug. 刚开始是这样引用 ...
- Java中如何使用Redis做缓存
基本功能测试 1.程序基本结构 2.主要类 1)功能类 package com.redis; import java.util.ArrayList; import java.util.Iterator ...
- API接口自动化之3 同一个war包中多个接口做自动化测试
同一个war包中多个接口做自动化测试 一个接口用一个测试类,每个测试用例如下,比如下面是4个测试用例,每个详细的测试用例中含有请求入参,返回体校验,以此来判断每条测试用例是否通过 一个war包中,若含 ...
- 正确使用Enum的FlagsAttribute
正确使用Enum的FlagsAttribute FlagsAttribute 标志枚举对象的值可以包括多个枚举成员,每个成员代表枚举值中的一个位域 使用步骤 添加标记[Flags] 用 2 的幂(即 ...
- Unity3D研究之多语言用中文做KEY
做多语言的时候用中文做KEY绝对是有100%的优点,假设用英文表示那么代码里面给文字赋值的地方全都是英文.写的代码多了以后维护起来就没有人能看懂了,或者看起来非常费劲. 对PoolManager ...
- Android 中如何使用 enum / 枚举
如何在Android开发中合理的使用enum 欢迎大家访问我的Github开源库,这里有好玩的App源码,想和大家分享.https://github.com/ChoicesWang 转载请注明:htt ...
- 《挑战30天C++入门极限》新手入门:C/C++中枚举类型(enum)
新手入门:C/C++中枚举类型(enum) 如果一个变量你需要几种可能存在的值,那么就可以被定义成为枚举类型.之所以叫枚举就是说将变量或者叫对象可能存在的情况也可以说是可能的值一一例举出来. ...
- Delphi2007中正确调用SetWindowLong隐藏程序任务栏图标
http://terony.blog.sohu.com/71347192.html Delphi2007中正确调用SetWindowLong隐藏程序任务栏图标 标签: Delphi2007 SetW ...
随机推荐
- animation效果
添加一个颜色灰渐变的动画效果. <!DOCTYPE html><html lang="en"><head> <meta charset=& ...
- Intro to Python for Data Science Learning 8 - NumPy: Basic Statistics
NumPy: Basic Statistics from:https://campus.datacamp.com/courses/intro-to-python-for-data-science/ch ...
- 缓存(图像 IO 14.2)
缓存 如果有很多张图片要显示,最好不要提前把所有都加载进来,而是应该当移出屏幕之后立刻销毁.通过选择性的缓存,你就可以避免来回滚动时图片重复性的加载了. 缓存其实很简单:就是存储昂贵计算后的结果(或者 ...
- python sys.stdin、sys.stdout和sys.stderr
学习并转载自 https://www.cnblogs.com/guyuyuan/p/6885448.html 标准输入:一般是键盘.stdin对象为解释器提供输入字符流,一般使用raw_input( ...
- mysql设置环境变量
临时修改环境变量 我们可以使用set语法在运行时修改环境变量,修改global变量后,对修改之前的session没有影响,对修修改之后的session生效:修改session变量后,修改后,对于该se ...
- python 单例模式,一个类只能生成唯一的一个实例,重写__new__方法详解
单例:一个类只能生成唯一的一个实例 每个类只要被实例化了,他的私有属性 '_instance'就会被赋值,这样理解对吗 对 #方法1,实现__new__方法 #并在将一个类的实例绑定到类变量_inst ...
- 为自己的网站添加Markdown功能 markedjs
Markdown几个简单的标记可以实现轻量级的代替Word方案 不多说,引入开源库js https://github.com/chjj/marked使用方式简单,如下实例代码: <!DOCTYP ...
- Python面试题之装饰器漫谈
讲 Python 装饰器前,我想先举个例子,虽有点污,但跟装饰器这个话题很贴切. 每个人都有的内裤主要功能是用来遮羞,但是到了冬天它没法为我们防风御寒,咋办?我们想到的一个办法就是把内裤改造一下,让它 ...
- P3810 【模板】三维偏序(陌上花开)
P3810 [模板]三维偏序(陌上花开) cdq分治+树状数组 三维偏序模板题 前两维用cdq分治,第三维用树状数组进行维护 就像用树状数组搞逆序对那样做--->存权值的出现次数 attenti ...
- 20144303石宇森《网络对抗》MSF基础应用
20144303石宇森<网络对抗>MSF基础应用 实验后回答问题 一.解释什么是exploit,payload,encode: 我认为exploit就是一个简单的攻击指令,就是对配置所有设 ...