循环遍历C#enum的键和值

yes*_*man 15 c#

鉴于C#enum:

public enum stuffEnum: int
{
    New = 0,
    Old = 1,
    Fresh = 2
}
Run Code Online (Sandbox Code Playgroud)

如何以一种我可以在一个循环中复制键及其值的方式循环它?就像是:

foreach(var item in stuffEnum)
{
    NewObject thing = new NewObject{
       Name = item.Key,
       Number = item.Value
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,最终会得到3个对象,其Name属性设置为"New","Old"和"Fresh",Number属性设置为0,1和2.

我该怎么做呢?

小智 16

Enum类具有您正在寻找的方法.

foreach(int i in Enum.GetValues(typeof(stuff)))
{
    String name = Enum.GetName(typeof(stuff), i);
    NewObject thing = new NewObject
    {
        Name = name,
        Number = i
    };
}
Run Code Online (Sandbox Code Playgroud)


Tim*_*ter 8

您可以使用LINQ(几乎总是如此):

List<NewObject> stuff = Enum.GetValues(typeof(stuffEnum)).Cast<stuffEnum>()
    .Select(s => new NewObject { Name = s.ToString(), Number = (int) s })
    .ToList();
Run Code Online (Sandbox Code Playgroud)

  • 与其他答案相比,您的答案应该是(a)第一个,(b)易于阅读,(c)执行速度快,(d)练习使用必须学习的最大数量的不同关键字?我目前的赌注是(d),但也许我错了,有一个不言而喻的(e)我没有得到? (2认同)
  • @xmojmr:我将猜测 (b) 易于阅读和 (e) 使用 LINQ 的某种组合。很多人发现 LINQ 易于阅读。此外,它确实具有简洁的优势。任何熟悉 LINQ 的人都应该熟悉 Tim 使用的所有扩展方法,这就是他真正使用的其他答案没有使用的所有方法(好吧,那个和 lambdas)。 (2认同)
  • 就个人而言,我可能会将`.Cast`放在自己的行上,如果`.Select`有更多参数,则将每个参数放在自己的行上.精神上将LINQ建模为转换管道,我发现扫描以这种方式编写的LINQ代码比读取等效的非LINQ代码更快,特别是在更长的转换序列的情况下.我通常会完全忽略任何基于间接的性能惩罚,除非它是一个合法的瓶颈.我从来没有在生产代码中发生这种情况,但在编写递归拼图求解器时经历过这种情况. (2认同)

Bru*_*uno 5

foreach (var enumValue in Enum.GetValues(typeof(StuffEnum)))
{
    Console.WriteLine("Name: {0}, Value: {1}", enumValue, (int)enumValue);
}
Run Code Online (Sandbox Code Playgroud)

结果是

Name: New, Value: 0
Name: Old, Value: 1
Name: Fresh, Value: 2
Run Code Online (Sandbox Code Playgroud)