2016-11-26 2 views
2

Я довольно новичок в C#, поэтому у меня есть задача добавить слова в столбцы. Итак, у меня есть блокнот с текстом в нем, например: wordone word two... wordmillion и позволяет сказать, что есть 6 строк из них. Мне нужно, чтобы установить их в порядке, так что это будет выглядеть так: word one word two word three wordjosdjfjfisio anotherword otherwordВыравнивать слова в столбце

что каждое второе слово будет начинаться на месте, как показано на рисунке (дополнительное пространство от самого длинного слова в первой колонке и т.д.), я пытался объяснить в так ясно, как я мог, любые советы/идеи, как это сделать? Я думаю, что падрэд - это решение? P.S. извините, если макет неправильный, я совершенно новый для этого сообщества.

+1

В каком контексте вы работаете? Вы используете ASP.Net, WinForms, WPF или что-то еще? –

+1

Я сейчас в UNI, я читаю строки из TXT-файла, работающего на платформе Visual studio 2015. Я должен поместить текст с прикрепленным текстом в .txt-файл обратно (конечно, другой) – Tautvis

+0

Вам нужно знать пределы ваших данных: как долго разрешены столбцы? И что делать, когда слова становятся длиннее? Также: в чем цель? отображение, редактирование, печать, хранение? Возможно, другие элементы управления, такие как DataGridView или Listview, помогут .. – TaW

ответ

2

Похоже, что вы находитесь на правильном пути здесь!

Прежде всего, вот документация для 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". 

Так алгоритм псевдо-кода для ответа может быть следующим - дайте мне знать, если вам нужно больше объяснений:

  1. Читать все слова в файле в виде массива строк
  2. Найти длину самого длинного слова, позволяет называть его MAXLENGTH
  3. Go больше ll и записать их в таблицу. Вы хотите писать их по строкам, печатая новую строку после каждой строки. Для каждой строки возьмите количество столбцов, которые вы хотите отобразить (3 в вашем примере).
  4. Вместо того чтобы писать само слово, вы должны использовать word.PadRight (maxLength + 1, '');

Примечание. MaxLength + 1 - это просто пространство, которое будет показано после вашего самого длинного слова. Надеюсь, вам будет достаточно информации, чтобы помочь вам. Не стесняйтесь задавать любые последующие вопросы!

+0

Я поместил все строки в список , как только я прочитал строки, я разделил их на слова, используя цикл foreach. Итак, как я понял, я просто пишу первый столбец, нахожу самое длинное слово и начинаю писать второй столбец в maxlength + 1 с помощью padright? Извините, если я понял это неправильно, я хочу быть уверенным. EXTRA EDIT: может быть, например, только два слова в первой строке, вторая строка 100 и т. Д.Поэтому число меняется. – Tautvis

+0

Что касается вашего дополнительного редактирования - можете ли вы объяснить все случаи проблемы, которую вы пытаетесь решить? Что определяет количество строк и количество слов в каждой строке? Я хотел бы точно понять, какой вклад вы получаете, чтобы предоставить вам полный ответ. – PartlyCloudy

2

Вы можете использовать \ t (tab) в Console.Writeline(); Пример

Console.WriteLine("word one\t\tword two\t\tword three"); 
Console.WriteLine("wordjosdjfjfisio\tanotherword\totherword"); 
+1

Это отличная идея, но что, если бы у меня были миллионы строк и слово длиной 30 символов? Будет ли это работать? – Tautvis

+0

Хотя это будет красиво отформатировать линии, у него не будет эффекта, которого хочет OP, поскольку две линии не будут выровнены друг с другом. – PartlyCloudy

0

Вот пример делает использование 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()); 
Смежные вопросы