2013-06-01 3 views
3

Je dois déclarer une liste d'énumérations et je n'arrive pas à comprendre comment le faire correctement.Comment déclarer une liste <> de Enums en C#

Ceci est mon code à ce jour:

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

Comme vous pouvez le voir le constructeur de joueur attend une liste des langues qui sont prises en charge par le joueur. Je voulais définir les langues possibles comme enums. Maintenant, je ne sais pas comment je déclare une telle liste dans l'appel de construction.

Je sais que je pouvais le faire comme ceci:

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

mais je veux écrire le code aussi élégant que possible ... BTW: si vous voyez une autre mauvaise pratique: me dire. Je vais essayer de m'améliorer.

+0

[http://stackoverflow.com/questions/1167361/how-do-i-convert-an-enum-to-a-list-in-c](http://stackoverflow.com/questions/1167361/how-do-i-convert-an-enum-to-a-list-in-c) –

+0

Essayez 'public Player (ID de chaîne, IEnumerable LangList)' et passez un tableau avec 'new [] {Language.Ger , Language.Fng} '. – ja72

Répondre

12

Sans changements de code à Player, vous pouvez faire:

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

Si vous ware ouvert aux changements, un paramètre params FoolMeLib.Languages[] languages permettrait:

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

Ou si vous permettez l'ENUM être un [Flags] - un seul paramètre est nécessaire:

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

(Mais ils auraient besoin de chiffres précis dans le 2 n gamme)

0
Enum.GetValues(typeof(Languages)).Cast<Languages>(); 
+0

Il ne veut pas toutes les langues. –

1

Je pense que votre question et le titre sont trompeuses, vous pourriez effectivement être à la recherche params.

Par exemple, si vous redéfinissez vous constructeur comme:

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

Vous pouvez transmettre les langues que vous supportiez liste des paramètres

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

Votre question:

Comment appelle le constructeur avec la liste des langues?

La plus élégante façon possible:

Par exvous avez un joueur qui parle anglais et allemand:

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

Si vous ne pas accepter de modifier la classe Player, il suffit d'appeler le constructeur comme ceci:

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

Si vous faites accepter pour modifier la classe Player, utilisez les paramètres et changez le type de langues en langues []:

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

Bonne option s pour l'initialiseur de collection ont été affichés.

Une autre option pourrait être d'utiliser des drapeaux:

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

Selon ce que vous envisagez de faire avec les langues que cela pourrait être une bonne ou une mauvaise conception.

Questions connexes