【问题标题】:How to Declare a List<> of Enums in C#如何在 C# 中声明枚举列表<>
【发布时间】:2013-05-28 11:58:45
【问题描述】:

我需要声明一个枚举列表,但我不知道该怎么做。

这是我目前的代码:

public enum Languages
{
    Ger,Eng,Fra,Ita,Rus
}

public class Player
{
    public string ID { get; private set; }
    private List<Languages> Languages;

    public Player(string ID, List<Languages> LangList)
    {
        this.ID = ID;
        this.Languages = LangList;
    }
}

class Program
{
    static void Main(string[] args)
    {
        Player PlayerA = new Player("Player A", **[Problem is here]**);
    }
}

正如您所见,Player 的构造函数需要播放器支持的语言列表。我想将可能的语言定义为枚举。现在我不知道如何在构造调用中声明这样的列表。

我知道我可以这样做:

        List<FoolMeLib.Languages> pLang = new List<FoolMeLib.Languages>;
        pLang.Add(FoolMeLib.Languages.Ger);
        pLang.Add(FoolMeLib.Languages.Eng);
        NewGame.AddPlayer(new FoolMeLib.Player("Player A", pLang));

但我想将代码编写得尽可能简洁...顺便说一句:如果您发现任何其他不良做法:请告诉我。我正在努力改进。

【问题讨论】:

标签: c# c#-4.0 enums


【解决方案1】:

无需更改Player 的代码,您可以这样做:

NewGame.AddPlayer(new FoolMeLib.Player("Player A",
    new List<FoolMeLib.Language> {
        FoolMeLib.Languages.Ger, FoolMeLib.Languages.Eng
}));

如果您愿意接受更改,params FoolMeLib.Languages[] languages 参数将允许:

NewGame.AddPlayer(new FoolMeLib.Player("Player A",
    FoolMeLib.Languages.Ger, FoolMeLib.Languages.Eng));

或者,如果您允许枚举为 [Flags] - 只需要一个参数:

NewGame.AddPlayer(new FoolMeLib.Player("Player A",
    FoolMeLib.Languages.Ger | FoolMeLib.Languages.Eng));

(但他们需要 2n 范围内的特定数字)

【讨论】:

    【解决方案2】:

    集合初始化器的好选项已发布。

    另一种选择可能是使用标志:

    [Flags]
    public enum Languages { Ger = 1,Eng = 2,Fra = 4,Ita = 8, Rus = 16 }
    
    // ctor
    public Player(string id, Languages languages) {}
    
    // call
    new Player("Player A", Languages.Eng | Languages.Fra);
    

    这取决于你打算用这些语言做什么,这可能是一个好的或坏的设计。

    【讨论】:

      【解决方案3】:

      我认为您的标题和问题具有误导性,您实际上可能正在寻找params

      例如,如果你重新定义你的构造函数:

      public Player(string ID, params Languages[] languages)
      {
         Languages = languages.ToList();
      }
      

      您可以将您支持的语言作为参数列表传递

      new Player("Player A", Languages.Ger, Languages.Eng)
      

      【讨论】:

        【解决方案4】:
        Enum.GetValues(typeof(Languages)).Cast<Languages>();
        

        【讨论】:

        • 他不想要所有语言。
        【解决方案5】:

        您的问题:

        如何用语言列表调用构造函数?

        最时尚的方式:

        例如你有一个会说英语和德语的玩家:

        Player PlayerA = new Player("Player A", new List<Languages> 
        { Languages.Eng, Languages.Ger });
        

        【讨论】:

          【解决方案6】:

          如果您接受修改类 Player,只需像这样调用构造函数:

          new Player("Player A", new List<Languages> { Languages.Ger, Languages.Eng });
          

          如果您确实接受修改类 Player,请使用参数并将 Languages 类型更改为 Languages[]:

          public enum Languages
          {
              Ger, Eng, Fra, Ita, Rus
          }
          
          public class Player
          {
              public string ID { get; private set; }
              private Languages[] Languages;
          
              public Player(string ID, params Languages[] LangList)
              {
                  this.ID = ID;
                  this.Languages = LangList;
              }
          }
          
          class Program
          {
              static void Main(string[] args)
              {
                  Player PlayerA = new Player("Player A", Languages.Ger, Languages.Eng);
              }
          }
          

          【讨论】:

            猜你喜欢
            • 2014-08-22
            • 2023-04-11
            • 2015-04-26
            • 1970-01-01
            • 2010-09-09
            • 2023-02-22
            相关资源
            最近更新 更多