web-dev-qa-db-ja.com

C#で文字を繰り返すための最良の方法

C#で\tの文字列を生成するための最良の方法は何ですか

私はC#を学び、同じことを言う異なる方法を試しています。

Tabs(uint t)は、stringの量の\tを持つtを返す関数です。

例えばTabs(3)"\t\t\t"を返します

Tabs(uint numTabs)を実装するためのこれらの3つの方法のうちどれが最良ですか?

もちろん、それは「最善」の意味によって異なります。

  1. LINQバージョンはたった2行で、これはいいですね。しかし、Repeat and Aggregateの呼び出しは不必要に時間やリソースを消費しますか?

  2. StringBuilderのバージョンは非常に明確ですが、StringBuilderクラスはどういうわけか遅くなりますか?

  3. stringバージョンは基本的なものです。つまり、理解するのは簡単です。

  4. それはまったく問題ではありませんか?それらはすべて等しいですか?

これらはすべて、私がC#をよりよく理解するのに役立つ質問です。

private string Tabs(uint numTabs)
{
    IEnumerable<string> tabs = Enumerable.Repeat("\t", (int) numTabs);
    return (numTabs > 0) ? tabs.Aggregate((sum, next) => sum + next) : ""; 
}  

private string Tabs(uint numTabs)
{
    StringBuilder sb = new StringBuilder();
    for (uint i = 0; i < numTabs; i++)
        sb.Append("\t");

    return sb.ToString();
}  

private string Tabs(uint numTabs)
{
    string output = "";
    for (uint i = 0; i < numTabs; i++)
    {
        output += '\t';
    }
    return output; 
}
693
Alex Baranosky

これはどうですか:

string tabs = new String('\t', n);

nは、文字列を繰り返す回数です。

またはそれ以上:

static string Tabs(int n)
{
    return new String('\t', n);
}
1316
CMS
string.Concat(Enumerable.Repeat("ab", 2));

返品

「アバブ」

そして

string.Concat(Enumerable.Repeat("a", 2));

返品

"ああ"

から...

.netで文字列または文字を繰り返すための組み込み関数はありますか?

120
Carter Medlin

.NETのすべてのバージョンで、このように文字列を繰り返すことができます。

public static string Repeat(string value, int count)
{
    return new StringBuilder(value.Length * count).Insert(0, value, count).ToString();
}

文字を繰り返すには、new String('\t', count)が最善の策です。 @CMSによる答え を参照してください。

117
Binoj Antony

最良のバージョンは確かに組み込みの方法を使用することです。

string Tabs(int len) { return new string('\t', len); }

他の解決策のうち、最も簡単なものを好みます。これが遅すぎることが判明した場合のみ、より効率的な解決策を模索してください。

StringBuilderを使用し、その結果の長さを前もって知っている場合は、適切なコンストラクタも使用すると、時間のかかる割り当てが1回だけ行われ、不要なデータのコピーが行われないため、はるかに効率的です。 ナンセンス:もちろん上記のコードはより効率的です。

60
Konrad Rudolph

拡張メソッド

public static string Repeat(this string s, int n)
{
    return new String(Enumerable.Range(0, n).SelectMany(x => s).ToArray());
}

public static string Repeat(this char c, int n)
{
    return new String(c, n);
}
49
Rodrick Chapman

拡張メソッドを使うのはどうですか?


public static class StringExtensions
{
   public static string Repeat(this char chatToRepeat, int repeat) {

       return new string(chatToRepeat,repeat);
   }
   public  static string Repeat(this string stringToRepeat,int repeat)
   {
       var builder = new StringBuilder(repeat*stringToRepeat.Length);
       for (int i = 0; i < repeat; i++) {
           builder.Append(stringToRepeat);
       }
       return builder.ToString();
   }
}

あなたはそれから書くことができます:

Debug.WriteLine('-'.Repeat(100)); // For Chars  
Debug.WriteLine("Hello".Repeat(100)); // For Strings

文字列の代わりに単純な文字に対してstringbuilderバージョンを使用するパフォーマンステストでは、パフォーマンスが大幅に低下することがあります。 //文字バージョン
Debug.WriteLine( " - "。繰り返し(1000000))//文字列バージョン

40
Ronnie

これはどう:

//Repeats a character specified number of times
public static string Repeat(char character,int numberOfIterations)
{
    return "".PadLeft(numberOfIterations, character);
}

//Call the Repeat method
Console.WriteLine(Repeat('\t',40));
22
Denys Wessels

