【问题标题】:Loop through a C# enum's keys AND values [duplicate]循环遍历 C# 枚举的键和值 [重复]
【发布时间】:2015-01-09 06:54:05
【问题描述】:

给定 C# 枚举:

public enum stuffEnum: int
{
    New = 0,
    Old = 1,
    Fresh = 2
}

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

foreach(var item in stuffEnum)
{
    NewObject thing = new NewObject{
       Name = item.Key,
       Number = item.Value
    }
}

所以你最终会得到 3 个对象,它们的 Name 属性设置为“New”、“Old”和“Fresh”,而 Number 属性设置为 0、1 和 2。

我该怎么做?

【问题讨论】:

  • 那些显示带有单个元素(或仅键)的枚举。我的枚举有键/值对,因此是不同的。
  • @BasR。不,没有什么不同,您只需明确定义值。将您的枚举值转换为 int 将为您提供值。
  • @BasR。这使您的目标是拥有一个具有枚举值的对象,并且将相同的值转换为 int 相当多余。

标签: c#


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:
    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
    

    【讨论】:

      【解决方案3】:

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

      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),但也许我错了,还有一个未说出口的 (e) 我没有得到?
      • @xmojmr:我猜测 (b) 易于阅读和 (e) 使用 LINQ 的组合。很多人发现 LINQ 易于阅读。此外,它确实具有简洁的优势。任何熟悉 LINQ 的人都应该熟悉 Tim 使用的所有扩展方法,这是他真正使用的所有其他答案不使用的方法(嗯,那个和 lambdas)。
      • @Brian 我错过了(e)每个人都应该崇拜 LINQ。此代码缺少foreach,因此它是最长的并且生成最多的 MSIL 指令(我已经调试了几次 .NET Framework LINQ 所做的事情)不会增加空间效率和时间效率,并且是最密集的(没有空格)所以会减慢阅读速度。我想知道使用这种风格是否有一些隐藏的好处。但我明白你的意思,这是一个品味问题,我的评论几乎毫无意义,OP 的问题得到了回答
      • 就我个人而言,我可能会将.Cast 单独放在一行,如果.Select 有更多参数,则将每个参数单独放在一行。将 LINQ 心理建模为转换管道后,我发现扫描以这种方式编写的 LINQ 代码比读取等效的非 LINQ 代码要快,尤其是在转换序列较长的情况下。我通常完全忽略任何基于间接的性能损失,除非它是一个合法的瓶颈。我从未在生产代码中发生过这种情况,但在编写递归解谜程序时遇到过。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-24
      • 1970-01-01
      • 2011-11-28
      • 1970-01-01
      • 2014-07-26
      • 2013-05-16
      • 2021-08-24
      相关资源
      最近更新 更多