C#で\t
の文字列を生成するための最良の方法は何ですか
私はC#を学び、同じことを言う異なる方法を試しています。
Tabs(uint t)
は、string
の量の\t
を持つt
を返す関数です。
例えばTabs(3)
は"\t\t\t"
を返します
Tabs(uint numTabs)
を実装するためのこれらの3つの方法のうちどれが最良ですか?
もちろん、それは「最善」の意味によって異なります。
LINQバージョンはたった2行で、これはいいですね。しかし、Repeat and Aggregateの呼び出しは不必要に時間やリソースを消費しますか?
StringBuilder
のバージョンは非常に明確ですが、StringBuilder
クラスはどういうわけか遅くなりますか?
string
バージョンは基本的なものです。つまり、理解するのは簡単です。
それはまったく問題ではありませんか?それらはすべて等しいですか?
これらはすべて、私が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;
}
これはどうですか:
string tabs = new String('\t', n);
n
は、文字列を繰り返す回数です。
またはそれ以上:
static string Tabs(int n)
{
return new String('\t', n);
}
string.Concat(Enumerable.Repeat("ab", 2));
返品
「アバブ」
そして
string.Concat(Enumerable.Repeat("a", 2));
返品
"ああ"
から...
.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による答え を参照してください。
最良のバージョンは確かに組み込みの方法を使用することです。
string Tabs(int len) { return new string('\t', len); }
他の解決策のうち、最も簡単なものを好みます。これが遅すぎることが判明した場合のみ、より効率的な解決策を模索してください。
ナンセンス:もちろん上記のコードはより効率的です。StringBuilder
を使用し、その結果の長さを前もって知っている場合は、適切なコンストラクタも使用すると、時間のかかる割り当てが1回だけ行われ、不要なデータのコピーが行われないため、はるかに効率的です。
拡張メソッド
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);
}
拡張メソッドを使うのはどうですか?
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))//文字列バージョン
これはどう:
//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));
私はこの質問がすでに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(',');
返品
{"こんにちは"、 "こんにちは"、 "こんにちは"、 ""}
複雑にしないでおく。
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));
}
'\ t'を何回も繰り返したいとしましょう。
String.Empty.PadRight(n,'\t')
String.Concat
およびEnumerable.Repeat
を使用すると、String.Join
を使用するよりも安価になります。
public static Repeat(this String pattern, int count)
{
return String.Concat(Enumerable.Repeat(pattern, count));
}
var str = new string(Enumerable.Repeat('\t', numTabs).ToArray());
答えは本当にあなたが望む複雑さに依存します。たとえば、すべてのインデントを縦線で囲むと、インデント文字列は次のように決定されます。
return new string(Enumerable.Range(0, indentSize*indent).Select(
n => n%4 == 0 ? '|' : ' ').ToArray());
拡張メソッドを作成することができます
static class MyExtensions
{
internal static string Repeat(this char c, int n)
{
return new string(c, n);
}
}
それからあなたはこのようにそれを使うことができます
Console.WriteLine('\t'.Repeat(10));
間違いなく受け入れられている答えは、単一の文字を繰り返すための最善かつ最速の方法です。
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);
}
この配列充填手法の詳細については、 単一の値で配列を充填する最速の方法 を参照してください。
私は大丈夫です:
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);
}
}
そしてもう一つの方法
new System.Text.StringBuilder().Append('\t', 100).ToString()
これを試して: