C#在Dictionary中使用枚举作为键
Posted 太息花色
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#在Dictionary中使用枚举作为键相关的知识,希望对你有一定的参考价值。
Enum类型没有实现IEquatable接口,Dictionary中使用Enum作为键时,将发生装箱,使效率降低。
此时可用Dictionary中一个接收IEqualityComparer<T>类型的重载版本来避免对枚举的装箱操作。
先定义一个泛型的比较器实现IEqualityComparer<T>。
1 public class EnumComparer<T> : IEqualityComparer<T> where T : struct 2 { 3 #region IEqualityComparer<T> 泛型接口实现 4 5 public bool Equals(T first, T second) 6 { 7 var firstParam = Expression.Parameter(typeof(T), "first"); 8 var secondParam = Expression.Parameter(typeof(T), "second"); 9 var equalExpression = Expression.Equal(firstParam, secondParam); 10 11 return Expression.Lambda<Func<T, T, bool>> 12 (equalExpression, firstParam, secondParam). 13 Compile().Invoke(first, second); 14 } 15 16 public int GetHashCode(T instance) 17 { 18 var parameter = Expression.Parameter(typeof(T), "instance"); 19 var convertExpression = Expression.Convert(parameter, typeof(int)); 20 21 return Expression.Lambda<Func<T, int>> 22 (convertExpression, parameter). 23 Compile().Invoke(instance); 24 } 25 26 #endregion 27 }
使用T类型的枚举作为键时,只需在构造函数中传入一个EnumComparer<T>实例即可。
参考资料:http://wayfarer.blog.51cto.com/1300239/280088
以上是关于C#在Dictionary中使用枚举作为键的主要内容,如果未能解决你的问题,请参考以下文章
如何将 C# 中的 Dictionary <string,List<string>> 转换为带有键作为标题的 csv?