3

列挙型のリストを宣言する必要がありますが、それを正しく行う方法がわかりません。

これまでの私のコードは次のとおりです。

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

しかし、私はできるだけ洗練されたコードを書きたいと思っています... ところで:他の悪い習慣があれば教えてください。私は改善しようとしています。

4

6 に答える 6

12

のコードを変更しなくても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]- にすることを許可する場合、必要なパラメーターは 1 つだけです。

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

(ただし、2 n範囲の特定の数値が必要になります)

于 2013-06-01T22:52:34.003 に答える
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);

言語で何をしようと計画しているかによって、これが良い設計か悪い設計かが決まります。

于 2013-06-01T22:59:37.237 に答える
1

あなたのタイトルと質問は誤解を招くと思います。実際に探しているのはparams.

たとえば、次のようにコンストラクターを再定義するとします。

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

サポートする言語をパラメータのリストとして渡すことができます

new Player("Player A", Languages.Ger, Languages.Eng)
于 2013-06-01T22:55:37.340 に答える
0

あなたの質問:

言語のリストでコンストラクターを呼び出す方法は?

最も洗練された方法:

たとえば、英語とドイツ語を話せるプレイヤーがいる場合:

Player PlayerA = new Player("Player A", new List<Languages> 
{ Languages.Eng, Languages.Ger });
于 2013-06-01T22:56:44.327 に答える
0

クラス Player の変更を受け入れない場合は、次のようにコンストラクターを呼び出します。

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

クラス Player の変更を受け入れる場合、params を使用し、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);
    }
}
于 2013-06-01T22:56:47.300 に答える
0
Enum.GetValues(typeof(Languages)).Cast<Languages>();
于 2013-06-01T22:51:22.730 に答える