具有相同整数值的C#枚举中元素的排序

具有相同整数值的C#枚举中元素的排序,c#,.net,C#,.net,我有一个简单的枚举: enum E { FullNameForA = 1, A = 1, FullNameForB = 2, B = 2 } 目标是能够对相同的整数值使用不同的字符串值,并使用twist-FullNameFor*作为默认值。换句话说,用户可以提供E.a作为输入,但代码应该使用E.FullNameForA作为输出 似乎默认情况下,C#将使用具有相同整数值的元素的字母顺序,这使我的目标更加困难。是这样吗?有没有办法克服这个问题 似乎默认情况下,C#将

我有一个简单的枚举:

enum E
{
    FullNameForA = 1,
    A = 1,
    FullNameForB = 2,
    B = 2
}
目标是能够对相同的整数值使用不同的字符串值,并使用twist-FullNameFor*作为默认值。换句话说,用户可以提供E.a作为输入,但代码应该使用E.FullNameForA作为输出

似乎默认情况下,C#将使用具有相同整数值的元素的字母顺序,这使我的目标更加困难。是这样吗?有没有办法克服这个问题

似乎默认情况下,C#将使用具有相同整数值的元素的字母顺序

在什么情况下?当您将值转换回字符串时?从以下文件:

如果多个枚举成员具有相同的基础值,并且您尝试根据其基础值检索枚举成员名称的字符串表示形式,则代码不应对方法将返回的名称进行任何假设

(请注意,决策在BCL中-它不是语言决策。)


我建议,如果您希望每个值都有一个规范的字符串表示,您可以创建一个
字典
,并参考该字典,而不是调用
ToString()

考虑这个替代解决方案。您可以使用DescriptionAttribute修饰枚举值,并使用更人性化的名称:

enum E
{
    [System.ComponentModel.Description("FullNameForA")]
    A = 1
}
然后可以提取该属性的值,如下所示:

public static string AsString(this Enum value)
{
    var type = value.GetType();

    if (!type.IsEnum)
        throw new ArgumentException();

    var fieldInfo = type.GetField(value.ToString());
    if (fieldInfo == null) 
        return value.ToString();

    var attribs = fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), false) as DescriptionAttribute[];

    return attribs.Length > 0 ? attribs[0].Description : value.ToString();
}

这当然不是性能最好的解决方案,因为它依赖于反射。

您的用户是谁?他们是开发人员吗?是的,ToString使用第一个元素。字典可能是这里最简单的。我考虑使用最长的一个,因为同一个int的所有值中只有一个是真正完整和冗长的。但这需要对enum成员进行多次迭代,我并不特别喜欢。使用静态字典可以消除这种开销。这是一个有趣的想法。Jon Skeet建议的基本集成词典。