私はこの質問がすでに5年前のものであることを知っていますが、.NET 2.0でも機能する文字列を繰り返す簡単な方法があります。

文字列を繰り返すには:

string repeated = new String('+', 3).Replace("+", "Hello, ");

返品

「こんにちは、こんにちは、こんにちは」

文字列を配列として繰り返すには:

// Two line version.
string repeated = new String('+', 3).Replace("+", "Hello,");
string[] repeatedArray = repeated.Split(',');

// One line version.
string[] repeatedArray = new String('+', 3).Replace("+", "Hello,").Split(',');

返品

{"こんにちは"、 "こんにちは"、 "こんにちは"、 ""}

複雑にしないでおく。

19
ChaimG

Enumerable.Repeatを使用する最初の例:

private string Tabs(uint numTabs)
{
    IEnumerable<string> tabs = Enumerable.Repeat(
                                 "\t", (int) numTabs);
    return (numTabs > 0) ? 
            tabs.Aggregate((sum, next) => sum + next) : ""; 
} 

String.Concatでよりコンパクトに書き直すことができます:

private string Tabs(uint numTabs)
{       
    return String.Concat(Enumerable.Repeat("\t", (int) numTabs));
}
17
Ray Vega

'\ t'を何回も繰り返したいとしましょう。

String.Empty.PadRight(n,'\t')
16
Amin

String.ConcatおよびEnumerable.Repeatを使用すると、String.Joinを使用するよりも安価になります。

public static Repeat(this String pattern, int count)
{
    return String.Concat(Enumerable.Repeat(pattern, count));
}
14
bradgonesurfing
var str = new string(Enumerable.Repeat('\t', numTabs).ToArray());
8
w.b

答えは本当にあなたが望む複雑さに依存します。たとえば、すべてのインデントを縦線で囲むと、インデント文字列は次のように決定されます。

return new string(Enumerable.Range(0, indentSize*indent).Select(
  n => n%4 == 0 ? '|' : ' ').ToArray());
4
Dmitri Nesteruk

拡張メソッドを作成することができます

static class MyExtensions
{
    internal static string Repeat(this char c, int n)
    {
        return new string(c, n);
    }
}

それからあなたはこのようにそれを使うことができます

Console.WriteLine('\t'.Repeat(10));
2
ivan

間違いなく受け入れられている答えは、単一の文字を繰り返すための最善かつ最速の方法です。

Binoj Anthonyの答えは、文字列を繰り返すための単純で非常に効率的な方法です。

しかし、もう少しコードを気にしないのであれば、私の配列充填技法を使用して、これらのストリングをさらに高速で効率的に作成できます。私の比較テストでは、以下のコードはStringBuilder.Insertコードの約35%の時間で実行されました。

public static string Repeat(this string value, int count)
{
    var values = new char[count * value.Length];
    values.Fill(value.ToCharArray());
    return new string(values);
}

public static void Fill<T>(this T[] destinationArray, params T[] value)
{
    if (destinationArray == null)
    {
        throw new ArgumentNullException("destinationArray");
    }

    if (value.Length > destinationArray.Length)
    {
        throw new ArgumentException("Length of value array must not be more than length of destination");
    }

    // set the initial array value
    Array.Copy(value, destinationArray, value.Length);

    int copyLength, nextCopyLength;

    for (copyLength = value.Length; (nextCopyLength = copyLength << 1) < destinationArray.Length; copyLength = nextCopyLength)
    {
        Array.Copy(destinationArray, 0, destinationArray, copyLength, copyLength);
    }

    Array.Copy(destinationArray, 0, destinationArray, copyLength, destinationArray.Length - copyLength);
}

この配列充填手法の詳細については、 単一の値で配列を充填する最速の方法 を参照してください。

1
Grax

私は大丈夫です:

public static class Utils
{
    public static string LeftZerosFormatter(int zeros, int val)
    {
        string valstr = val.ToString();

        valstr = new string('0', zeros) + valstr;

        return valstr.Substring(valstr.Length - zeros, zeros);
    }
}
1
Ángel Ibáñez

そしてもう一つの方法

new System.Text.StringBuilder().Append('\t', 100).ToString()
1
Artyom

これを試して:

  1. Microsoft.VisualBasic参照を追加します。
  2. 使用:文字列result = Microsoft.VisualBasic.Strings.StrDup(5、 "hi");
  3. それがあなたのために働くかどうか私に知らせてください。
0
Toso Pankovski