String有多少个参数

时间:2010-01-28 17:23:47

标签: c# string parameters format

在使用String.Format格式化C#中的字符串之前,我想知道该字符串接受了多少个参数?

例如。如果字符串是“{0}与{1}不同”,我想知道该字符串接受两个参数 例如。如果字符串是“{0}与{1}和{2}不同”,则该字符串接受3个参数

如何有效地找到这个?

3 个答案:

答案 0 :(得分:6)

String.Format接收带有format值的字符串参数和params object[]数组,它可以处理任意大值项。

对于每个object值,将调用.ToString()方法来解析该格式模式

编辑:似乎我误解了您的问题。如果您想知道格式需要多少个参数,可以使用正则表达式来发现:

string pattern = "{0} {1:00} {{2}}, Failure: {0}{int count = Regex.Matches(Regex.Replace(pattern, 
    @"(\{{2}|\}{2})", ""), // removes escaped curly brackets
    @"\{(\d+)(?:\:?[^}]*)\}").OfType<Match>()
    .SelectMany(match => match.Groups.OfType<Group>().Skip(1))
    .Select(index => Int32.Parse(index.Value))
    .Max() + 1; // returns 2
}, Failure: {0} ({0})";
int count = Regex.Matches(Regex.Replace(pattern, 
    @"(\{{2}|\}{2})", ""), // removes escaped curly brackets
    @"\{\d+(?:\:?[^}]*)\}").Count; // returns 6

正如评论中提到的Benjamin,您可能需要了解不同引用的数量。如果您不使用Linq,请转到:

int count2 =
    Regex.Matches(
        pattern.Replace("{{", string.Empty),
        @"\{(\d+)")
    .OfType<Match>()
    .Select(match => int.Parse(match.Groups[1].Value))
    .Union(Enumerable.Repeat(-1, 1))
    .Max() + 1;

这也解决了发现的最后一个问题@ 280Z28

编辑280Z28:这不会验证输入,但是对于任何有效的输入都会给出正确的答案:

{{1}}

答案 1 :(得分:1)

您必须解析字符串并找到{}之间的最高整数值...然后添加一个。

...或计算{}的数量。

无论哪种方式,它都很难看。我有兴趣知道为什么你需要能够以编程方式找出这个数字。

修改

正如280Z28所述,您必须考虑{}之间(多个{}),格式化字符串等之间可能包含的各种特性。

答案 2 :(得分:1)

我依靠ReSharper为我分析这一点,很遗憾Visual Studio没有提供如此简洁的功能。