为什么使用 string.Join 时空值会自动转换为空字符串?

Why does a null value automatically get converted into empty string when using string.Join?

我有一个包含空值的 JArray。当我做 string.Join 时,null 值正在转换为 empty string.

原始数组值:

[
  null,
  null,
  "America/Boise",
  false,
  "2021-02-04T06:51:33.9686227Z"
]

String.Join:

var val = $"('{string.Join("','", valuesArray)}')";

当前结果:

"('','','America/Boise','False','2/4/2021 6:51:33 AM')"

预期结果:

"(null,null,'America/Boise',False,'2/4/2021 6:51:33 AM')"

生成示例: https://dotnetfiddle.net/5nRTyL

如何使用 string.Join 获得预期结果?

因为它就是这样设计的。请参阅 String.Join 的文档:

If separator is null, an empty string (String.Empty) is used instead. If any element in value is null, an empty string is used instead.

只需将“''”替换为“null”即可。

var val = $"('{string.Join("','", valuesArray)}')".Replace("''", "null");

null JArray 中的值存储为 JTokensJTokenTypeNull。所以你需要检查这个并将它们转换为字符串 "null"。其次,由于您只想引用某些值,因此在连接它们时不应将引号放在分隔符值中,而应根据其类型只引用需要它的值。

定义以下辅助函数:

string TokenToString(JToken token)
{
    switch (token.Type)
    {
        case JTokenType.Null: 
            return "null";
        case JTokenType.Date:
        case JTokenType.String: 
            return $"'{token}'";
        default: 
            return token.ToString();
    }
}

然后你可以得到你想要的结果:

string val = $"({string.Join(",", valuesArray.Select(v => TokenToString(v)))})";

此处的工作演示:https://dotnetfiddle.net/Q62Uck