使用插值更新字符串

Update string with interpolation for each using

我有这样的代码:

int i = 1;
string dynemicString = $"i = {i}";

while(i<10)
{
    Console.WriteLine(i);
    i++;
}

我想得到这样的结果:

i = 1
i = 2
i = 3

...

怎么做?

int i = 1;

while(i<10)
{
    Console.WriteLine($"i = {i}");
    i++;
}

有关 String Interpolation

的更多信息

如果您想要一种更标记化的方式来执行此操作,请使用 String.Format

int i = 1;
string dynemicString = "i = {0}";

while(i<10)
{
    Console.WriteLine(string.Format(dynemicString,i));
    i++;
}

这是 TheGeneral 回答的另一种方法。我并不是建议 使用 它,但我发现它是一个 "interesting" 的想法,只是为了更多地了解字符串插值的工作原理。

当内插字符串文字转换为 string 时,将立即计算所有表达式并格式化字符串。字符串之后不能更改。

当内插字符串文字转换为 FormattableString 时,会计算表达式,但不会执行字符串格式化。相反,所有表达式的结果都被存储以供以后格式化。每次在 FormattableString 上调用 ToString 时,都会再次执行格式化。

因此,当字符串格式化时,我们可以通过使用相同的值(最初评估的值)return 不同的字符串来使其动态化。一种简单但非常丑陋的方法是使用委托来捕获 i,然后将委托放在覆盖 ToString 的包装器中并每次都执行委托。这是一个完整的例子:

// CODE FOR EDUCATIONAL PURPOSES ONLY. DON'T USE IN PRODUCTION!
using System;

public class FuncWrapper
{
    private readonly Func<string> func;

    public FuncWrapper(Func<string> func) =>
        this.func = func;

    public override string ToString() => func();
}

class Test
{
    static void Main()
    {
        int i = 1;
        // Capture i in a delegate; each time the delegate
        // is executed, you'll get a different value. Each
        // time ToString is called, the delegate will be called
        var wrapper = new FuncWrapper(() => i.ToString());

        FormattableString dynamicString = $"i = {wrapper}";
        while (i < 10)
        {
            Console.WriteLine(dynamicString);
            i++;
        }
    }
}

输出:

i = 1
i = 2
i = 3
i = 4
i = 5
i = 6
i = 7
i = 8
i = 9