Лучший способ повторить символ в 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 ]

1325 голосов
/ 05 января 2009

Что по этому поводу:

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

Где n - сколько раз вы хотите повторить строку.

Или лучше:

static string Tabs(int n)
{
    return new String('\t', n);
}
121 голосов
/ 13 марта 2013
string.Concat(Enumerable.Repeat("ab", 2));

Возвращает

"ABAB"

И

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

Возвращает

"аа"

из ...

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

117 голосов
/ 06 апреля 2009

Во всех версиях .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 .

60 голосов
/ 05 января 2009

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

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

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

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

50 голосов
/ 23 июня 2010

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

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);
}
40 голосов
/ 27 января 2009

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


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

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

22 голосов
/ 20 июня 2011

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

//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));
19 голосов
/ 03 декабря 2014

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

Чтобы повторить строку:

string repeated = new String('+', 3).Replace("+", "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", ""}

Будьте проще.

17 голосов
/ 26 января 2011

Ваш первый пример, который использует 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));
}
17 голосов
/ 28 августа 2013

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

String.Empty.PadRight(n,'\t')
...