关于C 4.0:如何在C#中声明枚举列表list<>

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

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

这是迄今为止我的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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的构造函数需要player支持的语言列表。我想把可能的语言定义为枚举。现在我不知道如何在构造调用中声明这样的列表。

我知道我可以这样做:

1
2
3
4
        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进行代码更改,则可以执行以下操作:

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

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

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

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

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

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


已发布集合初始值设定项的好选项。

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

1
2
3
4
5
6
7
8
[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

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

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

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

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

如果不接受修改类播放器,只需这样调用构造函数:

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

如果接受修改类播放器,请使用参数并将语言类型更改为语言[]。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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);
    }
}

你的问题:

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

最圆滑的方式:

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

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

1
Enum.GetValues(typeof(Languages)).Cast<Languages>();