The enum type does not implement the IEquatable interface, and when an enum is used as a key in dictionary, boxing occurs and the efficiency is reduced.
You can avoid boxing operations on enumerations by using an overloaded version of dictionary that receives the iequalitycomparer<t> type.
A generic comparer implementation iequalitycomparer<t> is defined first.
1 Public classEnumcomparer<t>: iequalitycomparer<t>whereT:struct2 {3 #regioniequalitycomparer<t> generic interface implementation4 5 Public BOOLEquals (t first, T second)6 {7 varFirstparam = Expression.parameter (typeof(T)," First");8 varSecondparam = Expression.parameter (typeof(T),"Second");9 varEqualexpression =expression.equal (Firstparam, secondparam);Ten One returnExpression.lambda<func<t, T,BOOL>> A (Equalexpression, Firstparam, Secondparam). - Compile (). Invoke (first, second); - } the - Public intGetHashCode (T instance) - { - varparameter = Expression.parameter (typeof(T),"instance"); + varConvertexpression = Expression.convert (parameter,typeof(int)); - + returnExpression.lambda<func<t,int>> A (convertexpression, parameter). at Compile (). Invoke (instance); - } - - #endregion -}
When you use an enumeration of type T as a key, you simply pass in a enumcomparer<t> instance in the constructor.
Reference: http://wayfarer.blog.51cto.com/1300239/280088
C # uses enumerations as keys in dictionary