c # - вставить переменное количество пробелов в строку? (форматирование выходного файла)

<p>хорошо, я беру данные из списка, которым я заполняю datagridview, и экспортирую их в текстовый файл. я уже сделал функцию, чтобы экспортировать его в csv, и хотел бы также сделать текстовую версию.</p><p>поскольку заголовки и другие элементы имеют переменную длину, когда файл сохраняется и затем открывается в блокноте, он выглядит как беспорядок, потому что ничего не выстраивается.</p><p>я хотел бы, чтобы результат выглядел так:</p><pre><code>sample title one element one whatever else sample title 2 element 2 whatever else s. t. 3 e3 whatever else </code></pre><p>я полагаю, что могу пройтись по каждому из элементов, чтобы получить длину самого длинного, чтобы вычислить, сколько пробелов добавить к каждому из оставшихся элементов.</p><p>мой главный вопрос: <strong>есть ли элегантный способ добавить переменное число символов в строку?</strong> было бы хорошо иметь что-то вроде: <code>mystring.insert(index, chartoinsert, howmanytoinsert);</code></p><p>конечно, я, очевидно, могу просто написать функцию, чтобы сделать это через цикл, но я хотел посмотреть, есть ли лучший способ сделать это.</p><p>заранее спасибо!</p><p>-sootah</p>

<p>для этого вы, вероятно, хотите <code>mystring.padright(totallength, chartoinsert)</code>.</p><p>смотрите <a href="http://msdn.microsoft.com/en-us/library/34d75d7s.aspx">string.padright method (int32)</a> для получения дополнительной информации.</p>

<p>используйте <code>string.format()</code> или <code>textwriter.format()</code> (в зависимости от того, как вы в действительности пишете в файл) и укажите ширину поля.</p><pre><code>string.format("{0,20}{1,15}{2,15}", "sample title one", "element one", "whatever else"); </code></pre><p>вы можете также указать ширину поля в интерполированных строках:</p><pre><code>$"{"sample title one",20}{"element one",15}{"whatever else",15}" </code></pre><p>и, чтобы вы знали, вы можете создать строку повторяющихся символов, используя соответствующий строковый конструктор.</p><pre><code>new string(' ', 20); // string of 20 spaces </code></pre>

<p>используйте <code>string.format</code>:</p><pre><code>string title1 = "sample title one"; string element1 = "element one"; string format = "{0,-20} {1,-10}"; string result = string.format(format, title1, element1); //or you can print to console directly with //console.writeline(format, title1, element1); </code></pre><p>в формате <code>{0,-20}</code> означает, что первый аргумент имеет фиксированную длину 20, а отрицательный знак гарантирует, что строка будет напечатана слева направо.</p>

<p>для простоты, вот функции, которые я написал, чтобы сделать это до того, как у меня появился бит .padright:</p><pre><code> public string insertspacesatend(string input, int longest) { string output = input; string spaces = ""; int inputlength = input.length; int numtoinsert = longest - inputlength; for (int i = 0; i < numtoinsert; i++) { spaces += " "; } output += spaces; return output; } public int findlongest(list<results> thelist) { int longest = 0; for (int i = 0; i < thelist.count; i++) { if (longest < thelist[i].title.length) longest = thelist[i].title.length; } return longest; } ////usage//// for (int i = 0; i < storagelist.count; i++) { output += insertspacesatend(storagelist[i].title, longest + 5) + storagelist[i].rank.trim() + " " + storagelist[i].term.trim() + " " + storagelist[i].name + "\r\n"; } </code></pre>

<p>я согласен с джастином, и на whitespace char можно ссылаться, используя <strong> <a href="https://www.dotnetperls.com/ascii-table">коды ascii здесь</a> </strong> символ номер 32 представляет пробел, поэтому :</p><pre><code>string.empty.padright(totallength, (char)32); </code></pre><p><strong> альтернативный подход: </strong> создайте все пробелы вручную в пользовательском методе и вызовите его:</p><pre><code>private static string getspaces(int totallength) { string result = string.empty; for (int i = 0; i < totallength; i++) { result += " "; } return result; } </code></pre><p>и вызовите это в своем коде для создания пробелов: getspaces (14);</p>