循环通过一个C#enum';s键和值

循环通过一个C#enum';s键和值,c#,C#,考虑到C#enum: 我如何以一种可以在单个循环中复制键及其值的方式循环它?比如: foreach(var item in stuffEnum) { NewObject thing = new NewObject{ Name = item.Key, Number = item.Value } } 因此,您将得到3个对象,它们的名称属性设置为“新”、“旧”和“新”,数字属性设置为0、1和2 如何做到这一点?您可以使用LINQ(几乎总是这样): List

考虑到C#enum:

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

foreach(var item in stuffEnum)
{
    NewObject thing = new NewObject{
       Name = item.Key,
       Number = item.Value
    }
}
因此,您将得到3个对象,它们的名称属性设置为“新”、“旧”和“新”,数字属性设置为0、1和2

如何做到这一点?

您可以使用LINQ(几乎总是这样):

List stuff=Enum.GetValues(typeof(stuffEnum)).Cast()
.Select(s=>NewObject{Name=s.ToString(),Number=(int)s})
.ToList();
导致

Name: New, Value: 0
Name: Old, Value: 1
Name: Fresh, Value: 2

Enum类具有您要查找的方法

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

它们显示一个包含单个元素(或仅包含键)的枚举。我的枚举有键/值对,因此不同。@BasR。不,这没有什么不同,您只需显式定义值。将枚举值强制转换为
int
将得到该值。@BasR。这使得你的目标是让一个具有枚举值且相同值的对象强制转换为int,这是多余的。与其他答案相比,你的答案应该是(a)第一个,(b)易于阅读,(c)执行速度快,(d)练习使用最多的不同关键字?我目前的赌注是(d),但也许我错了,还有一个潜台词(e)我没有得到?@xmojmr:我想猜测一下(b)容易阅读和(e)使用LINQ的组合。很多人觉得LINQ很容易阅读。此外,它确实具有简洁的优势。任何熟悉LINQ的人都应该熟悉Tim使用的所有扩展方法,这是他真正使用的其他答案没有使用的扩展方法(好吧,还有lambdas)。@Brian我错过了每个人都应该崇拜LINQ的地方。此代码缺少
foreach
,因此它是最长的,生成的MSIL指令最多(我已经调试了.NET Framework LINQ几次),既不增加空间效率,也不增加时间效率,而且是最密集的(没有空格),因此会降低读取速度。我想知道使用这种风格是否有一些潜在的好处。但我明白你的意思,这是一个品味问题,我的评论实际上毫无意义,OP的问题得到了个人的回答,我可能会把
.Cast
放在自己的行上,如果
.Select
有更多的参数,把每个参数放在自己的行上。在将LINQ心理建模为转换管道之后,我发现扫描以这种方式编写的LINQ代码比读取等效的非LINQ代码要快,尤其是在转换序列较长的情况下。我通常完全忽略任何基于间接的性能损失,除非这是一个合法的瓶颈。我从未在生产代码中遇到过这种情况,但在编写递归谜题求解器时也经历过这种情况。
foreach (var enumValue in Enum.GetValues(typeof(StuffEnum)))
{
    Console.WriteLine("Name: {0}, Value: {1}", enumValue, (int)enumValue);
}
Name: New, Value: 0
Name: Old, Value: 1
Name: Fresh, Value: 2
foreach(int i in Enum.GetValues(typeof(stuff)))
{
    String name = Enum.GetName(typeof(stuff), i);
    NewObject thing = new NewObject
    {
        Name = name,
        Number = i
    };
}