【问题标题】:C# Treat an enum as an arrayC# 将枚举视为数组
【发布时间】:2013-08-09 23:25:13
【问题描述】:

在我的项目中,我有一个 enum,其中存储了如下所示的音乐流派值:

enum Genres { Rock,Pop,Disco,Sport,Talk,Metal,Hard_Rock,Electro,Classic_Rock}

现在在我的代码中,我想要一个 foreach 循环,它将根据音乐流派做一些工作。像这样:

foreach(Genres genre in Enum.GetValues(typeof(Genres)))
{
     switch(genre)
     {
         case Genres.Disco:
                 //Do Something
              break;
             case Genres.Rock:
                 //Do Something
              break;
         .....
         .......
     }
}

我想在switch 的情况下将我的enum 视为一个数组。像这样的东西:

foreach(Genres genre in Enum.GetValues(typeof(Genres)))
{
     switch(genre)
     {
         case Genres[0]:
                 //Do Something
              break;
             case Genres[1]:
                 //Do Something
              break;
         .....
         .......
     }
}

这可能吗?提前致谢。

EDIT

我有一个 ListBox,我想在其中填充 GenreItems。但是对于每个 ListBoxItem,我都希望有一个不同的名称,我将它们传递进去。所以我进行此切换以检查流派和大小写是否为 Rock,例如,我将 ListBoxItem 设置为 ROCK 并将其添加到 ListBox 中。

【问题讨论】:

  • 为什么是foreach?(你可以通过枚举切换)
  • 你能告诉我们你到底想做什么吗,可能有比使用数组更好的解决方案
  • 我想他想要这样的东西stackoverflow.com/questions/482729/…?可能重复或至少相似?

标签: c# arrays enums


【解决方案1】:

除非您进行一些调整,否则我认为这不太可能……例如,使用静态数组来存储所有值:

public static readonly Genres[] AllGenres = Enum.GetValues(typeof(Genres)).Cast<Genres>().ToArray();

// sample:
public void test()
{
   var first = AllGenres [0];
}

编辑

现在我明白你需要什么了。您实际上希望将列表绑定到控件。如果您认为只需要描述,我认为您可能想尝试对枚举使用属性,然后编写一个通用方法来检索枚举项并将其包装为一个对象,例如:

public enum Genres
{
    [Description("Rock!!!")]
    Rock, 
    Pop, 
    Disco, 
    Sport, 
    Talk, 
    Metal, 
    Hard_Rock, 
    Electro, 
    [Description("Classic Rock")]
    Classic_Rock
}

public class EnumItem
{
    string Name { get; set; }
    string Description { get; set; }
    Enum EnumValue {get;set;}

    public static IEnumerable<EnumItem> GetValue(Type t)
    {
        // implementation using reflection/expression            
    }
}

// then you can use the retrieved list/whatever to do binding or so...

您可以进一步调整它以满足您的需求(例如,使用类型约束使其更好) - 更重要的是,这将成为服务所有枚举类型的通用类...

【讨论】:

  • 我也不明白这个问题,直到你解释了 oimitro 提出的问题^upvoted。
  • 啊描述标签是我一直试图找到的.. +1
【解决方案2】:

根据您的编辑,它看​​起来像您想要的

foreach(var genre in Enum.GetNames(typeof(Genres)))
{
     listBox.Items.Add(genre.ToUpperInvariant());
}

【讨论】:

    【解决方案3】:

    你想这样做吗?

                    foreach(Genres genre in Enum.GetValues(typeof(Genres)))
                    {
                        switch (genre)
                        {
                            case Genres.Classic_Rock:
                                //your code
                                break;
                            case Genres.Disco:
                                //your code
                                break;
                            default:
                                //your code
                                break;
                        }
                    }
    

    【讨论】:

      猜你喜欢
      • 2013-01-17
      • 2020-08-21
      • 1970-01-01
      • 2019-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-25
      相关资源
      最近更新 更多