C # String.Format args - PullRequest
       14

C # String.Format args

30 голосов
/ 16 сентября 2009

У меня есть такой массив:

object[] args

и нужно вставить эти аргументы в строку, например:

str = String.Format("Her name is {0} and she's {1} years old", args);

вместо:

str = String.Format("Her name is {0} and she's {1} years old", args[0], args[1]);

ПРИМЕЧАНИЕ: На самом деле первая строка кода сработала! Но args [1] отсутствовал! Извините и спасибо. Очки за каждого:)

Ответы [ 8 ]

76 голосов
/ 16 сентября 2009

Ваш первый пример должен работать нормально, если в аргументах массива есть как минимум два объекта.

object[] args = new object[] { "Alice", 2 };
str = String.Format("Her name is {0} and she's {1} years old", args);
14 голосов
/ 16 сентября 2009

Это должно работать так, как вы хотите. Класс String имеет следующее определение метода Format:

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

Видя, как "args" в вашем примере является массивом объектов, он должен соответствовать прямо.

13 голосов
/ 18 октября 2012

Если вы не знаете, сколько элементов массива содержится в массиве аргументов, попробуйте использовать string.Join ().

string.Format("Arguments passed in to the program are: {0}", string.Join(" ", args));

Конкретно в вашем примере:

string.Format("Her name is {0} years old", string.Join(" and she's ", args));

Лично мне не нравятся жестко запрограммированные структуры объекта массива. Это слишком много, чтобы помнить всюду по приложению и мешает поддерживать. Я бы предпочел превратить аргументы в объект Person с помощью конструктора, который принимает массив, и перегрузить ToString () для отображения конкретной информации о членах объекта.

class Person
{
    private string m_sName;
    private string m_sAge;

    public Person(string[] args)
    {
        m_sName = args[0];
        m_sAge = args[1];
    }

    public override string ToString()
    {
        return string.Format("Her name is {0} and she's {1} years old.", m_sName, m_sAge);
    }
}

Таким образом, вы можете создать объект «Персона» и отобразить сообщение при вызове.

var oNewPerson = new Person(args);
console.WriteLine(oNewPerson.ToString());

Это очень похоже на пример Microsoft:

http://msdn.microsoft.com/en-us/library/ms173154(v=vs.80).aspx

3 голосов
/ 16 сентября 2009

Я не уверен, что вы спрашиваете, но любой из них должен работать, учитывая, что одна из сигнатур для функции String.Format () -

Public Shared Function Format(ByVal format As String, ByVal ParamArray args() As Object) As String

Больше мусора, которое я скопировал из Visual Studio:

Резюме: Заменяет элемент формата в указанной System.String текстовым эквивалентом значения соответствующего экземпляра System.Object в указанном массиве.

Параметры: Формат: составная строка формата. args: массив System.Object, содержащий ноль или более объектов для форматирования.

Возвращаемые значения: Копия формата, в котором элементы формата были заменены эквивалентом System.String соответствующих экземпляров System.Object в аргументах.

Исключения: System.ArgumentNullException: формат или аргументы равны нулю. System.FormatException: неверный формат. -или- Число, указывающее аргумент для форматирования, меньше нуля или больше или равно длине массива args.

- Упс на VB, но вы получите точку.

2 голосов
/ 16 сентября 2009

Оба ваших примера делают одно и то же - String.Format имеет перегрузку, которая принимает объект [] вместо указания каждого аргумента отдельно.

2 голосов
/ 16 сентября 2009
str = String.Format("Her name is {0} and she's {1} years old", args);

Должно работать, когда args относится к типу object [].

1 голос
/ 16 сентября 2009

Вы даже пробовали первую линию? Вы видели, что он должен работать так же, как второй?

1 голос
/ 16 сентября 2009

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

string.Format("Hello {0}, {1} and {2}", new object[] { "World", "Foo", "Bar" });
...