У меня есть следующая функция, которая берет строку в качестве параметра и повторяет его неоднократно (также параметр). Я чувствую, что это - что-то, что это уже находится в платформе или по крайней мере могло быть добито большего успеха. Какие-либо предложения?
private string chr(string s, int repeat)
{
string result = string.Empty;
for (int i = 0; i < repeat; i++)
{
result += s;
}
return result;
}
Функциональные подход в стиле программирования:
(требуется как минимум C # 3.0)
static class StringRepetitionExtension
{
public static string Times(this int count, string what)
{
return count > 0 ? string.Concat(what, (count-1).Times(what))
: string.Empty;
}
}
Использование:
3.Times("Foobar") // returns "FoobarFoobarFoobar"
(Конечно, не самое эффективное решение, и из-за рекурсии всегда существует опасность переполнения стека с неоправданно большими значениями для count
; но я, тем не менее, хотел поделиться немного другим, простым для понимания подходом.)
Самое важное улучшение, которое вы могли бы внести в свою функцию, - это дать ей описательное имя.
Если ваш ввод действительно состоит из одного символа, а не строку, вы можете просто сделать это:
var someChar = 'f';
var repeat = 10;
var repeated = new String(someChar, repeat);
В противном случае, я не думаю, что есть еще что-то, кроме использования StringBuilder
вместо конкатенации:
private string chr(string s, int repeat)
{
var result = new StringBuilder(s.Length * repeat);
for (int i = 0; i < repeat; i++)
{
result.Append(s);
}
return result.ToString();
}
Не самый эффективный, но краткий:
.NET 4:
String.Join(String.Empty, Enumerable.Repeat(s, repeat));
.NET 3.0 / 3.5:
String.Join(String.Empty, Enumerable.Repeat(s, repeat).ToArray());
private string chr (string s, int repeat) {
string result = new String(' ', repeat).Replace(" ", s);
return result;
}
Я бы использовал StringBuilder
, поскольку сейчас вы потенциально выделяете и удаляете много строк:
private string chr(string s, int repeat)
{
StringBuilder result = new StringBuilder();
for (int i = 0; i < repeat; i++)
{
result.Append(s);
}
return result.ToString();
}
Или даже лучше, если строка состоит только из одного символа:
private string chr(char s, int repeat)
{
StringBuilder result = new StringBuilder();
result.Append(s, repeat);
return result.ToString();
}
return new System.Text.StringBuilder().Insert(0,"repeatme",count).ToString()
Вы можете рассмотреть возможность использования StringBuilder, если ваш параметр repeat очень большой.
http://msdn.microsoft.com/en-us/library/system.text.stringbuilder.aspx
http://channel9.msdn.com/forums/TechOff/14294-C-string-vs-StringBuilder/
private string chr(string s, int repeat)
{
return Enumerable.Range(0, repeat)
.Aggregate(new StringBuilder(), (sb, i) => sb.Append(s)).ToString();
}