2010-10-26 11 views

Répondre

16

Non, vous ne pouvez pas initialiser une file d'attente de cette manière.

Quoi qu'il en soit, vous pouvez faire quelque chose comme ceci:

var q = new Queue<string>(new[]{ "A", "B", "C" }); 

et cela, évidemment, les moyens de passer à travers un tableau.

+0

+1 Oui, vous créez un tableau en premier, mais il semble joli :) – Onkelborg

+0

Ok ... aurait été trop pratique pour être vrai;) Merci! – xeophin

+0

Cette méthode ne nécessite-t-elle pas le déballage des chaînes? La nouvelle liste {"A", "B", "C"} serait-elle meilleure? –

3

Comme Queue<T> ne met pas en œuvre une méthode « Ajouter », vous aurez besoin d'instancier un IEnumerable<string> dont il peut être initialisé:

Queue<string> helperStrings 
    = new Queue<string>(new List<string>() { "right", "left", "up", "down" }); 
12

Est-il possible de le faire en C#?

Malheureusement non. La règle pour les initialiseurs de collection en C# est que l'objet doit (1) implémenter IEnumerable, et (2) avoir une méthode Add. La collection initialiseur

new C(q) { r, s, t } 

est réécrite comme

temp = new C(q); 
temp.Add(r); 
temp.Add(s); 
temp.Add(t); 

et entraîne alors tout ce qui est en température.

Queue<T> implémente IEnumerable mais n'a pas de méthode Add; il a une méthode Enqueue.

+0

Merci pour cette explication, qui aide beaucoup à comprendre la mécanique sous-jacente. – xeophin

+0

Donc, les ingalisateurs de collecte sont essentiellement des sucres syntaxiques, n'est-ce pas? – digEmAll

+2

@digEmAll: c'est correct. La douceur du sucre ici est double. D'abord, qu'ils sont très compacts. Deuxièmement, qu'ils transforment ce qui aurait été auparavant un tas de déclarations en une expression; Cela signifie que vous pouvez les utiliser dans des contextes où seule une expression est valide, comme un initialiseur de champ ou une requête LINQ. –