您的位置:首页 > 编程语言 > C#

C#在Dictionary中使用枚举作为键

2016-06-21 21:21 1146 查看
Enum类型没有实现IEquatable接口,Dictionary中使用Enum作为键时,将发生装箱,使效率降低。

此时可用Dictionary中一个接收IEqualityComparer<T>类型的重载版本来避免对枚举的装箱操作。

先定义一个泛型的比较器实现IEqualityComparer<T>。

public class EnumComparer<T> : IEqualityComparer<T> where T : struct
{
#region IEqualityComparer<T> 泛型接口实现

public bool Equals(T first, T second)
{
var firstParam = Expression.Parameter(typeof(T), "first");
var secondParam = Expression.Parameter(typeof(T), "second");
var equalExpression = Expression.Equal(firstParam, secondParam);

return Expression.Lambda<Func<T, T, bool>>
(equalExpression, firstParam, secondParam).
Compile().Invoke(first, second);
}

public int GetHashCode(T instance)
{
var parameter = Expression.Parameter(typeof(T), "instance");
var convertExpression = Expression.Convert(parameter, typeof(int));

return Expression.Lambda<Func<T, int>>
(convertExpression, parameter).
Compile().Invoke(instance);
}

#endregion
}


使用T类型的枚举作为键时,只需在构造函数中传入一个EnumComparer<T>实例即可。

参考资料:http://wayfarer.blog.51cto.com/1300239/280088
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: