您好我想要一个列表集合并生成一个单独的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上寻求帮助,以便在单个语句中执行此操作。谢谢!
答案 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答案的评论中不明确。