Предположим, у меня есть строка, например,
string snip = "</li></ul>";
Я хочу написать его несколько раз, в зависимости от целого числа.
string snip = "</li></ul>";
int multiplier = 2;
// TODO: magic code to do this
// snip * multiplier = "</li></ul></li></ul>";
РЕДАКТИРОВАТЬ: Я знаю, что могу легко написать свою собственную функцию для реализации этого, мне просто интересно, был ли какой-то странный строковый оператор, о котором я не знал
c#
string
extension-methods
несмотря
источник
источник
Ответы:
В .NET 4 вы можете сделать это:
String.Concat(Enumerable.Repeat("Hello", 4))
источник
operator*
представляет собой двоичный файл . Думаю, каждому свое.Обратите внимание, что если ваша «строка» состоит только из одного символа, существует перегрузка конструктора строки для ее обработки:
int multipler = 10; string TenAs = new string ('A', multipler);
источник
К сожалению / к счастью, строковый класс запечатан, поэтому вы не можете наследовать от него и перегрузить оператор *. Однако вы можете создать метод расширения:
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; }
Думаю, я вытащил его некоторое время назад из Stack Overflow, так что это не моя идея.
источник
Вам нужно будет написать метод - конечно, в C # 3.0 это может быть метод расширения:
public static string Repeat(this string, int count) { /* StringBuilder etc */ }
тогда:
string bar = "abc"; string foo = bar.Repeat(2);
источник
string.Join
- почему бы просто не выполнить цикл n раз? Гораздо прямее.Немного поздно (и просто для удовольствия), если вы действительно хотите использовать
*
оператор для этой работы, вы можете сделать это: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
класс, например\
,^
и%
т. Д.PS:
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's
String.Concat(Enumerable.Range(0, 4).Select(_ => "Hello").ToArray())
источник
String.Concat
, и на 3.5 вам также понадобится.ToArray()
. Боюсь, не самое элегантное решение.Поскольку каждый добавляет свои собственные примеры .NET4 / Linq, я мог бы добавить свои собственные. (По сути, это DrJokepu, сокращенный до однострочного)
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)); }
источник
ParallelEnumerable
в подобных ситуациях.string.Join
необходимо использовать элементы по порядку, поэтому распараллеливание их генерации не требуется.