Лучший способ повторить символ в C # - PullRequest
700 голосов
/ 05 января 2009

Какой лучший способ создать строку из \t в C #

Я изучаю C # и экспериментирую с разными способами сказать одно и то же.

Tabs(uint t) - это функция, которая возвращает string с t количеством \t '

Например Tabs(3) возвращает "\t\t\t"

Какой из этих трех способов реализации Tabs(uint numTabs) является лучшим?

Конечно, это зависит от того, что означает "лучший".

  1. Версия LINQ состоит всего из двух строк, что приятно. Но являются ли вызовы Repeat and Aggregate излишне затратными по времени / ресурсам?

  2. Версия StringBuilder очень понятна, но класс StringBuilder несколько медленнее?

  3. Версия string является базовой, что означает, что ее легко понять.

  4. Это не имеет значения вообще? Они все равны?

Это все вопросы, которые помогут мне лучше понять C #.

private string Tabs(uint numTabs)
{
    IEnumerable<string> tabs = Enumerable.Repeat("\t", (int) numTabs);
    return (numTabs > 0) ? tabs.Aggregate((sum, next) => sum + next) : ""; 
}  

private string Tabs(uint numTabs)
{
    StringBuilder sb = new StringBuilder();
    for (uint i = 0; i < numTabs; i++)
        sb.Append("\t");

    return sb.ToString();
}  

private string Tabs(uint numTabs)
{
    string output = "";
    for (uint i = 0; i < numTabs; i++)
    {
        output += '\t';
    }
    return output; 
}

Ответы [ 19 ]

14 голосов
/ 23 апреля 2013

Использование String.Concat и Enumerable.Repeat, что будет дешевле чем при использовании String.Join

public static Repeat(this String pattern, int count)
{
    return String.Concat(Enumerable.Repeat(pattern, count));
}
8 голосов
/ 07 февраля 2014
var str = new string(Enumerable.Repeat('\t', numTabs).ToArray());
4 голосов
/ 06 апреля 2009

Ответ действительно зависит от сложности, которую вы хотите. Например, я хочу обвести все мои отступы вертикальной чертой, поэтому моя строка отступа определяется следующим образом:

return new string(Enumerable.Range(0, indentSize*indent).Select(
  n => n%4 == 0 ? '|' : ' ').ToArray());
2 голосов
/ 16 февраля 2018

Вы можете создать метод расширения

static class MyExtensions
{
    internal static string Repeat(this char c, int n)
    {
        return new string(c, n);
    }
}

Тогда вы можете использовать это так

Console.WriteLine('\t'.Repeat(10));
1 голос
/ 25 августа 2018

Без сомнения, принятый ответ - лучший и самый быстрый способ повторить один символ.

Ответ Binoj Anthony - простой и довольно эффективный способ повторить строку.

Однако, если вы не против немного больше кода, вы можете использовать мою технику заполнения массива, чтобы эффективно создавать эти строки еще быстрее. В моих сравнительных тестах приведенный ниже код выполнялся примерно за 35% времени кода StringBuilder.Insert.

public static string Repeat(this string value, int count)
{
    var values = new char[count * value.Length];
    values.Fill(value.ToCharArray());
    return new string(values);
}

public static void Fill<T>(this T[] destinationArray, params T[] value)
{
    if (destinationArray == null)
    {
        throw new ArgumentNullException("destinationArray");
    }

    if (value.Length > destinationArray.Length)
    {
        throw new ArgumentException("Length of value array must not be more than length of destination");
    }

    // set the initial array value
    Array.Copy(value, destinationArray, value.Length);

    int copyLength, nextCopyLength;

    for (copyLength = value.Length; (nextCopyLength = copyLength << 1) < destinationArray.Length; copyLength = nextCopyLength)
    {
        Array.Copy(destinationArray, 0, destinationArray, copyLength, copyLength);
    }

    Array.Copy(destinationArray, 0, destinationArray, copyLength, destinationArray.Length - copyLength);
}

Подробнее об этой технике заполнения массива см. Самый быстрый способ заполнения массива одним значением

1 голос
/ 04 июня 2018

Для меня это хорошо:

public static class Utils
{
    public static string LeftZerosFormatter(int zeros, int val)
    {
        string valstr = val.ToString();

        valstr = new string('0', zeros) + valstr;

        return valstr.Substring(valstr.Length - zeros, zeros);
    }
}
1 голос
/ 22 января 2018

И еще один метод

new System.Text.StringBuilder().Append('\t', 100).ToString()
0 голосов
/ 27 августа 2018

Хотя это очень похоже на предыдущее предложение, я хотел бы сохранить его простым и применять следующее:

string MyFancyString = "*";
int strLength = 50;
System.Console.WriteLine(MyFancyString.PadRight(strLength, "*");

Стандартный .Net действительно,

0 голосов
/ 22 декабря 2017

Попробуйте это:

  1. Добавить ссылку на Microsoft.VisualBasic
  2. Использование: String result = Microsoft.VisualBasic.Strings.StrDup (5, "hi");
  3. Дайте мне знать, если это работает для вас.
...