【问题标题】:string.Format paste string as parameter without quotesstring.Format 将字符串粘贴为不带引号的参数
【发布时间】:2018-11-12 14:00:58
【问题描述】:

我正在格式化一个字符串:

string.Format(
            "{{\"EventType\":\"{0}\",\"OrganizationId\":\"{1}\",\"Timestamp\":{2},\"ExecutionTime\":{3},\"Success\":{4}}}",
            telemetryEvent.EventType ?? "null", telemetryEvent.OrganizationId ?? "null", telemetryEvent.Timestamp,
            telemetryEvent.ExecutionTime, telemetryEvent.Success);

如果它为 null,我需要获取 null 而不是字符串。

例如""组织 ID":null" 但我得到的是 ""OrganizationId":"null""

谢谢

【问题讨论】:

  • 似乎您正在尝试创建 telemetryEvent 实例的 JSON 表示。为什么不使用 Json.Net 呢?
  • @ZoharPeled 不能使用任何库,不允许(
  • 将引号移动到参数,而不是格式字符串?这不是最佳的,但它会工作
  • “不能使用任何库”是什么意思? Json 序列化内置于 .NET 中。诚然,它不如 Json.net,但它可能足以满足您的需求。您是否考虑过使用它?
  • 如果您不能使用第三方库,您可以在System.Runtime.Serialization.Json 中尝试DataContractJsonSerializer。不确定您使用的框架是否带有此内置功能。

标签: c# .net string string-formatting interpolation


【解决方案1】:

我认为最简单的解决方案可能是使用replace

string.Format(
        "{{\"EventType\":\"{0}\",\"OrganizationId\":\"{1}\",\"Timestamp\":{2},\"ExecutionTime\":{3},\"Success\":{4}}}",
        telemetryEvent.EventType ?? "null", telemetryEvent.OrganizationId ?? "null", telemetryEvent.Timestamp,
        telemetryEvent.ExecutionTime, telemetryEvent.Success)
    .Replace("\"null\"", "null");

You can see a live demo on rextester.

【讨论】:

    【解决方案2】:

    您在 {1} 周围有引号,因此引号将始终出现在输出中。 将它们移动到参数 1 的值中。

    string.Format(
            "{{\"EventType\":\"{0}\",\"OrganizationId\":{1},\"Timestamp\":{2},\"ExecutionTime\":{3},\"Success\":{4}}}",
            telemetryEvent.EventType ?? "null", 
            telemetryEvent.OrganizationId ?? "null", "\"" + telemetryEvent.Timestamp + "\"",
            telemetryEvent.ExecutionTime, telemetryEvent.Success);
    

    【讨论】:

      【解决方案3】:

      你得到“null”,因为字符串模板已经添加了引号:

      "{{\"EventType\":\"{0}\"
        ,\"OrganizationId\":\"{1}\",...
      

      因此,无论您在 {0} 和 {1} 中输入什么内容,它都会被放在双引号内。

      为了摆脱它们,请在变量本身周围添加引号。

      更新:抱歉,我之前的版本不正确(感谢 Zohar 发现这一点)。该方法是有效的,但您需要使用三元表达式而不是空合并运算符:

      "{{\"EventType\":{0},\"OrganizationId\":{1},...
        ,telemetryEvent.EventType != null ? "\"" + telemetryEvent.EventType + "\"" : "null"
        ,telemetryEvent.OrganizationId != null ? "\"" + telemetryEvent.OrganizationId + "\"" : "null",...
      

      虽然这样会变得“有点”麻烦,所以可能有更好的方法。

      也许你已经知道了,但是通过使用字符串插值,这种字符串构建变得更具可读性(参见https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/tokens/interpolated)。

      【讨论】:

      • "\"" + telemetryEvent.EventType + "\"" 永远不会为空...如果telemetryEvent.EventType 为空,它将只是一个包含"" 的字符串。
      • 是的,好的,但我的回答适用于所有参数(telemetryEvent.EventType、telemetryEvent.OrganizationId、...)。我会澄清我的答案。
      • 是的,我的评论的重点是在"\"" + telemetryEvent.EventType + "\"" 上使用?? 运算符是没有用的,因为它永远不会为空......
      • 啊该死的......你是对的。对不起,我没想到。
      • 是的,那行得通。但正如你所说,不是很可读(你必须为每个变量重复它​​)。这就是我推荐replace 的原因 - 它简单、快速、易读,您只需编写一次。
      猜你喜欢
      • 2018-07-05
      • 1970-01-01
      • 2011-05-26
      • 2020-12-19
      • 1970-01-01
      • 2012-12-17
      • 2015-05-13
      • 2012-03-18
      • 2018-03-06
      相关资源
      最近更新 更多