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

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

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

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

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

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

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

  1. Версия LINQ состоит всего из двух строк, что приятно. Но требуют ли повторные и агрегирующие вызовы ненужные затраты времени и ресурсов?

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

21 ответ

Решение

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

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

куда n это количество раз, которое вы хотите повторить строку.

Или лучше:

static string Tabs(int n)
{
    return new String('\t', n);
}
string.Concat(Enumerable.Repeat("ab", 2));

Возвращает

"ABAB"

А также

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

Возвращает

"Аа"

от...

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

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

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

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

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

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

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

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

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


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)) //char версия и
Debug.WriteLine("-".Repeat(1000000)) // строковая версия

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

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

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

Возвращает

{"Привет привет привет", ""}

Будь проще.

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

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

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

С помощью String.Concat а также Enumerable.Repeat который будет дешевле, чем использовать String.Join

public static Repeat(this String pattern, int count)
{
    return String.Concat(Enumerable.Repeat(pattern, count));
}
var str = new string(Enumerable.Repeat('\t', numTabs).ToArray());

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

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

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

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

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

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

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

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

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

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

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

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

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

              string input = "abc"
        string output = "";
        for (int i = 0; i < input.Length; i++)
        {
            output += input[i].ToString() + input[i].ToString();
         
       }
        Console.WriteLine( output);

// вывод = ааббк

Заполните экран 6435 z $ str = [System.Linq.Enumerable]:: Repeat ([string]:: new ("z", 143), 45)

$str

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

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

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

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

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

Другие вопросы по тегам