更新每个使用插值的字符串

时间:2018-06-17 08:18:28

标签: c# string interpolation

我有这样的代码:

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

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

我希望得到这样的结果:

i = 1
i = 2
i = 3

...

怎么做?

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

这是TheGeneral答案的替代方法。我并不是建议使用它,但我发现这只是一个“有趣”的想法,只是为了更多地了解字符串插值的工作原理。

当插值的字符串文字转换为string时,会立即评估所有表达式并格式化字符串。之后字符串不能改变。

当插值字符串文字转换为FormattableString时,将计算表达式,但不执行字符串格式设置。而是存储所有表达式的结果以供稍后格式化。每次在ToString上致电FormattableString时,都会再次执行格式化。

因此,我们可以通过使相同的值(最初评估)在字符串格式化时返回不同的字符串来使其动态化。一个简单但非常难看的方法是使用委托捕获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