从LINQ中的字符串列表生成CSV

从LINQ中的字符串列表生成CSV,linq,csv,Linq,Csv,嗨,我想采取一个列表集合,并生成一个单一的csv行。所以拿这个来说 List<string> MakeStrings() { List<string> results = new List<string>(); results.add("Bob"); results.add("Nancy"); results.add("Joe"); results.add("Jack"); return results;

嗨,我想采取一个列表集合,并生成一个单一的csv行。所以拿这个来说

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();
}
List MakeStrings()
{
列表结果=新列表();
结果。添加(“Bob”);
结果。添加(“南希”);
结果。添加(“Joe”);
结果。添加(“杰克”);
返回结果;
}
字符串联系人StringsToGether(列出部分)
{
StringBuilder sb=新的StringBuilder();
foreach(部分中的字符串部分)
{
如果(某人长度>0)
某人加上(“,”);
某人附加(部分);
}
使某人返回字符串();
}
返回“鲍勃,南希,乔,杰克”

正在寻找LINQ上的帮助,以便在单个语句中完成此操作。谢谢

var csv = string.Join(",", MakeStrings().ToArray());
我个人建议您使用real,而不是尝试使用一行程序,例如,如果您的值包含逗号,该行程序将中断。您可以阅读这篇文章。

您可以使用

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

使用LINQ在单个语句中构建CSV可能不是一个好主意-尤其是在数据量很大的情况下。仅仅因为LINQ可以实现某些功能并不意味着它自动成为实现此目的的最佳方式

从本质上讲,构建CSV字符串是一种需要连接和重新分配字符串的操作。您可以使用
String.Join()
,但它不会自动转义逗号或双引号等字符。事实上,在生成格式良好的CSV文件时,有许多非常重要的规则

<>你应该考虑做的是使用一个生成正确的CSV格式化数据的软件。 如果您选择编写自己的实现,请注意,涉及连接许多字符串的技术(如作为示例提供的
Enumerable.Aggregate()
)可能会导致大量中间的、一次性的字符串实例,这将降低性能。您可能仍然希望在任何实际实现中使用
StringBuilder


有时,代码最清晰、最简单的结构仍然是一个循环。

没有任何一个行程序可以用LINQ实现这一点。请注意,您可以使用聚合方法来执行此操作,但您将使用字符串连接而不是StringBuilder。如果你经常做的事情,我会考虑添加一个扩展方法:

    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());
    }
公共静态字符串ToCsv(此IEnumerable源代码)
{
如果(source==null)抛出新的ArgumentNullException(“source”);
返回string.Join(“,”,source.Select(s=>s.ToString()).ToArray();
}

我几乎只是使用此函数从linq生成csv。 它并不完美,但可以定制

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;
}
哈利

在.NET4.0中

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

将我的答案作为一个单独的答案添加到这里,以便读者能更清楚地看到它,而不是在我的“答案”下的评论中清楚地看到它。

这正是我想要的。这并不是为了构建CSV文件,而是为了连接到视图上。杰出的string str=string.Join(“,”,MakeStrings())@user129206取决于您的.net版本。在3.5或更早版本的
string.Join()
中,只有数组重载。