如果元素的值为null,如何在.Net C#中使用String.Join输出"null"而不是空字符串?

5
根据MSDN String.Join文档,“如果value中的任何元素为空,则使用空字符串代替。”
我所拥有的代码从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
2个回答

8
您可以选择。
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]

希望这有所帮助。

我说得太早了,答案看起来不错,但一旦实施起来,它实际上并没有替换NULL值。以下是rotationData的生成方式:DataSet myDataSet = new DataSet(); mySqlDataAdapter.Fill(myDataSet); DataTable rotationData = myDataSet.Tables["Table"]; - Reality Extractor
再次感谢Jeppe,我还发布了一个后续问题,结果有人指出null不等于DBNull,请参见https://dev59.com/7nLYa4cB1Zd3GeqPVkIV - Reality Extractor

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接