【问题标题】:Concatenate variables in string with "@" symbol用“@”符号连接字符串中的变量
【发布时间】:2016-03-24 18:08:46
【问题描述】:

给定这个多行字符串:

string strProviderJSON = @"
                {
                    ""npi"":""1111111111"",
                    ""name"":""DME Clearinghouse"",
                    ""email"":""my@doc.como"",
                    ""contactName"":""Sally Smith"",
                    ""fax"":"""",
                    ""address"":{
                        ""country"":""United States"",
                        ""street1"":""27787 Dequindre Apt 616"",
                        ""street2"":"""",
                        ""city"":""Madison Heights"",
                        ""state"":""MI"",
                        ""zipCode"":""32003""
                    },
                    ""phone"":""(904) 739-0300"",
                    ""contactPhone"":""(904) 739-0300""
                }
            ";

如何在其中连接变量?我试过了,但总是报错:

string strTest = "1111111111";
string strProviderJSON = @"
                {
                    ""npi"":""" + strTest + """,
                    ""name"":""DME Clearinghouse"",
                    ""email"":""my@doc.como"",
                    ""contactName"":""Sally Smith"",
                    ""fax"":"""",
                    ""address"":{
                        ""country"":""United States"",
                        ""street1"":""27787 Dequindre Apt 616"",
                        ""street2"":"""",
                        ""city"":""Madison Heights"",
                        ""state"":""MI"",
                        ""zipCode"":""32003""
                    },
                    ""phone"":""(904) 739-0300"",
                    ""contactPhone"":""(904) 739-0300""
                }
            ";

【问题讨论】:

  • 使用 JSON 库!!!那些双引号很可怕,我想不出有什么好的理由
  • @JoePhilllips 你会推荐哪个?我认为我必须从那里的整个字符串中制作一个对象,然后将其传递给 JSON 库?
  • newtonsoft json 是 c# 的常用格式。你甚至可以制作一个匿名对象并使用它。很简单,会清理你的代码很多

标签: c# string-concatenation


【解决方案1】:

将另一个 @ 字符附加到下一个字符串文字的开头。

...
""npi"":""" + strTest + @"""
""name"": ""DME Clearinghouse"",
...

【讨论】:

    【解决方案2】:

    对于字符串连接,您应该使用 String.Format() 方法,因为 普通连接会在内存中创建多个字符串,因此 String.Format() 将帮助您轻松插入变量。

    例子:

    String s = "111111";
    String finalString = String.Format(@""npi"":""{0}"",s);
    

    这是针对单行的(您可以使用多行但不可读)。 现在,对于多行,您可以使用 StringBuilder 类,它为我们提供了许多功能,如 Append()、AppendFormat() 等,因此您可以使用它可以有可读的代码

    例子:

    StringBuilder tempString = new StringBuilder();
    tempString.Append("{\n");
    tempString.AppendFormat(@"""npi"":""{0}"",\n", npiString);// npiString is a variable
    tempString.AppendFormat(@"""name"":""{0}"",\n", nameString);// nameString is a variable
    .....
    // you should add variables like this
    // at the end you can store final string by using following
    String finalString = tempString.ToString();
    

    注意:我没有在 String 中多次使用这些 '"',所以不确定,但附加变量应该由 StringBuilder 完成。

    希望它可以帮助您实现目标。

    【讨论】:

    • 只有在循环内连接时才适用。对于连接一堆字符串文字和变量的单个语句,编译器会发出对非常有效的框架 Concat 方法的单个调用。对于这样的场景,StringBuilder 不必要地冗长、繁琐且难以阅读,甚至可能效率低。
    • @phoog 你能帮我了解更多,因为我对此不太了解。据我所知,当我们使用“+”在内存中连接一个新字符串时,每个“+”的结果将创建即,如果我们使用 3 个“+”,那么我们将在内存中有 4 个字符串,最终字符串将由我们的参考字符串。
    • 但字符串生成器也是如此。您有三个输入字符串和输出字符串,总共有四个字符串。另外,您已经分配了字符串生成器,而 Concat 没有这样做。 Jon Skeet 写过:jonskeet.uk/csharp/stringbuilder.html
    • 是的,谢谢。我得到了一种更有效的技术来连接。但是在字符串生成器的例子中,我将使用 AppendFormat() 方法,它只会给我一行结果。这里阙与多行有关。你能帮我们看看在上述情况下你将如何使用这个 Concat。
    • 我不明白你最后的评论。 AppendFormat 很麻烦。问题中的多行示例更具可读性,因为它更接近实际数据的格式。它有很多行,但它是一个语句。也就是说,它在逻辑上是一个单一的方法调用。要使用 Concat,程序员使用 + 运算符。编译器将其转换为 Concat 方法调用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多