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

Что это лучший способ создать строку \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; 
}

Ответ 1

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

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

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

Или лучше:

static string Tabs(int n)
{
    return new String('\t', n);
}

Ответ 3

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

Ответ 4

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

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

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

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

Ответ 5

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

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);
}

Ответ 6

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


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))//строковая версия

Ответ 7

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

//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));

Ответ 8

Я знаю, что этот вопрос уже пять лет, но есть простой способ повторить строку, которая даже работает в .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" , ""}

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

Ответ 9

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

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

Ответ 10

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

Ответ 11

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

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

Ответ 12

var str = new string(Enumerable.Repeat('\t', numTabs).ToArray());

Ответ 13

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

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

Ответ 14

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

new System.Text.StringBuilder().Append('\t', 100).ToString()

Ответ 15

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

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

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

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

Ответ 16

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

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);
    }
}

Ответ 17

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

Ответ 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);
}

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

Ответ 18

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

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

Ответ 19

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

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

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