2010-02-04 5 views
3

Si j'ai une fonctiontableaux Passing à l'argument de longueur variable des listes

void Foo(params int[] bar){} 

Ce qui suit fonctionne très bien:

int[] a1 = {1, 2, 3}; 
int[] a2 = {4, 5, 6}; 
Foo(1, 2, 3); 
Foo(a1); 

Mais ceux-ci donnent des erreurs de compilation:

Foo(a1, 1, 2, 3); 
Foo(1, 2, a1); 
Foo(1, a1, 2); 
Foo(a1, a2, 1, 2, 3); 

, car seule la le premier argument est autorisé à être un int [], le reste doit être ints.

Le dernier exemple est ce que je voudrais faire, mais le langage ne me laissera pas sans combiner les tableaux en premier. J'aime beaucoup la simplicité de la syntaxe, et je préfère ne pas ajouter au code plus que je ne le dois. Est-ce que quelqu'un a un bon moyen de le faire?

+4

Qu'est-ce qui vous pensez 'Foo (a1, 1, 2, 3),' 'où a1' est un' int [] 'devrait fonctionner? L'avez-vous testé? Sur quelle version du compilateur? –

+0

Êtes-vous sûr que 'Foo (a1, 1, 2, 3)' fonctionne et qu'il appelle la même surcharge que 'Foo (1,2,3)'? J'ai testé sur .net 3.5 SP1 et ça ne marche pas pour moi. –

+1

Assez juste. Visual studio me laisse taper sans avertissement, mais pas les autres. Ils échouent tous à la compilation. Je vais éditer. – captncraig

Répondre

11

C'est bizarre. Foo(a1, 2, 3) ne devrait pas fonctionner. Vous devriez soit passer un tableau ou un groupe d'entiers. Vous ne pouvez pas les mélanger AFAIK. Avez-vous une autre surcharge ou quelque chose?

Il n'y a pas vraiment de syntaxe pour cela. Le plus concis que je peux penser est:

Foo(a1.Concat(a2).Concat(new[] {1,2,3}).ToArray()); 
+0

Je suis d'accord 'Foo (a1, 2, 3)' ne peut pas fonctionner sans une autre surcharge. – leppie

2

Convenu, ses Foo(a1, 2, 3) très étrange œuvres.

Voici une méthode d'extension pour .Concat pour rendre la syntaxe de Mehrdad un peu plus facile pour les yeux.

public T[] Concat<T>(this T[] first, params T[] other) 
    { 
     T[] output = new T[first.Length+other.Length]; 

     first.CopyTo(output,0); 
     other.CopyTo(output,first.Length); 
     return output; 
    } 

Peut être utilisé comme suit:

Foo(a1.Concat(a2).Concat(1,2,3)); 
+1

Notez que 'Enumerable.Concat' est évalué paresseusement tandis que le vôtre fait la copie sur chaque appel. Cela peut être inefficace si le nombre d'appels 'Concat' augmente. –

+0

Très bon point. –

Questions connexes