Як Абвясціць List <> з Пералічэнні ў C #

Мне трэба, каб абвясціць спіс Пералічэнні, і я не магу зразумець, як зрабіць гэта правільна.

Гэта мой код да гэтага часу:

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

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

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

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

Як вы можаце бачыць канструктар Гульца чакае спіс моў, якія падтрымліваюцца прайгравальнікам. Я хацеў, каб вызначыць магчымыя мовы, як пералічэння. Цяпер я не ведаю, як я абвяшчаю такі спіс у будаўнічым выкліку.

Я ведаю, што я мог бы проста зрабіць гэта наступным чынам:

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

але я хачу, каб напісаць код, як гладкі, як можна ... Дарэчы: калі вы бачыце якой-небудзь іншай дрэнная практыка: скажыце мне. Я triing палепшыць.

3
Паспрабуйце Публічны Player (радок ID, IEnumerable <�Мовы> LangList) і перадаць масіў з новы [] {Language.Ger, Language.Eng} .
дададзена аўтар ja72, крыніца

6 адказы

Без змены кода ў Гулец , вы можаце зрабіць:

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

Калі посуд адкрыты для змен, а PARAMS FoolMeLib.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 п дыяпазон)

12
дададзена

Добрыя магчымасці для збору инициализаторе былі размешчаны.

Іншыя варыянты могуць быць выкарыстоўваць сьцягі:

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

У залежнасці ад таго, што вы збіраецеся рабіць з мовамі, гэта можа быць добрым ці дрэнным дызайн.

2
дададзена

Я думаю, што ваш загаловак і пытанне ўводзіць у зман, вы, магчыма, на самай справе шукаць Params .

Напрыклад, калі вы перавызначыць вы канструктар, як:

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

Вы можаце перадаць на гэтых мовах, як спіс параметраў

new Player("Player A", Languages.Ger, Languages.Eng)
1
дададзена
Enum.GetValues(typeof(Languages)).Cast();
0
дададзена
Ён не хоча, каб усе мовы.
дададзена аўтар Tim Schmelter, крыніца

Калі вы <�моцны> не прыняць для змены класа гульца, проста выклічце канструктар, як гэта:

new Player("Player A", new List { 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);
    }
}
0
дададзена

<�Моцны> Ваш пытанне:

Як выклікаць канструктар са спісам моў?

<�Моцны> выкліку магчымы шлях:

напрыклад ў вас ёсць гулец, які можа гаварыць на англійскай і нямецкай:

Player PlayerA = new Player("Player A", new List 
{ Languages.Eng, Languages.Ger });
0
дададзена