2011-02-03 3 views
3

Я работаю над консольным приложением, которое получает довольно длинный список параметров. Для цели отладки мне нужно распечатать параметры, переданные в выходной файл. Прямо сейчас, я использую следующий код для параметров командной строки concat.Вывести все параметры командной строки

static void Main(string[] args) 
{ 
    string Params = string.Empty; 
    foreach(string arg in args) 
    { 
     Params += arg + ","; 
    } 
} 

Есть ли лучший способ достичь этого?

ответ

2

Вы можете использовать этот кусок кода

String.Join(", ", Environment.GetCommandLineArgs()) 
1

Вы можете использовать string.join ("", арг)

5

насчет

Params = string.Join(",", args); 

Ваш foreach подход не очень производительным. Поскольку строка равна неизменяемой, это означает, что для каждой итерации цикла строка будет выбрасываться для сбора мусора, и будет создана новая строка. В случае string.Join генерируется только одна строка.

Внутри цикла, чтобы обойти такую ​​же производительность, вам придется использовать StringBuilder, но в этом случае на самом деле нет причин не использовать string.Join, так как код будет намного читабельнее.

+0

+1 для объяснения, а не только строки кода. –

+1

+1 - Кроме того, string.Join не оставляет концевую запятую в объединенной строке, как это делает исходный код (я предполагаю, что это хорошо для цели @ cbyte) – Blorgbeard

+0

Я предпочитаю использовать пустой разделитель пробелов, как в исходной строке comman Params = string.Join ("", args); –

0
String params = String.Join(",", args); 
+0

Извините, но это не скомпилируется. * params * - ключевое слово в C#.Вам нужно будет выбрать другое имя для вашей строки :) –

+0

auch, Я просто уменьшаю имя переменной cbyte из-за соглашения :) – lvanzijl

0

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

string.Join(",", args); 

Строго говоря функция регистрации создает StringBuilder с наращиванием strings.Length * 16 (это 16 - фиксированное число). Если у вас разные размеры аргументов и максимальная производительность, используйте StringBuilder с определенной пропускной способностью.

1

Все ответы здесь, в которых объединены аргументы с одной запятой, будут работать, но я нашел, что этот подход недостаточно, потому что нет четкого индикатора «цитируемых аргументов» и тех, которые могут содержать запятую.

Используя пример: Foo.exe an example "is \"fine\", too" okay

Простой присоединиться предложения дадут: an, example, is "fine", too, okay. Неплохо, но не очень понятно и несколько вводить в заблуждение.

Вот что я собрал вместе, что работает достаточно хорошо для меня. Я уверен, что это может быть улучшено.

String.Join(", ", (from a in args select '"' + a.Replace("\"", @"\""") + '"')); 

Он возвращает строку: "an", "example", "is \"fine\", too", "okay". Я думаю, что это делает лучшую работу, указывающую фактические параметры.

0

Получает точные аргументы командной строки, введенные пользователем;

string AppCMDName = Environment.GetCommandLineArgs()[0]; //get fully qualified application name with or without .exe specified 
//Environment.GetCommandLineArgs()[0] does not get surrounding double quotes used to qualify ... 
//cmd line path that may contain spaces, single quotes not allowed 
string commandLine = Environment.CommandLine.Replace(AppCMDName, "").TrimEnd(); 
if (commandLine.StartsWith("\"\"")) 
    commandLine = commandLine.Substring(2, commandLine.Length - 2).TrimStart(); 
    //remove surrounding quotes if used to specify cmd 
Смежные вопросы