2009-09-03 6 views
6

Pour la journalisation, je voudrais appeler la méthode .ToString() de chaque objet sur un objet [] tableau. Comment puis-je le faire de la manière la plus simple?C# IEnumerable <Object> à la chaîne

Dire que j'ai:

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

    Log(????); 

Comment puis-je passer une chaîne telle que sa valeur est égale à:

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

Ou mieux, avec des virgules entre chaque valeur.

+1

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

+0

Et en effet http://stackoverflow.com/questions/145856 –

Répondre

19

Comme ceci:

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

Mise à jour:

A partir de 4 cadre de la méthode Join peut également prendre un IEnumerable<string>, de sorte que vous n'avez pas besoin ToArray:

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

chaîne devrait être capitale. C'est plus .... –

+1

@Jonathan: Correct. Je l'écris toujours de cette façon, donc je ne sais pas pourquoi je n'ai pas cette fois-ci ... – Guffa

+1

Jonathan, plus quoi? Si vous deviez utiliser 'String', pourquoi C# est-il livré avec les alias? –

2

J'utilise régulièrement ...

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

MoreLINQ a une méthode ToDelimitedString pour précisément cette fin.

Il utilise un StringBuilder plutôt que d'utiliser String.Join (d'après ce que je me souviens des questions précédentes, l'efficacité des deux approches dépend fortement de ce que l'entrée est), mais c'est assez simple. Voici le code de base (il y a deux emballages pour permettre un séparateur par défaut):

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

Pas besoin de vérifier sb.Length à chaque itération. Vous pouvez ignorer le premier délimiteur en renvoyant sb.ToString (1, sb.Length-1). – gimel

+0

@gimel: C'est un peu plus compliqué que ça, pour tenir compte des longs délimiteurs et des sources vides. Il y a de meilleurs moyens cependant ... Je ne tiens pas non plus au manque d'accolades ici. Je réparerai quand j'aurai du temps :) –

1

Une façon simple ancienne mode:

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