Форматированный консольный вывод С#

147
07 июня 2019, 16:40

Имеется n строк и n чисел. Нужно вывести их так, чтобы числа начинались с одинаковой позиции в строке:

первый         1
второе число   2
три            3

Подскажите, пожалуйста, как это сделать?

Answer 1
string[] strings = { "первый", "второе число", "три" };
int[] ints = { 1, 2, 3 };
// Используем LINQ, что парится-то с циклами лишними.
// Считать длину строки в любом случае нужно.
int maxlength = strings.Max(x => x.Length);
for (int i = 0; i < strings.Length; i++)
   Console.WriteLine($"{strings[i].PadRight(maxlength, ' ')} {ints[i]}");

Вывод можно и другими способами делать:

for (int i = 0; i < strings.Length; i++)
    Console.WriteLine($"{{0,-{maxlength}}} {{1}}", strings[i], ints[i]);

или

for (int i = 0; i < strings.Length; i++)
    Console.WriteLine("{0,-" + maxlength + "} {1}", strings[i], ints[i]);

или

for (int i = 0; i < strings.Length; i++)
    Console.WriteLine(string.Join(" ", strings[i].PadRight(maxlength, ' '), ints[i]));

Наверняка, можно ещё придумать кучу разных способов.

Answer 2
        Console.WriteLine("Введите строки через знак \".\"");
        string [] strings = Console.ReadLine().Split('.');
        int maxlen = 0, index = 0;
        for (int i = 0; i < strings.Length; i++)
        {
            if (strings[i].Length > maxlen)
            {
                maxlen = strings [i].Length;
                index = i;
            }
        }
        string temp;
        foreach (string item in strings)
        {
            if (item == strings [index])
            {
                Console.WriteLine($"{item} {strings.ToList().IndexOf(item) + 1}");
            }
            else
            {
                temp = item;
                do
                {
                    temp +=" ";
                } while (temp.Length != strings[index].Length+1);
                Console.WriteLine($"{temp}{strings.ToList().IndexOf(item) + 1}");
            }
            temp = "";
        }
        Console.ReadKey();

Вот как-то так. Получаем все строки с разделителем в виде точки. Потом мы находим самое длинное слово, и записываем его индекс в переменную. Потом в цикле мы выводя строки и их индексы в консоль, мы проверяем самое длинное это слово, и если да, выводим его с 1 пробелом, а если нет, то добавляем пробелы пока длина не совпадёт. Думаю в качестве примера подойдёт.

Источник кода по поиску самого длинного слова: http://www.cyberforum.ru/csharp-beginners/thread148624.html

Answer 3

Для форматирования (выравнивания реже), используется, как правило string.Format.

static void Main() {
   Console.WriteLine(string.Format("{0,-20} {1,-10}", "первый",1));
   Console.WriteLine(string.Format("{0,-20} {1,-10}", "второе число",2));
   Console.WriteLine(string.Format("{0,-20} {1,-10}", "третье",3));
   // Можно упростить, но цель, показать что string.Format работает
   Console.WriteLine("{0,-20} {1,-10}", "первый",1);
  }

Ещё... есть вариант string.Format($"{a,10}") и Console.WriteLine($"{a,10}")

Как правило, место для выравнивание резервируется заранее. При превышении знаков - место не сохраняется.

  • string.Format("{0,-20}" - выранивание на 20 слева
  • string.Format("{0,-20}" - выранивание на 20 справа
  • string.Format("{1,-20:0.00}" - форматирование плюс выравнивание

Ещё ссылки

  • источник http://www.cyberforum.ru/csharp-net/thread65552.html
  • enSO http://stackoverflow.com/questions/4449021/how-can-i-align-text-in-columns-using-console-writeline
  • MSDN http://docs.microsoft.com/ru-ru/dotnet/standard/base-types/composite-formatting

P.S. Есть и другие способы форматирования, не буду их рассматривать подробно. Отмечу разве что String.PadLeft и String.PadRight эти ф-ции можно встроить в цикл, или лямду.

READ ALSO
C# WPF XAML DataGrid ColumnHeaderStyle с GridSplitter

C# WPF XAML DataGrid ColumnHeaderStyle с GridSplitter

Написал свой стиль для DataGridColumnHeader, но теперь нет возможности изменять длину столбцовКак сделать реализацию изменения длины столбцов?

114
Почему метод &#171;продолжает&#187; работать после return?

Почему метод «продолжает» работать после return?

У меня естьnet core проект, есть экшен который защищен reCaptcha

121