Лучший способ повторить символ в C #

573

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

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

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

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

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

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

  • Версия LINQ имеет только две строки, что приятно. Но есть ли призывы к повторению и объединению излишнего времени/ресурса?

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

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

  • Разве это не имеет значения? Все ли они равны?

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

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; 
}
Теги:
string

16 ответов

1119
Лучший ответ

Как насчет этого:

string tabs = new String('\t', n);

Где n - количество повторений строки.

Или лучше:

static string Tabs(int n)
{
    return new String('\t', n);
}
  • 0
    есть ли способ повторить это на слово? вместо использования «\ t», как использовать «время»
  • 0
    Смотрите дальше внизу: stackoverflow.com/a/3097925/281077
Показать ещё 1 комментарий
101

Во всех версиях .NET вы можете повторить строку таким образом:

public static string Repeat(string value, int count)
{
    return new StringBuilder(value.Length * count).Insert(0, value, count).ToString();
}

Чтобы повторить символ, new String('\t', count) - ваш лучший выбор. См. ответ @CMS.

  • 6
    На сегодняшний день это самая быстрая производительность для String. Другие методы создают слишком много накладных расходов.
  • 0
    @midspace Знаете ли вы, если кто-нибудь объяснил, почему другие ответы хуже? Я бы предположил, что нативный String.Concat будет внутренне оптимизирован так же, как StringBuilder.
Показать ещё 2 комментария
88
string.Concat(Enumerable.Repeat("ab", 2));

Возвращает

"ABAB"

и

string.Concat(Enumerable.Repeat("a", 2));

Возвращает

"аа"

от...

Есть ли встроенная функция для повторения строки или char в .net?

  • 0
    Сделайте это лучше, сделав это без Linq и StruingBuilder !
  • 4
    StringBuilder не обязательно быстрее stackoverflow.com/questions/585860/…
Показать ещё 3 комментария
50

Лучшая версия, безусловно, использует встроенный способ:

string Tabs(int len) { return new string('\t', len); }

Из других решений предпочитайте самые простые; только если это проявляется слишком медленно, стремиться к более эффективному решению.

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

  • 12
    sb.Append ('\ t', len);
  • 7
    Мои тесты показывают, что new string('\t', len) будет в 2-7 раз быстрее, чем подход StringBuilder . Как вы думаете, почему StringBuilder более эффективен в этом случае?
Показать ещё 1 комментарий
37

Методы расширения:

public static string Repeat(this string s, int n)
{
    return new String(Enumerable.Range(0, n).SelectMany(x => s).ToArray());
}

public static string Repeat(this char c, int n)
{
    return new String(c, n);
}
  • 35
    Когда-то люди использовали циклы while
  • 2
    хороший ответ, помог мне больше, чем new String('\t', 2) ...
Показать ещё 4 комментария
37

Как насчет использования метода расширения?


public static class StringExtensions
{
   public static string Repeat(this char chatToRepeat, int repeat) {

       return new string(chatToRepeat,repeat);
   }
   public  static string Repeat(this string stringToRepeat,int repeat)
   {
       var builder = new StringBuilder(repeat*stringToRepeat.Length);
       for (int i = 0; i < repeat; i++) {
           builder.Append(stringToRepeat);
       }
       return builder.ToString();
   }
}

Затем вы можете написать:

Debug.WriteLine('-'.Repeat(100)); // For Chars  
Debug.WriteLine("Hello".Repeat(100)); // For Strings

Обратите внимание, что тест производительности с использованием версии строковой версии для простых символов вместо строк дает вам основную преформацию: на моем компьютере разница в измеренной производительности составляет 1:20 между: Debug.WriteLine('-'. Repeat (1000000))//char версия и
Debug.WriteLine( "-". Повторить (1000000))//строковая версия

21

Как насчет этого:

//Repeats a character specified number of times
public static string Repeat(char character,int numberOfIterations)
{
    return "".PadLeft(numberOfIterations, character);
}

//Call the Repeat method
Console.WriteLine(Repeat('\t',40));
  • 4
    хаха .. вот о чем я мог подумать, когда однажды попал в такую ситуацию. Но лично я нашел new string('\t', 10) чтобы быть лучшим решением
  • 0
    Этот прием также используется в Essential C # 6.0 .
18

Я знаю, что этот вопрос уже пять лет, но есть простой способ повторить строку, которая даже работает в .Net 2.0.

Повторить строку:

string repeated = new String('+', 3).Replace("+", "Hello, ");

Возвращает

"Hello, Hello, Hello,"

Повторить строку как массив:

// Two line version.
string repeated = new String('+', 3).Replace("+", "Hello,");
string[] repeatedArray = repeated.Split(',');

// One line version.
string[] repeatedArray = new String('+', 3).Replace("+", "Hello,").Split(',');

Возвращает

{ "Hello" , "Hello" , "Hello" , ""}

Держите его простым.

15

Скажем, вы хотите повторить '\ t' n количество раз, вы можете использовать;

String.Empty.PadRight(n,'\t')
  • 0
    Благодарю. Это тоже очень быстро. codereview.stackexchange.com/questions/36391/...
  • 0
    Я всегда так делал. Даже если он включен в метод расширения, он проще, чем другие реализации, размещенные здесь. Обратите внимание, что OP просто хотел повторить \ t, а не строки.
14

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

public static Repeat(this String pattern, int count)
{
    return String.Concat(Enumerable.Repeat(pattern, count));
}
14

Ваш первый пример, который использует Enumerable.Repeat:

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

можно более компактно переписать с помощью String.Concat:

private string Tabs(uint numTabs)
{       
    return String.Concat(Enumerable.Repeat("\t", (int) numTabs));
}
7
var str = new string(Enumerable.Repeat('\t', numTabs).ToArray());
4

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

return new string(Enumerable.Range(0, indentSize*indent).Select(
  n => n%4 == 0 ? '|' : ' ').ToArray());
0

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

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

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

Console.WriteLine('\t'.Repeat(10));
0

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

new System.Text.StringBuilder().Append('\t', 100).ToString()
  • 0
    Передача полученной длины строки конструктору StringBuilder сохраняет перераспределение. Тем не менее, это более разговорчиво и менее эффективно, чем использование string конструктора, который может повторять данный символ, как уже показано в принятом ответе.
  • 0
    @Palec, ты прав. Тем не менее это еще один ответ
0

Попробуйте следующее:

  • Добавить ссылку Microsoft.VisualBasic
  • Использование: Строковый результат = Microsoft.VisualBasic.Strings.StrDup(5, "привет" );
  • Сообщите мне, если это сработает для вас.
  • 0
    Добавление зависимости от другой сборки и необходимости ее загрузки нецелесообразно в большинстве случаев, когда вам нужна такая функциональность. Тем не менее, приятно знать, что есть такая вещь в .NET.
  • 0
    Там много плюсов и минусов в разных контекстах, поэтому каждый должен решить, в зависимости от ситуации, в которой он / она находится.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню