2012-11-07 15 views
14

Ho un metodo che accetta parametri. All'interno del metodo di un'altra variabile è aggiunto l'output:C#: Converti array da utilizzare in parametri con parametri aggiuntivi

private void ParamsTest(params object[] objs) 
{ 
    var foo = "hello"; 
    // Invalid: Interpretes objs as single array parameter: 
    Console.WriteLine("{0}, {1}, {2}", foo, objs); 
} 

Quando chiamo

ParamsTest("Hi", "Ho"); 

mi piacerebbe vedere l'output.

hello Hi Ho 

Cosa devo fare?

posso copiare foo e objs in un nuovo array e passare tale matrice per WriteLine, ma c'è un modo più elegante per forzare objs a comportarsi come Parametri di nuovo? Tipo di objs.ToParams()?

+0

Non distrarre l'esempio Console.WriteLine o la stringa di formato. Questo non è il mio vero problema. Domanda reale: come posso rendere WriteLine vedere gli argomenti 4 (formato, foo e 2 array) anziché 3 (formato, foo e array). – AHalvar

risposta

10

Se il problema è solo per aggiungere un altro elemento per l'array, è possibile utilizzare un elenco

List<object> list = new List<object> { "hello" }; 
list.AddRange(objs); 
Console.WriteLine("{0}, {1}, {2}, ...", list.ToArray()); 

params non è un tipo di dati. Il tipo di dati dei parametri è pur sempre un semplice array.

+1

Questa è la mia soluzione attuale. Quindi non c'è modo di farlo in modo più elegante, cioè senza allocare una lista e copiare oggetti in giro? – AHalvar

+0

Il problema è che non è possibile ridimensionare un array in .NET. Quindi, usa un altro tipo di dati di raccolta o copia valori in giro. – Jan

1

È possibile utilizzare ciclo foreach come questo

string objsString = string.Empty; 
foreach (var ob in objs) 
    objsString += ", " + ob.ToString(); 
Console.WriteLine("{0}{1}", foo, objsString); 

o non v'è modo ancora migliore:

string paramsString = string.Join(", ", objs); 
Console.WriteLine("{0}, {1}", foo, paramsString); 
0

loop attraverso il params serie

var foo = "hello"; 
Console.Write(foo); 
objs.ForEach(obj => Console.Write(", {0}", obj.ToString())); 
Console.WriteLine(); 

o utilizzare String.Join() per creare un rappresentazione in serie dell'array.

var foo = "hello"; 
string output = String.Join(", ", objs); 
Console.WriteLine("{0}, {1}", foo, output); 
6

userei string.Join per fare la formattazione:

Console.WriteLine("{0}, {1}", foo, string.Join(", ", objs)); 
+0

[utile ** collegamento **] (http://msdn.microsoft.com/en-us/library/57a79xd0.aspx). –

+1

Questo risolve il problema per l'esempio di Console.WriteLine, ma naturalmente :) WriteLine non è il mio vero problema, solo un'illustrazione (troppo semplice?). – AHalvar

Problemi correlati