【问题标题】:C#: Create a generic method that can return an enum as List<string>C#:创建一个可以将枚举作为 List<string> 返回的泛型方法
【发布时间】:2013-05-19 21:59:32
【问题描述】:

如何创建一个接收枚举类型并将其值和名称作为字符串列表返回的 generic 方法,这样我就可以循环这个列表,并且对于每次迭代,我都能够打印每个枚举值。例如,考虑下一个伪:

enum MyEnum { A=5, B=6, C=8 }

List<string> createEnumStrings(AnyEnum(??))
{
  List<string> listResult;
  
  // ??
  // a code that will generate:
  // listResult[0] = "Value 5 Name A"
  // listResult[1] = "Value 6 Name B"
  // lsitResult[2] = "Value 8 Name C"

  return listResult;
}

再次注意,此方法可以获取任何类型的枚举

【问题讨论】:

标签: c# string list enums


【解决方案1】:
public List<string> GetValues(Type enumType)
{
    if(!typeof(Enum).IsAssignableFrom(enumType))
        throw new ArgumentException("enumType should describe enum");

    var names = Enum.GetNames(enumType).Cast<object>();
    var values = Enum.GetValues(enumType).Cast<int>();

    return names.Zip(values, (name, value) => string.Format("Value {0} Name {1}", value, name))
                .ToList();     
}

现在如果你去

GetValues(typeof(MyEnum)).ForEach(Console.WriteLine);

将打印:

Value 5 Name A
Value 6 Name B
Value 8 Name C

非 LINQ 版本:

public List<string> GetValues(Type enumType)
{   
    if(!typeof(Enum).IsAssignableFrom(enumType))
        throw new ArgumentException("enumType should describe enum");

    Array names = Enum.GetNames(enumType);
    Array values = Enum.GetValues(enumType);

    List<string> result = new List<string>(capacity:names.Length);

    for (int i = 0; i < names.Length; i++)
    {
        result.Add(string.Format("Value {0} Name {1}", 
                                (int)values.GetValue(i), names.GetValue(i)));
    }

    return result;
}

【讨论】:

  • hmm.. 我可以不使用 Linq 语法吗?
  • @Popokoko 请问您对 LINQ 的厌恶是什么?
  • 非常感谢 Ilya,您的两个解决方案都使用 var 变量和 @ 表示法,这让我有点困扰,我想知道这是否是必须的?因为这可能是我自己无法实现的原因;(
  • 枚举值可以有重复的名称。 Enum.GetNames 将返回所有名称,即它将返回 enum MyEnum { Red = 0, Stop = 0, Yellow = 1, Green = 2, Go = 2 } 的所有选项。
  • 好的,Ilya,我明白了,对小事感到抱歉,但这显然是我正在寻找的解决方案(以及您的更多解决方案:),谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多