Вопрос: Есть ли способ отформатировать пустое пространство, как это в C #? - PullRequest
0 голосов
/ 20 ноября 2018

Есть ли способ отформатировать пустое пространство, как это в C #?

Я хотел бы знать, можете ли вы разобрать строковые массивы в метод и получить его, чтобы он возвращал вамотформатированная строка с пробелами, есть определенный способ, которым мне нужно это сделать, так что вот пример:

string[][] StringArray = new string[][] {
    new string[] {"Name:", "John Jones."}
    new string[] {"Date of birth:", "07/11/1989."}
    new string[] {"Age:", "29 Years old."}
};

FormatWhiteSpace(StringArray, Padding: 5);

Вывод будет:

Name:              John Jones.
Date of birth:     07/11/1989.
Age:               29 Years old.

Как вы видите выше в выводе, все выстроено в линию и с 5 пробелами для заполнения, как было определено, когда мы вызывали метод.Это именно то, что мы хотим.Также у нас есть двумерный массив, потому что это позволяет нам анализировать более 1 строки одновременно. Вот еще один пример, на этот раз с более чем двумя столбцами:

string[][] StringArray = new string[][] {
    new string[] {"Name:", "John", "Jones."}
    new string[] {"Date of birth:", "Monday,", "07/11/1989."}
    new string[] {"Age:", "29", "Years old."}
};

FormatWhiteSpace(StringArray, Padding: 2);

Второй Выход будет:

Name:           John     Jones.
Date of birth:  Monday,  07/11/1989.
Age:            29       Years old.

Это все, что я хотел бы знать, если вы знаете что-нибудь, что может мне помочь, пожалуйста, дайте мне знать.Спасибо за вашу помощь, вы, ребята, действительно сделали мой день.

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Мне лично нравится использовать Linq, он также работает с любым количеством столбцов и рассчитывает расстояние, необходимое для каждого столбца.

void Main()
{
    string[][] StringArray = new string[][] {
    new [] {"Name:", "John", "Jones."},
    new [] {"Date of birth:", "Monday,", "07/11/1989."},
    new [] {"Age:", "29", "Years old."}};

    var lines = FormatWhiteSpace(StringArray, Padding: 2);

    foreach (var line in lines)
    {
        Console.WriteLine(line);
    }
}

private IEnumerable<string> FormatWhiteSpace(string[][] StringArray, int Padding)
{
    var maxLengthDict = StringArray
        .Select(sa => sa.Select((s, i) => new { Column = i, MaxLength = s.Length }))        
        .SelectMany(x => x)
        .GroupBy(x => x.Column)
        .Select(x => new {Column = x.Key, MaxLength = x.Max(y => y.MaxLength)})
        .ToDictionary(x => x.Column, x => x.MaxLength);

    return StringArray
        .Select(sa => string.Concat(sa.Select((s, i) => s.PadRight(maxLengthDict[i] + Padding))));
}
0 голосов
/ 21 ноября 2018

Попробуйте что-то вроде этого (я добавил дополнительную строку к вашим данным, чтобы они не были квадратными, а отладка стала более очевидной):

public static class PaddedColumns
{
    private static string[][] _stringArray = new string[][] {
        new [] {"Name:", "John", "Jones."},
        new [] {"Date of birth:", "Monday,", "07/11/1989."},
        new [] {"Age:", "29", "Years old."},
        new [] {"Eye Color:", "blue", ""},
    };

    public static void PadIt()
    {
        OutputPadded(_stringArray);
    }

    public static void OutputPadded(string[][] strings)
    {
        var columnMaxes = new int[strings[0].Length];

        foreach (var row in strings)
        {
            for (var colNo = 0; colNo < row.Length; ++colNo)
            {
                if (row[colNo].Length > columnMaxes[colNo])
                {
                    columnMaxes[colNo] = row[colNo].Length;
                }
            }
        }

        const int extraPadding = 2;

        //got the maxes, now go through and use them to pad things
        foreach (var row in strings)
        {
            for (var colNo = 0; colNo < row.Length; ++colNo)
            {
                Console.Write(row[colNo].PadRight(columnMaxes[colNo] + extraPadding));
            }
            Console.WriteLine("");
        }

    }

}

Результат выглядит следующим образом:

Name:           John     Jones.
Date of birth:  Monday,  07/11/1989.
Age:            29       Years old.
Eye Color:      blue
...