2010-05-03 9 views
16

Bonjour Je souhaite prendre une collection de listes et générer une seule ligne CSV. Alors prends ça;Créer un fichier CSV à partir d'une liste de chaînes dans LINQ

List<string> MakeStrings() 
{ 
    List<string> results = new List<string>(); 
    results.add("Bob"); 
    results.add("Nancy"); 
    results.add("Joe"); 
    results.add("Jack"); 
    return results;  
} 


string ContactStringsTogether(List<string> parts) 
{ 
    StringBuilder sb = new StringBuilder(); 

    foreach (string part in parts) 
    { 
     if (sb.Length > 0) 
      sb.Append(", "); 

     sb.Append(part); 
    } 
    return sb.ToString(); 
} 

Ce retour "Bob, Nancy, Joe, Jack"

Vous cherchez de l'aide sur le LINQ pour le faire en une seule déclaration. Merci!

Répondre

24

Il n'y a pas de liners pour faire cela avec LINQ. Notez que vous pouvez utiliser la méthode Aggregate pour ce faire, mais vous utiliserez la concaténation de chaîne au lieu d'un StringBuilder. J'envisager d'ajouter une méthode d'extension pour cela s'il quelque chose que vous allez faire souvent:

public static string ToCsv<T>(this IEnumerable<T> source) 
    { 
     if (source == null) throw new ArgumentNullException("source"); 
     return string.Join(",", source.Select(s => s.ToString()).ToArray()); 
    } 
+0

C'est exactement ce que je cherchais. Ce n'est pas pour la construction d'un fichier CSV, c'est juste pour se rapprocher de mettre une vue. Excellent! – CmdrTallen

+0

+1 Je veux juste dire .. cool! –

10
var csv = string.Join(",", MakeStrings().ToArray()); 

Personnellement, je recommande que vous utiliser un vrai CSV parser au lieu d'essayer de faire une liners qui cassera si vos valeurs contiennent une virgule, par exemple. Vous pouvez lire cet article à propos de rolling your own CSV parser.

+2

chaîne str = chaîne.Join (",", MakeStrings()); –

+1

@ user129206 dépend de votre version .net. En 3.5 ou plus tôt 'string.Join()' avait seulement des surcharges de tableau. –

2

Vous pouvez utiliser

String csv = parts.Aggregate((s1,s2) => s1+","+s2); 
4

LINQ pour construire un CSV dans une seule instruction ne peut pas être une bonne idée - surtout si la quantité de données est signficant. Ce n'est pas parce que quelque chose est possible avec LINQ que c'est automatiquement le meilleur moyen de le faire.

La construction d'une chaîne CSV est, par nature, une opération qui nécessite la concaténation et la réaffectation de chaînes. Vous pouvez utiliser String.Join(), mais il n'échappera pas automatiquement les caractères comme des virgules ou des guillemets. En fait, il existe un certain nombre de règles non triviales qui font partie de la génération de fichiers CSV bien formés.

Ce que vous devriez vraiment faire est d'utiliser un proven library qui génère des données au format CSV correct. Si vous choisissez d'écrire votre propre implémentation, sachez que les techniques qui impliquent la concaténation de nombreuses chaînes (comme le Enumerable.Aggregate() proposé à titre d'exemple) peuvent générer de nombreuses instances de chaînes intermédiaires qui ralentissent les performances. . Vous voudrez probablement toujours utiliser un StringBuilder dans n'importe quelle implémentation réelle. Parfois, la structure la plus claire et la plus simple pour le code est toujours une boucle.

1

je à peu près juste utiliser cette fonction pour générer csv de LINQ. Ce n'est pas parfait, mais personnalisable.

public string generateCsvFromLinqQueryable(IQueryable query,string delimiter,string replaceDelimiterInDataWith) 
{ 
    PropertyInfo[] rowPropertyInfos = null; 
    rowPropertyInfos = query.ElementType.GetProperties(); 

    string result = ""; 
    foreach (var myObject in query) 
    { 
     foreach (PropertyInfo info in rowPropertyInfos) 
     { 
      if (info.CanRead) 
      { 
       string tmp = Convert.ToString(info.GetValue(myObject, null)); 
       if (!String.IsNullOrEmpty(tmp)) 
       { 
        tmp.Replace(delimiter, replaceDelimiterInDataWith); 
       } 
       result += tmp + delimiter; 
      } 
     } 
     result += "\r\n"; 
    } 
    return result; 
} 

Harry

1

Dans .NET 4.0,

string str = string.Join(", ", MakeStrings()); 

ma réponse ici Ajout d'un un séparé, de sorte qu'il sera plus clair pour les lecteurs, pas clair dans mes commentaires sous Darin Dimitrov's répondre.

Questions connexes