从LINQ中的字符串列表生成CSV
嗨,我想采取一个列表集合,并生成一个单一的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;
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()
中,只有数组重载。