2009-09-03 32 views
6

Per scopi di registrazione, desidero chiamare il metodo .ToString() di ogni oggetto su una matrice oggetto []. Come posso farlo nel modo più semplice?C# IEnumerable <Object> a stringa

Dire che ho:

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

    Log(????); 

Come posso passare una stringa come ad esempio il suo valore è pari a:

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

O meglio, con virgola tra ciascun valore.

+1

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

+0

E infatti http://stackoverflow.com/questions/145856 –

risposta

19

Ti piace questa:

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

Aggiornamento:

Dal quadro 4 il metodo Join può anche prendere un IEnumerable<string>, quindi non è necessario il ToArray:

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

la stringa deve essere la stringa di stringa. È più ... –

+1

@ Jonathan: corretto. Lo scrivo sempre così, quindi non so perché non l'ho fatto stavolta ... – Guffa

+1

Jonathan, più cosa? Se dovessi usare 'String', perché C# è stato spedito con gli alias? –

2

Uso regolarmente ...

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

MoreLINQ ha un metodo ToDelimitedString proprio per questo scopo.

Utilizza uno StringBuilder piuttosto che utilizzando String.Join (da quello che ricordo dalle domande precedenti, l'efficienza dei due approcci dipende in gran parte da cosa l'input è) ma è abbastanza semplice. Ecco il codice di base (ci sono un paio di involucri per consentire un delimitatore di default):

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

Non è necessario controllare sb.Length su ogni iterazione. È possibile eliminare il primo delimitatore restituendo sb.ToString (1, sb.Length-1). – gimel

+0

@gimel: È leggermente più complicato di così, per tenere conto dei delimitatori lunghi e delle fonti vuote. Ci sono modi migliori però ... Anch'io non mi piace la mancanza di apparecchi qui. Risolverò quando avrò tempo :) –

1

Un semplice modo old fashion:

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