根据MSDN docs for String.Join“如果value中的任何元素为null,则使用空字符串。”
我从DataTable中提取数据的代码
rotationValues = string.Join<object>(", ",
from r in rotationData.Rows.OfType<DataRow>() select r[5]);
这将导致输出类似于:
8, 7, , 12, , , 13,
有没有办法简单地让“null”代替空字符串,如下所示:
8, 7, null, 12, null, null, 13, null
答案 0 :(得分:7)
您可以选择
r[5] ?? "null"
而非r[5]
。
此外,只需在调用泛型方法时删除<object>
部分。它仍然是您加入的IEnumerable<object>
,但编译器会自动推断出类型参数。
评论后添加:
您的r[5]
可能是DBNull.Value
。然后,这不是“真正的”空引用,但其ToString
实现返回""
。因此,在这种情况下,string.Join
文档并不严格相关。因此,请尝试选择
(r[5] == null || DBNull.Value.Equals(r[5])) ? "null" : r[5]
或者
(r[5] == null || r[5] is DBNull) ? "null" : r[5]
希望它有所帮助。
答案 1 :(得分:0)
为了扩展Jeppe的答案,我不确定为什么他的方式实际上对我不起作用,我确认r[5]
中的空值实际上是System.DBNull
类型但它没有用“null”替换。
以下是我最终做的事情:
rotationValues = string.Join(", ",
from r in rotationData.Rows.OfType<DataRow>()
select (r[5].ToString().Length == 0 ? "null" : r[5]));
这是一个我不想做的条件,但是我看了一下这个页面C# Empty Strings,那个人用不同的方法来检查一个字符串是否为空并且长度方法是最快的。所以我想检查长度,如果长度为0则加入“null”,当它不为零时加入实际r[5]
值。
找出原因仍然很好? “null”虽然没有用。
编辑参考:
问题确实是那个??在null
而非DBNull
上运作。另请参阅.Net C# ?? operator didn't trigger for System.DBNull type in DataTable DataRow