2009-09-03 24 views
6

Para fines de registro, me gustaría llamar al método .ToString() de cada objeto en una matriz object []. ¿Cómo puedo hacer esto de la manera más simple?C# IEnumerable <Object> a la cadena

Decir que tengo:

myArray = new Object[]{"astring",1, Customer} 

    Log(????); 

¿Cómo puedo pasar una cadena como su valor es igual a:

"astring".ToString()+1.ToString()+Customer.ToString() 

O mejor, la coma entre cada valor.

+1

Dupe: http://stackoverflow.com/questions/380708/shortest-method-to-convert-an-array-to-a-string-in-c-linq –

+0

Y, de hecho, http://stackoverflow.com/questions/145856 –

Respuesta

19

De esta manera:

Log(String.Join(", ", myArray.Select(o => o.ToString()).ToArray())); 

Actualización:

De marco 4 Join el método también puede tomar un IEnumerable<string>, por lo que no es necesario el ToArray:

Log(String.Join(", ", myArray.Select(o => o.ToString()))); 
+0

cadena debe ser Cadena capital. Es más ... –

+1

@Jonathan: Correcto. Siempre lo escribo así, así que no sé por qué no lo hice esta vez ... – Guffa

+1

Jonathan, ¿qué más? Si tuviera que usar 'String', ¿por qué C# se envía con los alias? –

2

Uso regularmente ...

String.Join(", ", Array.ConvertAll<object, string>(myArray, Convert.ToString)) 
2

MoreLINQ tiene un método ToDelimitedString para precisamente este propósito.

Utiliza un StringBuilder en lugar de utilizar String.Join (por lo que recuerdo de las preguntas anteriores, la eficacia de los dos enfoques depende en gran medida de lo que es la entrada) pero es lo suficientemente simple. Aquí está el código del núcleo (hay un par de envoltorios para permitir un delimitador predeterminado):

private static string ToDelimitedStringImpl<TSource> 
    (IEnumerable<TSource> source, string delimiter) 
{ 
    Debug.Assert(source != null); 
    Debug.Assert(delimiter != null); 

    var sb = new StringBuilder(); 

    foreach (var value in source) 
    { 
     if (sb.Length > 0) sb.Append(delimiter); 
     sb.Append(value); 
    } 

    return sb.ToString(); 
} 
+0

No es necesario verificar sb.Length en cada iteración. Puede descartar el primer delimitador al devolver sb.ToString (1, sb.Length-1). – gimel

+0

@gimel: Es un poco más complicado que eso, para tener en cuenta los delimitadores largos y las fuentes vacías. Sin embargo, hay mejores maneras ... No estoy interesado en la falta de llaves aquí. Lo arreglaré cuando tenga tiempo :) –

1

Una sencilla manera antigua:

string myString = ""; 
foreach(Object o in myArray) 
    myString += o.ToString() + ", "; 
// Remove the extra comma 
if(myString.Length >=2) 
    myString.Remove(myString.Length - 2); 
Cuestiones relacionadas