簡體   English   中英

如何在C#中聲明枚舉列表<>

[英]How to Declare a List<> of Enums in C#

我需要聲明一個枚舉列表,我無法弄清楚如何正確地做到這一點。

到目前為止這是我的代碼:

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

但是我想盡可能地編寫代碼......順便說一句:如果你看到其他任何不好的做法:告訴我。 我正在努力改進。

如果沒有對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));

(但他們需要2 n范圍內的特定數字)

收集初始化程序的好選項已發布。

另一種選擇可能是使用標志:

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

如果您接受修改類播放器,使用PARAMS和語言的語言[]的變化類型:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM