space関数 - c# 文字列 回数
C#で文字を繰り返す最善の方法 (13)
\t
の文字列をC#で生成する最良の方法は何ですか?
私はC#を学んでいて、同じことを言うさまざまな方法で実験しています。
Tabs(uint t)
は、 \t
の量のstring
を返す関数です
たとえば、 Tabs(3)
は"\t\t\t"
返します"\t\t\t"
Tabs(uint numTabs)
を実装するこれらの3つの方法のどれが最適ですか?
もちろん、それは「最良の」という意味に依存します。
LINQのバージョンは2行だけでいいですね。 しかし、不必要に時間とリソースの消費を繰り返すと集約する呼び出しがありますか?
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;
}
.NETのすべてのバージョンで、文字列を繰り返すことができます:
public static string Repeat(string value, int count)
{
return new StringBuilder(value.Length * count).Insert(0, value, count).ToString();
}
文字を繰り返すには、 new String('\t', count)
が最善の策です。 share参照してください。
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' n回繰り返すことを望むとしましょう。
String.Empty.PadRight(n,'\t')
これはどうですか:
string tabs = new String('\t', n);
ここで、 n
は文字列を繰り返したい回数です。
またはより良い:
static string Tabs(int n)
{
return new String('\t', n);
}
これまでの提案とよく似ていますが、私はそれを単純にしておき、次のように適用したいと思います:
string MyFancyString = "*";
int strLength = 50;
System.Console.WriteLine(MyFancyString.PadRight(strLength, "*");
標準.Net本当に、
これを試して:
- Microsoft.VisualBasicリファレンスを追加
- 使用:ストリングresult = Microsoft.VisualBasic.Strings.StrDup(5、 "hi");
- それがあなたのために働くかどうか私に教えてください。
受け入れられる答えは、単一の文字を繰り返す最善の方法です。
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);
}
この配列の塗りつぶし手法の詳細については、配列に単一の値を入力する最速の方法を参照してください。
拡張メソッドを作成することができます
static class MyExtensions
{
internal static string Repeat(this char c, int n)
{
return new string(c, n);
}
}
次に、このように使用できます
Console.WriteLine('\t'.Repeat(10));
拡張メソッド:
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);
}
最高のバージョンは確かに組み込みの方法を使用することです:
string Tabs(int len) { return new string('\t', len); }
他のソリューションの中で最も簡単なものを選んでください。 これが遅すぎることが判明している場合にのみ、より効率的な解決策に努めます。
ナンセンス:もちろん、上記のコードはより効率的です。 StringBuilder
を使用してその結果の長さを事前に知っている場合は、適切なコンストラクタも使用してください。これは、時間のかかる割り当てが1回だけで、データの不要なコピーがないので、はるかに効率的です。
私はこの質問がすでに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(',');
返品
{"Hello"、 "Hello"、 "Hello"、 ""}
複雑にしないでおく。
答えは本当に複雑さに依存します。 たとえば、縦棒ですべてのインデントをアウトライン化したいので、インデント文字列は次のように決定されます。
return new string(Enumerable.Range(0, indentSize*indent).Select(
n => n%4 == 0 ? '|' : ' ').ToArray());
var str = new string(Enumerable.Repeat('\t', numTabs).ToArray());