Loop through a C# enum's keys AND values
给定c枚举:
1 2 3 4 5 6
| public enum stuffEnum : int
{
New = 0,
Old = 1,
Fresh = 2
} |
如何循环使用它,以便在一个循环中复制键及其值?类似:
1 2 3 4 5 6 7
| foreach(var item in stuffEnum )
{
NewObject thing = new NewObject {
Name = item .Key,
Number = item .Value
}
} |
因此,您将得到3个对象,它们的名称属性设置为"新建"、"旧"和"新",数字属性设置为0、1和2。
我该怎么做?
- stackoverflow.com/questions/972307/…
- 它们显示具有单个元素(或仅键)的枚举。我的枚举有键/值对,因此是不同的。
- @ BasR。不,它不是不同的,您只需显式定义值。将枚举值强制转换为int将为您提供该值。
- @ BasR。这使得您的目标是将具有枚举值和相同值的对象强制转换为int,这是相当多余的。
- 好吧,谢谢!
枚举类具有您要查找的方法。
1 2 3 4 5 6 7 8 9
| foreach(int i in Enum.GetValues(typeof(stuff )))
{
String name = Enum.GetName(typeof(stuff ), i );
NewObject thing = new NewObject
{
Name = name,
Number = i
};
} |
您可以使用LINQ(几乎总是这样):
1 2 3
| List <NewObject > stuff = Enum.GetValues(typeof(stuffEnum )).Cast<stuffEnum >()
.Select(s => new NewObject { Name = s .ToString(), Number = (int) s })
.ToList(); |
- 与其他答案相比,你的答案应该是:(a)第一个,(b)易读,(c)执行速度快,(d)练习使用最多数量的不同关键词,你必须学习?我目前的赌注是(D),但也许我错了,还有一个潜台词我没有得到?
- @Xmojmr:我猜(b)易于阅读和(e)使用LINQ的组合。很多人觉得Linq很容易阅读。此外,它还有一个简洁的优势。任何熟悉Linq的人都应该熟悉Tim使用的所有扩展方法,这是他真正使用的所有其他答案都不使用的方法(好吧,那和lambdas)。
- @布莱恩,我错过了那个应该崇拜林肯的人。此代码缺少foreach,因此它是最长的,生成的大多数msil指令(我已经调试到.NET Framework Linq所做的几次)既不增加空间效率,也不增加时间效率,而且是最密集的(没有空格),因此会减慢读取速度。我想知道使用这种样式是否有一些隐藏的好处,除了它是可能的。但我明白你的意思,这是一个品味问题,我的评论实际上毫无意义,OP的问题得到了回答。
- 就我个人而言,我可能会把.Cast放在自己的行上,如果.Select有更多的参数,就把每个参数放在自己的行上。在将LINQ从思想上建模为转换管道之后,我发现以这种方式编写的扫描LINQ代码比读取等效的非LINQ代码更快,尤其是在转换序列较长的情况下。我通常会直接忽略任何基于间接的性能惩罚,除非它是合法的瓶颈。我从来没有在生产代码中发生过这种情况,但是在编写递归的解谜器时就经历过这种情况。
1 2 3 4
| foreach (var enumValue in Enum.GetValues(typeof(StuffEnum )))
{
Console .WriteLine("Name: {0}, Value: {1}", enumValue, (int)enumValue );
} |
结果在
1 2 3
| Name : New, Value: 0
Name : Old, Value: 1
Name : Fresh, Value: 2 |