2013-07-17 7 views
6

私はCSV文字列に書きたいリストを持っています。CSV文字列への一般リスト

私が見つけたすべての例は、単一のアイテムリストのようですが、私の場合は複数のアイテムがあります。

私が現在持っているコードは、

しかし、リストが大きい場合、このメソッドは実行に非常に時間がかかります。

クラスmyリストは次のようになります。

internal class ClientMasterFile 
{ 
public String COL1{ get; set; } 
public String COL2{ get; set; } 
public String COL3{ get; set; } 
public String COL4{ get; set; } 
public String COL5{ get; set; } 
public String COL6{ get; set; } 
public String COL7{ get; set; } 
public String COL8{ get; set; } 
public String COL9{ get; set; } 
public String COL10{ get; set; } 
public String COL11{ get; set; } 
public String COL12{ get; set; } 
} 

高度なバージョンのString.Joinを使用すると、これを高速に実行できますか?

おかげ

+3

。 'StringBuilder'を使用してください。 – Romoku

+2

ClientMasterFileでToString()メソッドのオーバーライドを作成すると、それほど時間がかかるため、Reflectionは必要ありません。 –

答えて

17

です。

文字列を直接連結するのは遅く、小規模な操作には大丈夫です。

参照:CSVを用Does StringBuilder use more memory than String concatenation?

private static string CreateCSVTextFile<T>(List<T> data, string seperator = ",") 
{ 
    var properties = typeof(T).GetProperties(); 
    var result = new StringBuilder(); 

    foreach (var row in data) 
    { 
     var values = properties.Select(p => p.GetValue(row, null)); 
     var line = string.Join(seperator, values); 
     result.AppendLine(line); 
    } 

    return result.ToString(); 
} 

より完全な実装:

private static string CreateCSVTextFile<T>(List<T> data) 
{ 
    var properties = typeof(T).GetProperties(); 
    var result = new StringBuilder(); 

    foreach (var row in data) 
    { 
     var values = properties.Select(p => p.GetValue(row, null)) 
           .Select(v => StringToCSVCell(Convert.ToString(v))); 
     var line = string.Join(",", values); 
     result.AppendLine(line); 
    } 

    return result.ToString(); 
} 

private static string StringToCSVCell(string str) 
{ 
    bool mustQuote = (str.Contains(",") || str.Contains("\"") || str.Contains("\r") || str.Contains("\n")); 
    if (mustQuote) 
    { 
     StringBuilder sb = new StringBuilder(); 
     sb.Append("\""); 
     foreach (char nextChar in str) 
     { 
      sb.Append(nextChar); 
      if (nextChar == '"') 
       sb.Append("\""); 
     } 
     sb.Append("\""); 
     return sb.ToString(); 
    } 

    return str; 
} 

使用:あなたは文字列の連結を使用しているescaping tricky string to CSV format

+0

これを試してすぐに実行されます。ありがとうございました。 –

+0

汎用制約も必要ありません。私はあなたがこれが助けになったとうれしく思います! – Romoku

関連する問題