web-dev-qa-db-ja.com

(C#で)文字列を「乗算」できますか?

たとえば、文字列があるとします

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

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

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

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

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

122
inspite

.NET 4では、これを行うことができます。

String.Concat(Enumerable.Repeat("Hello", 4))
211
Will Dean

「文字列」が1文字のみの場合、それを処理する文字列コンストラクターのオーバーロードが存在することに注意してください。

int multipler = 10;
string TenAs = new string ('A', multipler);
90
James Curran

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

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);
60
Tamas Czinege

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

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

11
LukeH

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

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

少し前にそれをStack Overflowから取り出したと思うので、それは私の考えではありません。

10
user51710

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

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

その後:

string bar = "abc";
string foo = bar.Repeat(2);
9
Marc Gravell

少し遅れて(そしてただの楽しみのために)この作業に_*_演算子を本当に使用したい場合、これを行うことができます:

_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()拡張機能クレジット @ DrJokep all rights reserved ;-)

7
digEmAll

これははるかに簡潔です:

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

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

6
user734119

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

String.Concat(Enumerable.Range(0, 4).Select(_ => "Hello").ToArray())
2

誰もが独自の.NET4/Linqサンプルを追加しているので、私も独自のサンプルを追加することができます。 (基本的に、それはDrJokepuの、1ライナーに縮小されます)

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();
}
2
James Curran
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();
}
2
Chris Ballance

これは、今後の参考のために私が取ったものです。

    /// <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));
    }
0
Jronny

さて、問題についての私の見解は次のとおりです。

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バージョンも問題ありません。

0
Dmitri Nesteruk