从LINQ中的字符串列表中创建CSV

时间:2010-05-03 14:45:56

标签: 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;       
}


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();
}

这将返回“Bob,Nancy,Joe,Jack”

在LINQ上寻求帮助,以便在单个语句中执行此操作。谢谢!

6 个答案:

答案 0 :(得分:28)

LINQ没有任何一个衬里可以做到这一点。请注意,您可以使用Aggregate方法执行此操作,但您将使用字符串连接而不是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());
    }

答案 1 :(得分:10)

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

我个人建议你使用真正的CSV parser,而不是试图做一个会在你的值包含逗号的情况下破坏的衬里。您可以阅读有关rolling your own CSV parser的文章。

答案 2 :(得分:4)

使用LINQ在单个语句中构建CSV可能不是一个好主意 - 特别是如果数据量很大。仅仅因为LINQ可能的事情并不意味着它是自动的最佳方式。

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

您真正应该考虑的是使用生成正确CSV格式数据的proven library

如果您确实选择编写自己的实现,请注意涉及连接多个字符串的技术(例如作为示例提供的Enumerable.Aggregate())可能会导致许多中间的,丢弃的字符串实例拖累表现。您可能仍希望在任何实际实施中使用StringBuilder

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

答案 3 :(得分:2)

您可以使用

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

答案 4 :(得分:1)

我几乎只是使用这个函数从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;
}

哈利

答案 5 :(得分:1)

在.net 4.0中,

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

在此处单独添加我的答案,以便读者更清楚,在Darin Dimitrov's答案的评论中不明确。