c#如何将变量插入字符串?

问题描述 投票:1回答:6

我想知道在C#中将变量插入字符串的不同方法。

我目前正在尝试将值插入正在构建的json字符串中:

 Random rnd = new Random();
  int ID = rnd.Next(1, 999);
  string body = @"{""currency"":""country"",""gold"":1,""detail"":""detailid-979095986"",""tId"":""help here""}";

如何将“ ID”添加到字符串主体?

c# string
6个回答
3
投票

在典型的字符串插入方案中,我将执行以下操作之一:

string body = string.Format("My ID is {0}", ID);
string body = "My ID is " + ID;

但是,您的字符串显然是JSON序列化的数据。我希望我可以将其解析为一个类以便使用它。

var myObj = JsonConvert.DeserializeObject<MyClass>(someString);
myObj.TID = ID;
// maybe do other things with it, then if I need JSON again...
string body = JsonConvert.SerializeObject(myObj);

采用此方法的一个原因是,确保我输入的任何数据仍然使JSON有效。例如,如果我的ID不是int,而是带有需要转义字符的string,而不是"\"\n\"",那么直接插入concatenating them together将不是正确的选择。


3
投票

有很多方法可以将值注入字符串,但是很容易忘记编码,并导致严重的损坏。

如果只想将值注入另一个字符串,则可以使用:

  • 字符串串联
  • 字符串构建
  • 字符串格式

串联:

最简单和最常见的构建字符串的方法是使用+运算符简单地通过var foo = 5; var bar = "example-" + foo;

string body = @"{""currency"":""country"",""gold"":1,""detail"":""detailid-979095986"",""tId"":""" + ID.ToString() + @"""}";

级联可能很难阅读,这使得引入错误很容易,但是对于大多数简单的任务而言,这是完成任务的正确工具。

在这种情况下,这是一个糟糕的选择:

StringBuilder

字符串构建

StringBuilder类对于构建大型字符串很有用,尤其是在迭代构建时。

var sb = new StringBuilder();
for (var i = 0; i < 1000; i++) {
    sb.Append(i.ToString());
    sb.Append(" ");
}
var output = sb.ToString();

仍然很难阅读和调试,但是对于将许多字符串连接在一起的情况,它非常有效

在这种情况下,这是一个糟糕的选择:

StringBuilder sb = new StringBuilder();
sb.Append(@"{""currency"":""country"",""gold"":1,""detail"":""detailid-979095986"",""tId"":""");
sb.Append(ID.ToString());
sb.Append(@"""}");
string body = sb.ToString();

字符串格式

string.Format方法使将数据模板化为字符串非常容易和高效。如果您计划一遍又一遍地重复使用相同的字符串,那么使用格式字符串可以使读取和调试代码更加容易,特别是在有很多替换的情况下:

string.Format

格式字符串还可以自动将文化上准确的格式应用于特定的数据类型,以便适当地显示var foo = 5; var bar = string.Format("example-{0}", foo); ,或使数字具有适当数量的尾随零。

在这种情况下,这是一个糟糕的选择:

DateTime

正确的选择

您没有将数据转储到任何旧字符串中。那是JSON编码的数据。如果仅以任何旧值连接/构建/格式化,则可以断开字符串。例如,如果string string.Format(@"{""currency"":""country"",""gold"":1,""detail"":""detailid-979095986"",""tId"":""{0}""}", ID); 变量包含ID字符,则将破坏整个JSON数据集。

此外,字符串的长度和必要的引号使它难以阅读,从而难以维护。碰巧需要添加另一个格式化的值时,祝您好运,更改任何现有值或添加新的动态值都会很痛苦。

[而不是编写JSON文字,而是编写一个对象并将其编码为JSON:

"

此代码在数据更改时更容易修改,并且实际上将正确编码您的数据。您也不必担心所有那些烦人的双引号字符。


1
投票

您可以尝试以下方法:

var bodyData =
    new
        {
            currency = "country",
            gold = 1,
            detail = "detailid-979095986",
            tId = ID //here's where you set the ID
        };
var jss = new JavaScriptSerializer();
var body = jss.Serialize(bodyData);

您也可以使用string body = @"{""currency"":""country"",""gold"":1,""detail"":""detailid-979095986"",""tId"":""" + ID + @"""}";

string.Concat

1
投票

string.Concat

string body = string.Concat(@"{""currency"":""country"",""gold"":1,""detail"":""detailid-979095986"",""tId"":""", ID, @"""}");

输出将是“ 我的整数是:123。我的字符串是:一二三。”。

您可以自己尝试使用此样本,String interpolation is the easiest way these days:

$特殊字符将字符串文字标识为插值串。插值字符串是可能包含以下内容的字符串文字插值表达式。当插值字符串解析为结果字符串,带有插值表达式的项目将替换为表达式结果的字符串表示形式。 此功能从C#6开始可用。


0
投票

您可以使用

int myIntValue = 123;
string myStringValue = "one two three";
string interpolatedString = $"my int is: {myIntValue}. My string is: {myStringValue}.";

由于这是over here,因此您可以根据需要使用任意数量的String.Format(@"{""currency"":""country"",""gold"":1,""detail"":""detailid-979095986"",""tId"":""{0}""}", ID)


0
投票

代替在字符串上使用,您可以使用+将字符串连接在一起,这将允许您在生成的字符串之间插入文本。

params object[]
© www.soinside.com 2019 - 2024. All rights reserved.