c#将变量插入到字符串中

时间:2014-04-04 17:47:34

标签: c# string

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

我怎么能在“帮助这里”中将“ID”添加到字符串主体 所以它可以生成随机数!

6 个答案:

答案 0 :(得分: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\""将不是正确的做法。

答案 1 :(得分:3)

有很多方法可以将值注入字符串中,但是很容易忽略编码,导致严重破坏。

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

  • 字符串连接
  • 字符串构建
  • 字符串格式化

级联:

构建字符串的最简单和最常用的方法是使用+运算符concatenating them together

var foo = 5;
var bar = "example-" + foo;

连接可能很难阅读,因此很容易引入错误,但对于大多数简单的任务来说,这是正确的工具。

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

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

字符串构建

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方法使模板数据成为一个超级简单有效的字符串。如果计划反复重复使用相同的字符串,使用格式字符串可以更容易地读取和调试代码,特别是在有大量替换时:

var foo = 5;
var bar = string.Format("example-{0}", foo);

格式字符串还可以自动将文化上准确的格式应用于特定数据类型,以便正确显示DateTime,或者使数字具有适当数量的尾随零。

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

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

正确的选择

您没有将数据转储到任何旧字符串中。这是JSON编码的数据。如果你只是连接/构建/格式化任何旧值,你可以打破你的字符串。例如,如果ID变量包含"个字符,则会破坏整个JSON数据集。

此外,字符串的长度和必要的引号使其难以阅读,这使得难以维护。祝你好运,当你需要添加另一个格式化的值时,改变任何现有值或添加新的动态值都会很痛苦。

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

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);

当数据发生变化时,此代码更容易修改,并且实际上会正确编码数据。您不必再担心所有那些烦人的双引号字符。

答案 2 :(得分:1)

你可以试试这个:

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

您还可以使用string.Concat

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

答案 3 :(得分:1)

String interpolation is the easiest way these days:

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

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

您可以over here自己尝试该示例。

  

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

答案 4 :(得分:0)

您可以使用

String.Format(@"{""currency"":""country"",""gold"":1,""detail"":""detailid-979095986"",""tId"":""{0}""}", ID)

由于这是params object[],您可以根据需要使用尽可能多的{n}

答案 5 :(得分:0)

您可以使用+将字符串连接在一起,而不是在字符串上使用,这样就可以在生成的字符串之间插入文本。

string body = @"***" + ID + @"***";