在.NET中,替代使用string.Format(".... {0}....{1}....",v1,v2)的方法是什么?

5

string.Format() 的“bla {0} bla”语法非常好用。但有时我不想枚举占位符,而是想按顺序在占位符中映射变量。是否有一个库可以做到这一点?

例如,我想要这样的效果:

string.Format("string1={0}, string2={1}", v1, v2)

这里是一些关于IT技术的内容:

string.Format("string1={*}, string2={*}", v1, v2)

但是如果你这样做,你就不能在多个地方使用同一个变量。你真的想要打十次“Environment.NewLine”吗? - Ed S.
2
也许他在字符串中并没有使用 10 个 Environment.NewLine 的实例。我完全可以看到在某些情况下这可能是可行的选择,甚至是理想的选择。 - Adam Robinson
当然,没问题,我只是在指出这一点。 - Ed S.
这正是我正在寻找的:http://www.codeproject.com/Articles/622309/Extended-string-Format - Nestor
4个回答

15
现在在C# 6.0中有一个称为字符串插值的东西,可以使文本更加清晰易懂。
        var name = "ozzy";
        var x = string.Format("Hello {0}", name);
        var y = $"Hello {name}";

等同于同一件事。

请参见https://msdn.microsoft.com/zh-cn/magazine/dn879355.aspx

另外,您经常需要执行多行字符串,因此只需:

var sql = $@"
 SELECT 
 name, age, gender
 FROM Users
 WHERE UserId = '{userId}'
 ORDER BY age asc";

5
一旦你进行插值,就再也回不去了。 - Doug Clutter

5
这里有一个可能更快的版本,使用Regex.Replace警告:不支持转义{*},当超出范围或未提供足够的参数时也没有好的错误信息!
public static class ExtensionMethods
{
    private static Regex regexFormatSeq = new Regex(@"{\*}", RegexOptions.Compiled);

    public static string FormatSeq(this string format, params object[] args)
    {
        int i = 0;
        return regexFormatSeq.Replace(format, match => args[i++].ToString());
    }
}

1
恭喜您发布了一个真正有效的答案,与那个莫名其妙被接受和投票的错误答案不同。 - Timwi

3
你可以通过编写自己的字符串扩展和 params 关键字来完成此操作,假设你正在使用 .NET 3.5 或更高版本。

编辑:我有点无聊,这段代码有些松散且容易出错,但是将此类放入您的项目中并在必要时使用其命名空间:

public static class StringExtensions
{
    public static string FormatEx(this string s, params string[] parameters)
    {
        Regex r = new Regex(Regex.Escape("{*}"));

        for (int i = 0; i < parameters.Length; i++)
        {
            s = r.Replace(s, parameters[i], 1);
        }

        return s;
    }
}

使用方法:

Console.WriteLine("great new {*} function {*}".FormatEx("one", "two"));

你将失去使用参数格式的能力,例如 string.Format("{*:dddd MMMM}", DateTime.Now)。指定参数编号有什么问题吗? - Michael Baldry
2
你们为什么要在回答中反对这个问题?这就是问题的重点所在。如果你想反对这个问题,请在评论中发表意见。 - Adam Robinson
有时候需要使用 "header{0}var{1}{0}footer" 这样的格式。但是如果变量列表很长且按照替换顺序排列,那么在列表中间添加一个变量就意味着需要重新枚举占位符,这种情况非常麻烦。 - Nestor
“为什么你们在回答中反对这个?” - 我并不反对,我只是指出你在这里失去了一些功能。也许这对你来说没问题,我只是觉得应该提一下。 - Ed S.
1
这有一个错误。我期望 "{}, {}, {}".FormatEx("a", "{}", "b") 输出 "a, {}, b",但你的输出是 "a, b, {}",因为它再次替换了已经被替换的 {*}。下面 Romkyns 的答案可以正常工作。 - Timwi
显示剩余5条评论

0
如果我只是写一系列没有特殊格式的变量,我通常更喜欢将它们连接起来,例如:
Console.WriteLine("string1=" + var1 + " string2=" + var2);

请注意在"string2"前面的空格,以将这两个结果分开。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接