对齐列中的单词
Align words in column
我是 C# 的新手,所以我接到了一项任务,要对齐列中的单词。
所以基本上我有一个带有文本的记事本,例如:
wordone word two... wordmillion
假设有 6 行。我需要按顺序设置它们,这样它看起来像:
word one word two word three
wordjosdjfjfisio anotherword otherword
每个其他单词都会从如图所示的位置开始(第一列中最长单词的额外 space 等)我尽可能清楚地解释,任何 tips/ideas怎么办?我认为 padright 是解决方案?
P.S。对不起,如果布局有误,我对这个社区还很陌生。
您可以在Console.Writeline()中使用\t(制表符);
示例
Console.WriteLine("word one\t\tword two\t\tword three");
Console.WriteLine("wordjosdjfjfisio\tanotherword\totherword");
看来您走对了!
首先,这里是PadRight的文档:https://msdn.microsoft.com/en-us/library/36f2hz3a%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396。
从这个 MSDN 解释中,我们可以看到以下有用的示例:
string str = "forty-two";
char pad = '.';
Console.WriteLine(str.PadRight(15, pad)); // Displays "forty-two......".
Console.WriteLine(str.PadRight(2, pad)); // Displays "forty-two".
因此,您的答案的伪代码算法可能如下 - 如果您需要更多解释,请告诉我:
- 将文件中的所有单词读入字符串数组
- 找到最长单词的长度,我们称之为 maxLength
- 遍历所有单词并将它们格式化为table。您想要逐行写入它们,在每行之后打印一个换行符。对于每一行,取要显示的列数(在您的示例中为 3)。
- 您应该使用 word.PadRight(maxLength + 1, ' ');
而不是写单词本身
注意 - MaxLength + 1 只是为了让 space 也显示在您最长的单词之后。我希望这些信息足以让您顺利上路。欢迎提出任何后续问题!
这是一个使用 LINQ 的示例:
var text = "word_1_1 word_1_2 word_1_3\r\nsome_word_2_1 another_word_2_2 word_2_3\n word_3_1";
var words = text.Replace("\r\n", "\n").Split('\n').Select(x => Regex.Replace(x, " +", " ").Split(' '));
var lengths = words.Select(x => x.Select(y => y.Length));
var maxColumns = lengths.Max(x => x.Count());
var widths = lengths
.Select(x => x.Concat(Enumerable.Repeat(0, maxColumns)).Take(maxColumns))
.Aggregate(Enumerable.Repeat(0, maxColumns), (m, x) => { var t = x.ToArray(); m = m.Select((y, i) => y > t[i] ? y : t[i]); return m; });
var paddedLines = words.Select(x => String.Join(" ", x.Zip(widths, (a, b) => a.PadRight(b)).ToArray()));
var paddedText = String.Join("\r\n", paddedLines.ToArray());
我是 C# 的新手,所以我接到了一项任务,要对齐列中的单词。
所以基本上我有一个带有文本的记事本,例如:
wordone word two... wordmillion
假设有 6 行。我需要按顺序设置它们,这样它看起来像:
word one word two word three
wordjosdjfjfisio anotherword otherword
每个其他单词都会从如图所示的位置开始(第一列中最长单词的额外 space 等)我尽可能清楚地解释,任何 tips/ideas怎么办?我认为 padright 是解决方案? P.S。对不起,如果布局有误,我对这个社区还很陌生。
您可以在Console.Writeline()中使用\t(制表符); 示例
Console.WriteLine("word one\t\tword two\t\tword three");
Console.WriteLine("wordjosdjfjfisio\tanotherword\totherword");
看来您走对了!
首先,这里是PadRight的文档:https://msdn.microsoft.com/en-us/library/36f2hz3a%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396。
从这个 MSDN 解释中,我们可以看到以下有用的示例:
string str = "forty-two";
char pad = '.';
Console.WriteLine(str.PadRight(15, pad)); // Displays "forty-two......".
Console.WriteLine(str.PadRight(2, pad)); // Displays "forty-two".
因此,您的答案的伪代码算法可能如下 - 如果您需要更多解释,请告诉我:
- 将文件中的所有单词读入字符串数组
- 找到最长单词的长度,我们称之为 maxLength
- 遍历所有单词并将它们格式化为table。您想要逐行写入它们,在每行之后打印一个换行符。对于每一行,取要显示的列数(在您的示例中为 3)。
- 您应该使用 word.PadRight(maxLength + 1, ' '); 而不是写单词本身
注意 - MaxLength + 1 只是为了让 space 也显示在您最长的单词之后。我希望这些信息足以让您顺利上路。欢迎提出任何后续问题!
这是一个使用 LINQ 的示例:
var text = "word_1_1 word_1_2 word_1_3\r\nsome_word_2_1 another_word_2_2 word_2_3\n word_3_1";
var words = text.Replace("\r\n", "\n").Split('\n').Select(x => Regex.Replace(x, " +", " ").Split(' '));
var lengths = words.Select(x => x.Select(y => y.Length));
var maxColumns = lengths.Max(x => x.Count());
var widths = lengths
.Select(x => x.Concat(Enumerable.Repeat(0, maxColumns)).Take(maxColumns))
.Aggregate(Enumerable.Repeat(0, maxColumns), (m, x) => { var t = x.ToArray(); m = m.Select((y, i) => y > t[i] ? y : t[i]); return m; });
var paddedLines = words.Select(x => String.Join(" ", x.Zip(widths, (a, b) => a.PadRight(b)).ToArray()));
var paddedText = String.Join("\r\n", paddedLines.ToArray());