C# CSV字符串的通用列表

C# CSV字符串的通用列表,c#,linq,list,C#,Linq,List,我有一个要写入CSV字符串的列表 我发现的例子似乎都是针对单个项目列表的,我的有多个项目 我目前拥有的代码是 private static string CreateCSVTextFile<T>(List<T> data, string seperator = ",") where T : ExcelReport, new() { var objectType = typeof(T); var properties = objectType.GetProperti

我有一个要写入CSV字符串的列表

我发现的例子似乎都是针对单个项目列表的,我的有多个项目

我目前拥有的代码是

private static string CreateCSVTextFile<T>(List<T> data, string seperator = ",") where T : ExcelReport, new()
{
  var objectType = typeof(T);
  var properties = objectType.GetProperties();
  var currentRow = 0;
  var returnString = "";
  foreach (var row in data)
  {
    var currentColumn = 0;
    var lineString = "";
    foreach (var info in properties)
    {
      lineString = lineString + info.GetValue(row, null) + seperator;
      currentColumn++;
    }
    if (seperator != "")
    {
      lineString = lineString.Substring(0, lineString.Count() - 2);
    }
    returnString = returnString + Environment.NewLine + lineString;
    currentRow++;
  }
  return returnString;
}
使用高级版本的String.Join有没有更快的方法


谢谢

我们使用linqtocsv取得了一些成功

这里有一些解释


使用和可以简化您的方法

直接连接字符串的速度很慢,并且占用大量内存,这对于小操作来说很好

见:

私有静态字符串CreateCSVTextFile(列表数据,字符串分隔符=“,”)
{
var properties=typeof(T).GetProperties();
var result=新的StringBuilder();
foreach(数据中的var行)
{
var values=properties.Select(p=>p.GetValue(行,空));
var line=string.Join(分隔符、值);
结果:追加行(行);
}
返回result.ToString();
}
CSV的更完整实现:

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;
}
私有静态字符串CreateCSVTextFile(列表数据)
{
var properties=typeof(T).GetProperties();
var result=新的StringBuilder();
foreach(数据中的var行)
{
var values=properties.Select(p=>p.GetValue(行,空))
.Select(v=>stringtocscell(Convert.ToString(v));
var line=string.Join(“,”值);
结果:追加行(行);
}
返回result.ToString();
}
私有静态字符串StringToCSVCell(字符串str)
{
bool mustQuote=(str.Contains(“,”)| | str.Contains(“\”)| | str.Contains(“\r”)| | str.Contains(“\n”);
如果(必须引用)
{
StringBuilder sb=新的StringBuilder();
某人加上“\”;
foreach(str中的字符nextChar)
{
某人追加(下一次);
如果(nextChar==“”)
某人加上“\”;
}
某人加上“\”;
使某人返回字符串();
}
返回str;
}

使用:

您正在使用字符串连接。使用
StringBuilder
。在ClientMasterFile中创建一个ToString()方法重写,您将不需要反射,因为这需要很长时间。您也不需要通用约束。我很高兴您发现这很有帮助!
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;
}