以下是我用于将数据表写入csv文件的代码的一部分:
foreach (DataRow row in reportDataTable.Rows)
{
IEnumerable<string> fields = row.ItemArray.Select(field => string.Concat("\"", field.ToString().Replace("\"", "\"\""), "\""));
stringBuilder.AppendLine(string.Join(",", fields));
}
是否可以检查集合中的空字符串并将其替换为默认文本,例如&#34; Not Available&#34;在附加到StringBuilder对象之前?
我正在使用:
foreach (var fieldValue in fields)
{
if (fieldValue.ToString() == "\"\"")
fieldValue.Replace("\"\"", "\"N.A.\"");
}
但是csv文件中的单元格仍为空白
答案 0 :(得分:1)
如果您想更改所选内容,请更改.Select()
:
var fields = row.ItemArray.Select(field => string.IsNullOrEmpty(field.ToString()) ? "\"N/A\"" : string.Concat("\"", field.ToString().Replace("\"", "\"\""), "\""));
stringBuilder.AppendLine(string.Join(",", fields));
答案 1 :(得分:0)
IEnumerable<string> fields
指向IEnumerable类型的.Select()
对象。每次对字段对象foreach
进行操作时,将遍历向IEnumerable对象询问项目,这样做是通过调用lambda表达式的主体来实现的。
没关系,如果你改变在这样的循环中得到的值;一旦foreach
结束,它们就会消失
当string.Join
启动时,它会执行自己的foreach
,它将获得新生成的值,而不是您认为已设置的值。
一个修复只是使用.ToArray()
或.ToList()
将其全部转化为集合。只有这样你才能拥有一组对象,而不是“如何构造对象的定义”。
所以,例如像这样:
var fields = row
.ItemArray
.Select(field => string.Concat("\"", field.ToString().Replace("\"", "\"\""), "\""))
.ToArray();