String.Format - проблема со списком аргументов - PullRequest
2 голосов
/ 27 мая 2011
string nr = "42245555" //just an example number
string expression = "{5}{6}/{7}{8}";

string res = String.Format(expression, new string[] {
nr[0].ToString(),nr[1].ToString(),
nr[2].ToString(), nr[3].ToString(), 
nr[4].ToString(), nr[5].ToString(), 
nr[6].ToString(), nr[7].ToString() 
});

Почему это не работает и как я могу это решить? Я хочу, чтобы выражение было либо "{5}{6}/{7}{8}" or "{0}{3}/{7}{1}", либо тем, что хочет пользователь.

Ответы [ 6 ]

8 голосов
/ 27 мая 2011

Вы должны предоставить по крайней мере то же количество параметров (или массив, по крайней мере, с таким же количеством элементов), что и наибольшее значение заполнителя плюс один (значения заполнителя нумеруются нулями)

Максимальное значение заполнителя {3}, необходимо указать как минимум четыре дополнительных параметра.

Попробуйте это:

string res = String.Format(expression,
  nr[0], nr[1],
  nr[2], nr[3], 
  nr[4], nr[5], 
  nr[6], nr[7]);

Обратите внимание, что я вынул новую строку [] {...} Я также вынул все ToString(), потому что они не обязательны.

5 голосов
/ 27 мая 2011

Соответствующая перегрузка Format:

public static string Format(string format,  params Object[] args)

Это означает, что вы можете назвать его так:

Format("...",new object[]{...})//Each array element is used

Или с объектами непосредственно в качестве параметров:

Format("...",object1, object2,...)//the objects are used

В отличие от того, что я первоначально думал, string[] действительно входит в первый вариант этого кода.Это связано с ковариацией массива в C # /. Net , который позволяет неявно преобразовывать string[] в object[].

string.Format("{0} {1}",new string[]{"A","B"})

отпечатков A B.

С другой стороны, если вы попробуете подобный код с int[], он не будет работать:

string.Format("{0} {1}",new int[]{1,2})

Будет сгенерировано исключение, потому что оно входит во второй вариант, и, следовательно, только в один параметртипа int[] виден string.Format.Это различие заключается в том, что ковариация массива работает только для массивов с элементами, которые имеют тип reference , например string, а не тип value , например int.Это означает, что int[] не может быть неявно преобразовано в object[].

Так что проблема с вашим исходным кодом, вероятно, заключается просто в том, что вы использовали индекс {8}, который находится вне диапазона.

3 голосов
/ 27 мая 2011

Параметры в выражении должны начинаться с "{0}", а array должен содержать то же количество параметров, что и выражение, и это должен быть массив объектов: new object[]{...

2 голосов
/ 27 мая 2011
  • Ваши параметры пронумерованы 0..7, легко читаются назад. Тем не менее вы используете {8}: индекс вне диапазона
  • Вам не нужно new string[] { } вокруг параметров. Это разрешено, хотя.
  • без new string[] { } вам также не нужны вызовы .ToString().
0 голосов
/ 27 мая 2011

Если ваш пользователь хочет {5} {6} / {7} {8}, тогда ваш код будет:

String.Format("{0}{1}/{2}{3}",nr[4],nr[5],nr[6],nr[7]);

Ваши индексы в выражении всегда должны начинаться с 0 .. В моем примере, если вы хотите отобразить это для строк ... вы начинаете с 0,1,2,3 .. 0 для nr [4], 1 для nr [5], 2 для nr [6], 3 для nr [7] и т. Д.

0 голосов
/ 27 мая 2011

Вы должны использовать:

nr.Substring(...)

в выражении String.Format ([выражение], [значения]) представляет собой строку, представляющую строку с заполнителями, в то время как значения вставляются в эти заполнители.

обновлен

string nr = "42245555" //just an example number   


string res = String.Format("{0}{1}/{2}{3}", new string[] {
nr[5].ToString(),nr[6].ToString(),
nr[7].ToString(), nr[8].ToString()
});

или

string res = String.Format("{0}{1}/{2}{3}", new string[] {
nr[0].ToString(),nr[3].ToString(),
nr[7].ToString(), nr[1].ToString()
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...