【问题标题】:Question: Is There A Way To Format White-space Like This In C#?问题:有没有办法在 C# 中像这样格式化空白?
【发布时间】:2018-11-20 20:49:25
【问题描述】:

有没有办法在 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.

如果您知道任何可以提供帮助的信息,我只想知道这些 请告诉我。谢谢你的帮助,你们真的让我 天。

【问题讨论】:

  • 如果您询问是否有内置的方法来执行此操作,那么答案是否定的,但您显然可以编写符合您要求的代码; string.PadRight 看起来是个不错的起点。
  • 我在问是否有人知道如何。我想要一种内置的方式,但如果没有,那么我在问是否有人可以创建代码或指导我创建它。并感谢您的建议。
  • 这里不是人们为你写代码的地方。在这里,您可以询问代码中您不知道如何解决的特定问题。
  • 通过主(行)数组进行两次传递。在第一次通过时,创建第二个集合,该集合由每列的最大宽度组成。在第二次通过时,输出使用有关其所在列的最大宽度的信息填充的每个字符串(加上一些额外的)。

标签: c# formatting whitespace


【解决方案1】:

我个人喜欢使用 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))));
}

【讨论】:

    【解决方案2】:

    尝试这样的事情(我在您的数据中添加了一个额外的行以使其不是正方形并使调试更加明显):

    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
    

    【讨论】:

    • 需要注意的一点是@carloBos 和我的解决方案使用相同的算法,只是使用了两种完全不同的实现。如果您不打算使用 LINQ,并且想要返回完全形成的行的集合(就像 @CarloBos 一样),请考虑使用 StringBuilder 而不是使用直接的字符串连接。我还没有找到使用 StringBuilders 和 LINQ 连接事物的好方法。
    猜你喜欢
    • 2012-06-12
    • 2020-04-09
    • 1970-01-01
    • 2021-05-18
    • 2021-10-26
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    • 2021-09-24
    相关资源
    最近更新 更多