【问题标题】:How do I interpolate strings?如何插入字符串?
【发布时间】:2012-02-19 22:59:11
【问题描述】:

我想在 C# 中执行以下操作(来自 Python 背景):

strVar = "stack"
mystr  = "This is %soverflow" % (strVar)

如何将字符串内的标记替换为字符串外的值?

【问题讨论】:

    标签: c# string string-interpolation


    【解决方案1】:

    这是从 C# 6.0 (Visual Studio 2015+) 开始添加的。

    示例:

    var planetName = "Bob";
    var myName = "Ford"; 
    var formattedStr = $"Hello planet {planetName}, my name is {myName}!";
    // formattedStr should be "Hello planet Bob, my name is Ford!"
    

    这是语法糖:

    var formattedStr = String.Format("Hello planet {0}, my name is {1}!", planetName, myName);
    

    其他资源:

    String Interpolation for C# (v2) Discussion

    C# 6.0 Language Preview

    【讨论】:

    • 单声道补丁(日期为 2009 年,您的里程可能会有所不同)tirania.org/blog/archive/2009/Dec-20.html
    • 这个功能真是太棒了。尤其是在 VS2015 和编辑器支持下,您可以清楚地看到插值字符串并获得智能感知。它甚至适用于方法! $("This feature is {GetDescription(FEATURE_AMAZING))}");
    【解决方案2】:
    string mystr = string.Format("This is {0}overflow", strVar);
    

    您也可以使用named parameters 代替索引。

    【讨论】:

      【解决方案3】:

      您可以使用string.Format 将值放入字符串中:

      private static readonly string formatString = "This is {0}overflow";
      ...
      var strVar = "stack";
      var myStr = string.Format(formatString, "stack");
      

      另一种方法是使用 C# 连接运算符:

      var strVar = "stack";
      var myStr = "This is " + strVar + "overflow";
      

      如果您要进行大量连接,请使用更高效的 StringBuilder 类:

      var strVar = "stack";
      var stringBuilder = new StringBuilder("This is ");
      for (;;)
      {
          stringBuilder.Append(strVar); // spot the deliberate mistake ;-)
      }
      stringBuilder.Append("overflow");
      var myStr = stringBuilder.ToString();
      

      【讨论】:

        【解决方案4】:

        如果您当前使用带有 C# 6.0 的 Visual Studio 2015,请尝试以下操作:

        var strVar = "stack";
        
        string str = $"This is {strVar} OverFlow";
        

        该功能称为字符串插值。

        【讨论】:

          【解决方案5】:

          C# 6.0

          string mystr = $"This is {strVar}overflow";
          

          【讨论】:

            【解决方案6】:

            没有运算符。您需要使用string.Format

            string strVar = "stack";
            string mystr  = string.Format("This is {0}soverflow", strVar);
            

            很遗憾string.Format是一个静态方法,所以不能简单的写成"This is {0}soverflow".Format(strVar)。有些人已经定义了一个扩展方法,它允许这种语法。

            【讨论】:

              【解决方案7】:

              使用string.Format:

              string mystr = string.Format("This is {0}overflow", "stack");
              

              【讨论】:

                【解决方案8】:

                您应该使用String.Format()。语法有点不同,使用的是数字占位符。

                例子:

                String.Format("item {0}, item {1}", "one", "two")
                

                查看http://msdn.microsoft.com/en-us/library/system.string.format.aspx了解更多详情。

                【讨论】:

                  【解决方案9】:

                  您有 2 个选项。您可以使用 String.Format 也可以使用连接运算符。

                  String newString = String.Format("I inserted this string {0} into this one", oldstring);
                  

                  String newString = "I inserted this string " + oldstring + " into this one";
                  

                  【讨论】:

                  • 在幕后String.Format() 使用StringBuilder。 StringBuilder 在连接大量字符串时通常更有效,但连接运算符非常适合一次性使用。 String.Format() 在需要将格式应用于输出时很有用,例如为数值添加填充或前导零。所以在循环中使用String.Format() 可能会实例化很多StringBuilders。在这种情况下,最好使用在循环外声明的单个 StringBuilder 并在循环内使用 AppendFormat()
                  【解决方案10】:

                  用途:

                  strVar = "stack"
                  mystr  = String.Format("This is {0}", strVar);
                  

                  【讨论】:

                    【解决方案11】:

                    您可以使用 Expansive 完成此操作:https://github.com/anderly/Expansive

                    【讨论】:

                    • C# 有一个内置的插值机制。绝对没有理由为此功能包含一个库。
                    • @Displayname 看问题上的日期。 C# 并不总是有内置的字符串插值。它于 2016 年在 C# 6 中添加。因此,我在 2014 年回答的原因。
                    【解决方案12】:

                    还有另一种使用 string.Replace 实现占位符的方法,奇怪的是在某些情况下会有所帮助:

                    mystr = mystr.Replace("%soverflow", strVar);
                    

                    【讨论】:

                      【解决方案13】:

                      您可以使用以下方式

                      字符串插值

                      $ 特殊字符将字符串文字标识为内插字符串。例如

                      string name = "Mark";
                      string surname = "D'souza";
                      WriteLine($"Name :{name} Surname :{surname}" );//Name :Mark Surname :D'souza  
                      

                      内插字符串是可能包含内插表达式的字符串文字。当内插字符串解析为结果字符串时,具有内插表达式的项目将替换为表达式结果的字符串表示形式。

                      字符串格式

                      如果需要将对象、变量或表达式的值插入另一个字符串,请使用 String.Format。例如

                      WriteLine(String.Format("Name: {0}, Surname : {1}", name, surname));
                      

                      【讨论】:

                        【解决方案14】:

                        基本示例

                                var name = "Vikas";
                                Console.WriteLine($"My name is {name}");
                        

                        添加特殊字符

                        string name = "John";
                        Console.WriteLine($"Hello, \"are you {name}?\", but not the terminator movie one :-{{");
                        //output-Hello, "are you John?", but not the terminator movie one :-{
                        

                        不仅仅是用值替换token,你可以在C#中使用字符串插值做更多的事情

                        评估表达式

                        Console.WriteLine($"The greater one is: { Math.Max(10, 20) }");
                        //output - The greater one is: 20
                        

                        方法调用

                            static void Main(string[] args)
                            {
                                Console.WriteLine($"The 5*5  is {MultipleByItSelf(5)}");
                            }
                          
                            static int MultipleByItSelf(int num)
                            {           
                                return num * num;
                            }
                        

                        来源:String Interpolation in C# with examples

                        【讨论】:

                          【解决方案15】:

                          您可以使用美元符号和大括号。

                          Console.WriteLine($"Hello, {name}! Today is {date.DayOfWeek}, it's {date:HH:mm} now.");
                          

                          参见文档here

                          【讨论】:

                            猜你喜欢
                            • 2014-05-12
                            • 2019-12-18
                            • 1970-01-01
                            • 2012-05-17
                            • 1970-01-01
                            • 2012-10-26
                            • 1970-01-01
                            • 2019-02-08
                            相关资源
                            最近更新 更多