142

たとえば、次のような文字列があるとします。

string snip =  "</li></ul>";

整数値に応じて、基本的に複数回書きたいと思います。

string snip =  "</li></ul>";
int multiplier = 2;

// TODO: magic code to do this 
// snip * multiplier = "</li></ul></li></ul>";

編集:これを実装する独自の関数を簡単に作成できることはわかっていますが、私が知らなかった奇妙な文字列演算子があるかどうか疑問に思っていました

4

13 に答える 13

240

.NET 4 では、次のことができます。

String.Concat(Enumerable.Repeat("Hello", 4))
于 2010-07-21T08:54:49.123 に答える
62

残念ながら/幸いなことに、文字列クラスは封印されているため、それを継承して * 演算子をオーバーロードすることはできません。ただし、拡張メソッドを作成できます。

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);
于 2009-02-10T15:59:56.740 に答える
12

私はこれについて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));

個人的には気にしませんが、カスタム拡張メソッドの方がはるかに優れています。

于 2009-02-10T16:13:52.883 に答える
10

完全を期すために、これを行う別の方法を次に示します。

public static string Repeat(this string s, int count)
{
    var _s = new System.Text.StringBuilder().Insert(0, s, count).ToString();
    return _s;
}

少し前にスタックオーバーフローから引っ張ってきたと思うので、私の考えではありません。

于 2009-06-05T20:44:48.557 に答える
9

メソッドを作成する必要があります。もちろん、C# 3.0 では拡張メソッドになる可能性があります。

public static string Repeat(this string, int count) {
    /* StringBuilder etc */ }

それから:

string bar = "abc";
string foo = bar.Repeat(2);
于 2009-02-10T16:00:01.327 に答える
9

少し遅れて(そして楽しみのために)、*この作業にオペレーターを本当に使用したい場合は、次のようにすることができます:

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への拡張クレジットすべての権利予約;-)

于 2011-09-12T21:04:09.377 に答える
8

これはもっと簡潔です:

new StringBuilder().Insert(0, "</li></ul>", count).ToString()

この場合、名前空間using System.Text;をインポートする必要があります。

于 2011-12-15T12:17:55.203 に答える
2

誰もが独自の.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();
}
于 2010-12-16T19:57:27.177 に答える
2
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();
}
于 2009-02-10T16:01:15.503 に答える
2

.Net 3.5 を使用しているが 4.0 を使用していない場合は、System.Linq を使用できます

String.Concat(Enumerable.Range(0, 4).Select(_ => "Hello").ToArray())
于 2010-07-22T05:38:35.117 に答える
0

これが将来の参考のためにこれについての私の見解です:

    /// <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));
    }
于 2010-07-21T08:52:08.037 に答える