使用插值更新字符串
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.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
我有这样的代码:
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.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