C# 对齐列中的单词

C# 对齐列中的单词,c#,words,C#,Words,我是C语言的新手,所以我有一项任务,就是在列中对齐单词。 所以基本上我有一个有文字的记事本,例如: 一个字二个字。。。百万字,假设有60行。我需要将它们按顺序排列,以便看起来像: 一个字两个字三个字 另一个词另一个词 每个单词都会从第一列中最长的单词开始,比如shownextra空格等等。我试图尽可能清楚地解释,有什么提示/想法吗?我认为正确的解决方案是什么? 请注意,如果布局错误,很抱歉,我是这个社区的新手。您可以使用Console.Writeline中的\t选项卡; 范例 看来你在这条路上走

我是C语言的新手,所以我有一项任务,就是在列中对齐单词。 所以基本上我有一个有文字的记事本,例如: 一个字二个字。。。百万字,假设有60行。我需要将它们按顺序排列,以便看起来像: 一个字两个字三个字 另一个词另一个词

每个单词都会从第一列中最长的单词开始,比如shownextra空格等等。我试图尽可能清楚地解释,有什么提示/想法吗?我认为正确的解决方案是什么?
请注意,如果布局错误,很抱歉,我是这个社区的新手。

您可以使用Console.Writeline中的\t选项卡; 范例


看来你在这条路上走对了

首先,以下是PadRight的文档:

从这个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".
因此,您的答案的psuedo代码算法可以如下所示-如果您需要更多解释,请告诉我:

将文件中的所有单词读入字符串数组 找出最长单词的长度,我们称之为maxLength 检查所有单词并将它们格式化后写在表格中。您希望逐行写入它们,在每行之后打印一个换行符。对于每一行,在示例中显示3列。 您应该使用word.PadRightmaxLength+1',而不是编写单词本身;
注意-MaxLength+1正好如此,所以在最长单词后面也会显示一个空格。我希望这些信息足够让你上路。请随时提出任何后续问题

下面是一个使用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());

你在什么环境下工作?你是在使用ASP.Net、WinForms、WPF还是其他什么?我现在在UNI,我正在读.txt文件中的行,在Visual studio 2015平台上工作。我必须把所有的文本放回.txt文件当然是不同的你需要知道数据的限制:允许列增长多长时间?当单词变长时该怎么办?还有:目的是什么?显示、编辑、打印、存储?也许其他控件如DataGridView或Listview会有所帮助。这是个好主意,但如果我有数百万行和一个30个字符长的单词呢?这行吗?虽然这会很好地格式化行,但不会产生OP想要的效果,因为这两行不会相互对齐。我将所有行放入列表中,一旦我阅读了行,我就用foreach循环将它们拆分为单词。正如我所理解的,我只是写出第一列,找到最长的单词,然后开始用padright在maxlength+1中写第二列?对不起,如果我理解错了,我想确定一下。额外编辑:例如,第一行、第二行100等中可能只有两个单词。。所以数字不同。关于你的额外编辑,你能解释一下你试图解决的所有问题吗?什么决定了每行有多少行和多少个单词?我想确切地了解您得到了什么输入,以便为您提供完整的答案。
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());