Какой это лучший способ для генерации строки \t
в C #
Я изучаю C # и экспериментирую с разными способами сказать одно и то же.
Tabs(uint t)
это функция , которая возвращает string
с t
количеством \t
«с
Например Tabs(3)
возвращает"\t\t\t"
Какой из этих трех способов реализации Tabs(uint numTabs)
лучше?
Конечно, это зависит от того, что означает «лучший».
Версия LINQ состоит всего из двух строк, что приятно. Но требуют ли повторные и агрегирующие вызовы ненужные затраты времени и ресурсов?
StringBuilder
Версия очень ясно , но этоStringBuilder
класс как - то медленнее?string
Версия является основной, что означает , что это легко понять.Это не имеет значения вообще? Они все равны?
Все эти вопросы помогут мне лучше понять 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;
}
Возвращает
А также
Возвращает
от...
Есть ли встроенная функция для повторения строки или символа в .net?
источник
StruingBuilder
!string.Join
был быстрее в этом примере, потому что они использовали разделитель пробелов.string.Concat
уместно, когда нет разделителя.Во всех версиях .NET вы можете повторить строку следующим образом:
Повторить характер,
new String('\t', count)
это ваша лучшая ставка. Смотрите ответ по @CMS .источник
Лучшая версия, безусловно, использовать встроенный способ:
Из других решений предпочитаю самое простое; только если это окажется слишком медленным, стремитесь к более эффективному решению.
Если вы используетеЧепуха: конечно, приведенный выше код более эффективен.StringBuilder
и заранее знаете его результирующую длину, а затем также используете соответствующий конструктор, это гораздо более эффективно, потому что это означает, что выполняется только одно трудоемкое выделение, и нет ненужного копирования данных.источник
new string('\t', len)
что они в 2-7 раз быстрее, чемStringBuilder
подход. Почему вы считаетеStringBuilder
более эффективным в этом случае?Методы расширения:
источник
Enumerable.Range(0, n).SelectMany(x => s)
можно заменить на простойEnumerable.Repeat(s, n)
.SelectMany
завещании для каждого отдельного манекенаx
дается последовательностьchar
значений (поскольку ониstring s
реализованыIEnumerable<char>
), и все этиchar
последовательности объединяются в одну длиннуюchar
последовательность. То, что вы предлагаете, вместо этого дастIEnumerable<string>
. Это не то же самое.Enumerable.Repeat
, я бы конкатенацию строк вместе:string.Concat(Enumerable.Repeat(s, n))
. Это уже было опубликовано ранее .Как насчет использования метода расширения?
Вы могли бы тогда написать:
Обратите внимание, что тест производительности при использовании версии stringbuilder для простых символов вместо строк дает основную штрафную степень при выполнении: на моем компьютере разница в измеряемой производительности составляет 1:20 между: Debug.WriteLine ('-'. Repeat (1000000)) // char версия и
Debug.WriteLine ("-". Repeat (1000000)) // строковая версия
источник
StringBuilder.Insert(Int32, String, Int32)
, как ответил Binoj Anthony .Как насчет этого:
источник
new string('\t', 10)
лучшее решениеЯ знаю, что этому вопросу уже пять лет, но есть простой способ повторить строку, которая даже работает в .Net 2.0.
Чтобы повторить строку:
Возвращает
Чтобы повторить строку как массив:
Возвращает
Будь проще.
источник
Допустим, вы хотите повторить '\ t' n количество раз, которое вы можете использовать;
источник
Ваш первый пример, который использует
Enumerable.Repeat
:можно переписать более компактно
String.Concat
:источник
Использование
String.Concat
иEnumerable.Repeat
которое будет дешевле, чем использованиеString.Join
источник
источник
Ответ действительно зависит от сложности, которую вы хотите. Например, я хочу обвести все мои отступы вертикальной чертой, поэтому моя строка отступа определяется следующим образом:
источник
И еще один метод
источник
StringBuilder
конструктор сохраняет перераспределение. Тем не менее, это более разговорчиво и менее эффективно, чем использованиеstring
конструктора, который может повторять данный символ, как уже показано в принятом ответе.Для меня это хорошо
источник
Вы можете создать метод расширения
Тогда вы можете использовать это так
источник
Без сомнения, принятый ответ - лучший и самый быстрый способ повторить один символ.
Ответ Binoj Anthony - простой и довольно эффективный способ повторить строку.
Однако, если вы не против немного больше кода, вы можете использовать мою технику заполнения массива, чтобы эффективно создавать эти строки еще быстрее. В моих сравнительных тестах приведенный ниже код выполнялся примерно за 35% времени кода StringBuilder.Insert.
Подробнее об этой методике заполнения массива см. В разделе Самый быстрый способ заполнения массива одним значением
источник
Попробуй это:
источник
Хотя очень похоже на предыдущее предложение, я хотел бы сохранить его простым и применять следующее:
Стандартный .Net действительно,
источник