2010-05-03 7 views
16

Hallo Ich möchte eine Liste Sammlung und generieren Sie eine einzelne CSV-Linie. Nimm das also;Machen CSV aus der Liste der Zeichenfolge in 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(); 
} 

Das gibt "Bob, Nancy, Joe, Jack"

Hilfe der Suche auf der LINQ diese in einer einzigen Anweisung zu tun. Vielen Dank!

Antwort

24

Es gibt keine Liner, dies mit LINQ zu tun. Beachten Sie, dass Sie dazu die Methode "Aggregat" verwenden können. Sie verwenden jedoch statt eines StringBuilders eine String-Verkettung. Ich würde für dieses eine Verlängerung Methode hinzufügen, wenn es etwas, das Sie oft tun werden:

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

Genau das habe ich gesucht. Dies ist nicht zum Erstellen einer CSV-Datei gedacht, sondern nur zum Erstellen einer Ansicht. Ausgezeichnet! – CmdrTallen

+0

+1 Ich möchte nur sagen .. cool! –

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

Ich persönlich würde Ihnen empfehlen, eine echte CSV parser anstatt zu versuchen, mit einem Liner zu tun, die brechen, wenn Ihre Werte ein Komma beispielsweise enthalten. Sie können diesen Artikel über rolling your own CSV parser lesen.

+2

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

+1

@ user129206 hängt von Ihrer .net-Version ab. In 3.5 oder früher hatte 'string.Join()' nur Array-Überladungen. –

2

können Sie

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

LINQ verwenden Mit Hilfe einer CSV in einer einzigen Anweisung sein kann, keine gute Idee zu bauen - vor allem, wenn die Datenmenge signficant ist. Nur weil etwas mit LINQ möglich ist, heißt das nicht, dass dies automatisch der beste Weg ist.

Das Erstellen einer CSV-Zeichenfolge ist eine Operation, die das Verketten und Neuzuweisen von Zeichenfolgen erfordert. Sie können String.Join() verwenden, aber Zeichen wie Kommas oder doppelte Anführungszeichen werden nicht automatisch entfernt. In der Tat gibt es eine Reihe von nicht-trivialen Regeln, die zum Erzeugen von wohlgeformten CSV-Dateien gehören.

Was Sie wirklich in Betracht ziehen sollten, ist die Verwendung einer proven library, die korrekte CSV-formatierte Daten generiert.

Wenn Sie sich entscheiden, Ihre eigene Implementierung zu schreiben, beachten Sie, dass Techniken, die das Verketten vieler Strings beinhalten (wie das als Beispiel angebotene Enumerable.Aggregate()), zu vielen dazwischenliegenden String-Instanzinstanzen führen können . Sie werden wahrscheinlich immer noch eine StringBuilder in einer realen Implementierung verwenden wollen.

Manchmal ist die klarste und einfachste Struktur für Code immer noch eine Schleife.

1

ich ziemlich genau diese Funktion nutzen zu csv von Linq zu erzeugen. Es ist nicht perfekt, aber anpassbar.

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

In .net 4.0,

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

Hinzufügen meine Antwort hier als seperate ein, so dass es für die Leser mehr klar sein wird, ist nicht klar in meinen Kommentaren unter Darin Dimitrov's Antworten.

Verwandte Themen