Строка имеет сколько параметров - PullRequest
9 голосов
/ 28 января 2010

Прежде чем использовать String.Format для форматирования строки в C #, я хотел бы знать, сколько параметров принимает эта строка?

Например, если строка "{0} не совпадает с {1}", я хотел бы знать, что эта строка принимает два параметра Например, если строка «{0} не совпадает с {1} и {2}», строка принимает 3 параметра

Как я могу найти это эффективно?

Ответы [ 3 ]

6 голосов
/ 28 января 2010

String.Format получает строковый аргумент со значением format и массив params object[], который может работать с произвольными элементами большого значения.

Для каждого значения object будет вызван метод .ToString() для разрешения этого шаблона формата

РЕДАКТИРОВАТЬ: Кажется, я неправильно понял ваш вопрос. Если вы хотите узнать, сколько аргументов требуется для вашего формата, вы можете узнать это с помощью регулярного выражения:

string pattern = "{0} {1:00} {{2}}, Failure: {0}{{{1}}}, Failure: {0} ({0})";
int count = Regex.Matches(Regex.Replace(pattern, 
    @"(\{{2}|\}{2})", ""), // removes escaped curly brackets
    @"\{\d+(?:\:?[^}]*)\}").Count; // returns 6

Как отмечалось в комментариях Бенджамин , может быть, вам нужно знать количество различных ссылок. Если вы не используете Linq, вы идете:

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

Это также адрес @ 280Z28 последняя обнаруженная проблема.

Редактировать с помощью 280Z28: это не подтвердит ввод, но для любого действительного ввода даст правильный ответ:

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;
1 голос
/ 29 января 2010

Я полагаюсь на ReSharper, чтобы проанализировать это для меня, и очень жаль, что Visual Studio не поставляется с такой удобной функцией.

1 голос
/ 28 января 2010

Вам нужно будет проанализировать строку и найти наибольшее целочисленное значение между {} 's ... затем добавить единицу.

... или посчитайте количество наборов {}.

В любом случае, это ужасно. Мне было бы интересно узнать, почему вы должны иметь возможность вычислить это число программно.

EDIT

Как упоминалось в 280Z28, вам придется учитывать различные особенности того, что может быть включено между {} (несколько {}, строки форматирования и т. Д.).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...