Что это лучший способ создать строку \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);
}
Ответ 2
string.Concat(Enumerable.Repeat("ab", 2));
Возвращает
"ABAB"
и
string.Concat(Enumerable.Repeat("a", 2));
Возвращает
"аа"
от...
Есть ли встроенная функция для повторения строки или char в .net?
Ответ 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 действительно,