Ответ 1
В .NET 4 вы можете сделать это:
String.Concat(Enumerable.Repeat("Hello", 4))
Предположим, что у меня есть строка, например
string snip = "</li></ul>";
Я хочу в основном писать его несколько раз, в зависимости от некоторого целочисленного значения.
string snip = "</li></ul>";
int multiplier = 2;
// TODO: magic code to do this
// snip * multiplier = "</li></ul></li></ul>";
EDIT: Я знаю, что могу легко написать свою собственную функцию для реализации этого, мне просто интересно, был ли какой-то странный оператор строки, о котором я не знал о
В .NET 4 вы можете сделать это:
String.Concat(Enumerable.Repeat("Hello", 4))
Обратите внимание, что если ваша "строка" - это только один символ, для ее обработки существует перегрузка конструктора строк:
int multipler = 10;
string TenAs = new string ('A', multipler);
К сожалению/к счастью, класс string запечатан, поэтому вы не можете наследовать его и перегрузить оператор *. Вы можете создать метод расширения, хотя:
public static string Multiply(this string source, int multiplier)
{
StringBuilder sb = new StringBuilder(multiplier * source.Length);
for (int i = 0; i < multiplier; i++)
{
sb.Append(source);
}
return sb.ToString();
}
string s = "</li></ul>".Multiply(10);
Я с DrJokepu на этом, но если по какой-то причине вы захотели обмануть, используя встроенную функциональность, вы можете сделать что-то вроде этого:
string snip = "</li></ul>";
int multiplier = 2;
string result = string.Join(snip, new string[multiplier + 1]);
Или, если вы используете .NET 4:
string result = string.Concat(Enumerable.Repeat(snip, multiplier));
Лично я бы не стал беспокоиться - пользовательский метод расширения намного приятнее.
Просто для полноты - вот еще один способ сделать это:
public static string Repeat(this string s, int count)
{
var _s = new System.Text.StringBuilder().Insert(0, s, count).ToString();
return _s;
}
Я думаю, что я вытащил это из Qaru некоторое время назад, так что это не моя идея.
Вам нужно написать метод - конечно, с С# 3.0 это может быть метод расширения:
public static string Repeat(this string, int count) {
/* StringBuilder etc */ }
то
string bar = "abc";
string foo = bar.Repeat(2);
Немного поздно (и просто для удовольствия), если вы действительно хотите использовать оператор *
для этой работы, вы можете сделать это:
public class StringWrap
{
private string value;
public StringWrap(string v)
{
this.value = v;
}
public static string operator *(StringWrap s, int n)
{
return s.value.Multiply(n); // DrJokepu extension
}
}
И так:
var newStr = new StringWrap("TO_REPEAT") * 5;
Обратите внимание, что, пока вы можете найти для них разумное поведение, вы также можете обращаться с другими операторами через класс StringWrap
, например \
, ^
, %
и т.д.
P.S:.
Multiply()
кредиты расширения @DrJokepu все права защищены; -)
Это намного более краткий:
new StringBuilder().Insert(0, "</li></ul>", count).ToString()
В этом случае необходимо импортировать пространство имен using System.Text;
.
string Multiply(string input, int times)
{
StringBuilder sb = new StringBuilder(input.length * times);
for (int i = 0; i < times; i++)
{
sb.Append(input);
}
return sb.ToString();
}
Если у вас есть .Net 3.5, но не 4.0, вы можете использовать System.Linq
String.Concat(Enumerable.Range(0, 4).Select(_ => "Hello").ToArray())
Поскольку каждый добавляет свои собственные примеры .NET4/Linq, я мог бы также добавить свой собственный. (В принципе, это DrJokepu's, сведенный к однострочному)
public static string Multiply(this string source, int multiplier)
{
return Enumerable.Range(1,multiplier)
.Aggregate(new StringBuilder(multiplier*source.Length),
(sb, n)=>sb.Append(source))
.ToString();
}
Хорошо, здесь я беру на себя дело:
public static class ExtensionMethods {
public static string Multiply(this string text, int count)
{
return new string(Enumerable.Repeat(text, count)
.SelectMany(s => s.ToCharArray()).ToArray());
}
}
Я, конечно, немного глуп, но когда мне нужно иметь таблицы в классах, генерирующих код, Enumerable.Repeat делает это для меня. И да, версия StringBuilder тоже прекрасна.
Здесь я беру на себя это только для справок в будущем:
/// <summary>
/// Repeats a System.String instance by the number of times specified;
/// Each copy of thisString is separated by a separator
/// </summary>
/// <param name="thisString">
/// The current string to be repeated
/// </param>
/// <param name="separator">
/// Separator in between copies of thisString
/// </param>
/// <param name="repeatTimes">
/// The number of times thisString is repeated</param>
/// <returns>
/// A repeated copy of thisString by repeatTimes times
/// and separated by the separator
/// </returns>
public static string Repeat(this string thisString, string separator, int repeatTimes) {
return string.Join(separator, ParallelEnumerable.Repeat(thisString, repeatTimes));
}