如何检查条件并更新IEnumerable中的值

时间:2016-11-25 14:00:32

标签: c# csv asp.net-mvc-4

以下是我用于将数据表写入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文件中的单元格仍为空白

2 个答案:

答案 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();