如何声明列表<>c#中的枚举

本文关键字:枚举 列表 何声明 声明 | 更新日期: 2023-09-27 18:16:20

我需要声明一个枚举列表,我不知道如何做正确。

这是我到目前为止的代码:

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#中的枚举

如果不更改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范围内的特定数字)

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

另一个选项是使用flags:

[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);

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

我认为你的标题和问题是误导,你可能实际上是在寻找params

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

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

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

new Player("Player A", Languages.Ger, Languages.Eng)
Enum.GetValues(typeof(Languages)).Cast<Languages>();

你的问题:

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

最流畅的方式:

。你有一个会说英语和德语的球员:

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

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

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

如果你接受修改类Player,使用参数并将语言类型更改为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);
    }
}