使用"@"符号将变量连接成字符串

3

考虑到这个多行字符串:

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""
                }
            ";

1
使用 JSON 库!!!那些双引号太难看了,我想不出任何好的理由。 - Joe Phillips
@JoePhilllips 你会推荐哪个?我想我需要将那整个字符串转换成一个对象,然后传递给一个JSON库? - FastTrack
Newtonsoft JSON 是 C# 中常用的库。你甚至可以创建一个匿名对象并使用它。非常简单,能够大大简化你的代码。 - Joe Phillips
2个回答

5
在下一个字符串文字的开头附加另一个@字符。
...
""npi"":""" + strTest + @"""
""name"": ""DME Clearinghouse"",
...

1

对于字符串拼接,应该使用 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();

注意:我没有在字符串中多次使用这些 '"',所以对此不确定,但是应该使用 StringBuilder 来附加变量。
希望这能帮助您实现您的目标。

只有在循环内部连接字符串时才是真的。对于连接一堆字符串字面量和变量的单个语句,编译器会发出一个调用非常高效的框架Concat方法的指令。对于这种情况,StringBuilder过于冗长、笨重且难以阅读,甚至可能不如原来的方法高效。 - phoog
@phoog,你能帮我更深入地了解这个吗?我对此并不是很清楚。据我所知,当我们使用“+”在内存中连接一个新字符串时,每个“+”的结果都会创建一个新的字符串,即如果我们使用了3个“+”,那么我们将在内存中有4个字符串,并且最终的字符串将由我们的引用字符串指向。 - Kamaldeep singh Bhatia
但是字符串构建器也是如此。您有三个输入字符串和一个输出字符串,总共四个字符串。此外,您已经分配了字符串构建器,而Concat不会这样做。Jon Skeet已经写过这个问题:http://jonskeet.uk/csharp/stringbuilder.html - phoog
我不理解你上次的评论。AppendFormat很繁琐。问题中的多行示例更易读,因为它更接近实际数据的格式。它有很多行,但它是一个语句。也就是说,它在逻辑上是一个单一的方法调用。要使用Concat,程序员使用+运算符。编译器将其转换为Concat方法调用。 - phoog
操作应该只是使用一个JSON库,所以这个对话有点哲学意味。特别是考虑到字符串很小,无论你做什么,性能提升都将是微不足道的。 - Joe Phillips
显示剩余2条评论

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