Ответ 1
Как насчет этого:
string tabs = new String('\t', n);
Где n
- количество повторений строки.
Или лучше:
static string Tabs(int n)
{
return new String('\t', n);
}
Что это лучший способ создать строку \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 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));
Возвращает
"аа"
от...
Есть ли встроенная функция для повторения строки или char в .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
Обратите внимание, что тест производительности с использованием версии строковой версии для простых символов вместо строк дает вам основную преформацию:
на моем компьютере разница в измеренной производительности составляет 1:20 между:
Debug.WriteLine('-'. Repeat (1000000))//char версия и
Debug.WriteLine( "-". Повторить (1000000))//строковая версия
Как насчет этого:
//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));
Я знаю, что этот вопрос уже пять лет, но есть простой способ повторить строку, которая даже работает в .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" , ""}
Держите его простым.
Скажем, вы хотите повторить '\ t' n количество раз, вы можете использовать;
String.Empty.PadRight(n,'\t')
Ваш первый пример, который использует 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());
Ответ действительно зависит от сложности, которую вы хотите. Например, я хочу выделить все мои отступы с вертикальной полосой, поэтому моя строка отступа определяется следующим образом:
return new string(Enumerable.Range(0, indentSize*indent).Select(
n => n%4 == 0 ? '|' : ' ').ToArray());
И еще один метод
new System.Text.StringBuilder().Append('\t', 100).ToString()
Вы можете создать метод расширения
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);
}
}
Без сомнения, принятый ответ - лучший и самый быстрый способ повторить один символ.
Ответ 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 MyFancyString = "*";
int strLength = 50;
System.Console.WriteLine(MyFancyString.PadRight(strLength, "*");
Стандартный .Net действительно,