2010-05-03 50 views
16

嗨我想列出一个列表集合并生成一个单独的csv行。所以拿这个;从LINQ中的字符串列表中制作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(); 
} 

这将返回“鲍勃说,南希,乔,杰克”

寻找帮助,对LINQ为此在一个单独的语句。谢谢!

回答

24

有没有任何一个内衬与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()); 
    } 
+0

这正是我正在寻找的。这不是为了建立一个CSV文件而只是为了提供一个视图。优秀! – CmdrTallen 2010-05-03 16:45:12

+0

+1我只想说......酷! – 2013-12-27 05:22:34

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

我个人建议你使用真实CSV parser,而不是试图做一个衬垫,将打破,如果你的价值观包含例如一个逗号。您可以阅读关于rolling your own CSV parser的这篇文章。

+2

string str = string.Join(“,”,MakeStrings()); – 2012-05-21 12:19:15

+1

@ user129206取决于您的.net版本。在3.5或更早版本中'string.Join()'只有数组重载。 – 2013-04-08 18:31:00

2

您可以使用

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

使用LINQ在单个语句建立一个CSV可能不是一个好主意 - 尤其是如果数据量是signficant。仅仅因为LINQ的某些可能性并不意味着它会自动成为最好的方法。

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

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

如果您确实选择编写您自己的实现,请注意,涉及串联多个字符串的技术(例如Enumerable.Aggregate()作为示例提供)可能会导致大量中间抛弃字符串实例,这会拖低性能。您可能仍然希望在任何实际实现中使用StringBuilder

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

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

哈利

1

在.NET 4.0中,

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

这里添加我的答案作为一个单独的一个,所以,这将是Darin Dimitrov's下读者更清晰,不清晰在我的评论回答。