Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# net中string.Format(";…{0}..{1}..";,v1,v2)的替代方案?_C#_String - Fatal编程技术网

C# net中string.Format(";…{0}..{1}..";,v1,v2)的替代方案?

C# net中string.Format(";…{0}..{1}..";,v1,v2)的替代方案?,c#,string,C#,String,Format()及其“bla{0}bla”语法非常好。但有时我不想列举占位符。相反,我只想在占位符中按顺序映射变量。有图书馆能做到这一点吗 例如,而不是 string.Format("string1={0}, string2={1}", v1, v2) 差不多 string.Format("string1={*}, string2={*}", v1, v2) 假设您使用的是.NET3.5或更高版本,您可以通过编写自己的字符串扩展名并结合params关键字来实现这一点 Edit:觉得无聊,代码

Format()及其“bla{0}bla”语法非常好。但有时我不想列举占位符。相反,我只想在占位符中按顺序映射变量。有图书馆能做到这一点吗

例如,而不是

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

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

假设您使用的是.NET3.5或更高版本,您可以通过编写自己的字符串扩展名并结合params关键字来实现这一点

Edit:觉得无聊,代码粗疏且容易出错,但请将此类放在项目中,并在必要时使用其命名空间:

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("string1=" + var1 + " string2=" + var2);

注意“string2”前面的前导空格,以分隔两个结果。

这里有一个可能更快的版本,使用
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());
    }
}

在C#6.0中现在有一种叫做字符串插值的东西

        var name = "ozzy";
        var x = string.Format("Hello {0}", name);
        var y = $"Hello {name}";
等同于同一事物

仅添加一点,您通常需要执行多行字符串,以便:

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

当然,现在我不能在多个地方使用同一个变量。这比为每个参数运行一次“Regex.Replace”要好得多——请参阅我的答案。而且您将失去使用参数格式的能力,例如string.Format(“{*:dddddd MMMM}”,DateTime.now)。指定参数号有什么问题?为什么你们在回答中反对这个?这就是问题的重点。如果你想反对这个问题,那么就在那里发表评论。这是错误的。我希望“{},{},{}.FormatEx”(“a“,“{}”,“b”)输出“a,{},b”,但您的输出“a,b,{}”,因为它再次替换了被替换的{*}。Romkyns下面的答案是正确的,但是如果你这样做了,你就不能在多个地方使用同一个变量。你真的想输入10次“Environment.NewLine”吗?也许他没有在字符串中使用10个
Environment.NewLine
。我当然可以看到这种情况下,这可能是一个可行的选择,甚至是可取的。当然,这很好,我只是指出了它。这正是我想要的:祝贺你发布了一个真正有效的答案,而不是令人费解地被接受并投票通过的破碎答案。一旦你插入,你就再也不会回去了。
var sql = $@"
 SELECT 
 name, age, gender
 FROM Users
 WHERE UserId = '{userId}'
 ORDER BY age asc";