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# 中枚举到字典

如何将 C# 中的 Dictionary <string,List<string>> 转换为带有键作为标题的 csv?

C#字典 Dictionary 的使用

澄清 C# 字典上的读写

在 C# 中是不是有像 Dictionary<> 这样的类,但只有键,没有值?

重温 C# 字典Dictionary类