問題タブ [stringbuilder]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
4 に答える
3384 参照

vb.net - Stringbuilder の内容を返す

些細なことは知っているが、ただ興味がある

内容を返したいstringbuilder変数がありますが、空の場合は「|」を返したいので、比較ステートメントでstringbuilder.tostringを使用するのが最善ですか?

または、それを文字列に変換して比較するのが最善ですか?

0 投票する
5 に答える
67435 参照

.net - String.Join と StringBuilder: どちらが速いですか?

を CSV 形式にフォーマットすることに関する以前の質問では、 を使用するとを使用するよりも高速であることが示唆されました。これは本当ですか?double[][]StringBuilderString.Join

0 投票する
3 に答える
6251 参照

pinvoke - P / Invoke with [Out] StringBuilder / LPTSTRおよびマルチバイト文字:文字化けしたテキスト?


P / Invokeを使用して、アンマネージDLLから(とりわけ)文字列をフェッチしようとしていますが、何を試しても文字列が文字化けします。

私はネイティブのWindowsコーダーではないので、文字エンコードビットについてはよくわかりません。DLLは「マルチバイト文字セット」を使用するように設定されていますが、これは変更できません(他のプロジェクトが破損するため)。ラッパー関数を追加して、既存のクラスからデータを抽出しようとしています。問題の文字列は現在CStringとして存在し、マネージドStringBuilderに取得することを期待して、LPTSTRにコピーしようとしています。

これは私が正しいと信じていることです(私は明らかに無関係なビットを削除しました):




ヒントを本当に感謝します!ありがとう!!!

0 投票する
5 に答える
18761 参照

java - Java StringBuilder とスレッド セーフ

複数の部分から文字列を作成していて、どちらStringBufferかを使用したい、または使用したいStringBuilder。Java 5 docs から、可能な場合はそれが推奨されることがわかりますが、次StringBuilderの点に注意してください。

のインスタンスはStringBuilder、複数のスレッドで安全に使用できません。

StringBuilderこのステートメントから、単一のインスタンスを複数のスレッドで共有するべきではないことがわかります。しかし、次の場合はどうでしょうか。

ここでは、StringBuilderクラスを同時に使用して関数内に同時に複数のスレッドが存在する可能性がありますが (たとえば、静的変数が存在する場合は、その変数への同時アクセスなど)、各スレッドは独自のStringBuilder. ドキュメントから、これが複数のスレッドによる使用としてカウントされるかどうかを判断することはできません。

0 投票する
9 に答える
52249 参照

c# - StringBuilder.AppendとStringBuilder.AppendFormat

StringBuilderについて疑問に思っていたのですが、コミュニティが説明できるようになることを望んでいた質問があります。

コードの読みやすさを忘れましょう。これらのうちどれが速いのか、そしてその理由は何ですか?

StringBuilder.Append

StringBuilder.AppendFormat

0 投票する
12 に答える
84783 参照

c# - StringBuilder を文字列の先頭に追加するにはどうすればよいですか?

を使用して文字列を追加できることはわかっていますStringBuilder。文字列を先頭に追加する (つまり、文字列の前に文字列を追加する) 方法はありStringBuilderますStringBuilderか?

0 投票する
8 に答える
6657 参照

c# - 文字列の連結はC#では安全ではありません。StringBuilderを使用する必要がありますか?

私の質問はこれです: C#での文字列の連結は安全ですか?文字列の連結によって予期しないエラーが発生し、StringBuilderを使用してその文字列の連結を置き換えると、それらのエラーが消える場合、それは何を示しているのでしょうか。

背景:私は小さなコマンドラインC#アプリケーションを開発しています。コマンドライン引数を取り、少し複雑なSQLクエリを実行し、約1300行のデータをフォーマットされたXMLファイルに出力します。

私の最初のプログラムは、デバッグモードでは常に正常に実行されます。ただし、リリースモードでは、約750番目のSQL結果に到達し、エラーで終了します。エラーは、SqlDataReaderオブジェクトのRead()メソッドがtrueを返しただけでも、データの特定の列を読み取ることができなかったことです。

この問題は、以前は「string1+string2」があったコード内のすべての操作にStringBuilderを使用することで修正されました。StringBuilderがすでに使用されているSQLクエリループ内の文字列連結については話していません。コードの前半で、2つまたは3つの短い文字列変数間の単純な連結について話しています。

C#は、いくつかの文字列を一緒に追加するためのメモリ管理を処理するのに十分スマートであるという印象を受けました。私が間違っている?それとも、これは他の種類のコードの問題を示していますか?

0 投票する
7 に答える
1642 参照

c# - インターンされた文字列を使用した C# での文字列連結

私はこの質問行われたことを知っていますが、少し違ったひねりを加えています。これは時期尚早の最適化であると指摘する人もいますが、実用性と実用性のみを求めているのであれば、これは完全に真実です。私の問題は実際的な問題に根ざしていますが、それでもまだ興味があります。


データベーススキーマ(簡単に何百ものテーブル、ビューなど)を再作成するためのスクリプトを作成する(ディスクに保存されるように)一連のSQLステートメントを作成しています。これは、私の文字列連結が追加専用であることを意味します。MSDN によると、StringBuilder は、内部バッファー (確実に char[]) を保持し、文字列文字をそこにコピーして、必要に応じて配列を再割り当てすることで機能します。

ただし、私のコードには多くの繰り返し文字列 ("CREATE TABLE ["、"GO\n" など) があります。つまり、それらがインターンされていることを利用できますが、毎回コピーされるため、StringBuilder を使用する場合はそうではありません。唯一の変数は、本質的にテーブル名であり、既にメモリ内にある他のオブジェクトの文字列として既に存在しています。

つまり、データが読み込まれ、スキーマ情報を保持するオブジェクトが作成された後、すべての文字列情報をインターンによって再利用できるということです。

それを仮定すると、インターンされた文字列へのポインターを保持するため、文字列の List または LinkedList の方が高速ではないでしょうか? 次に、正確に正しい長さの文字列全体の単一のメモリ割り当てに対して String.Concat() を 1 回呼び出すだけです。

リストはインターンされたポインターの string[] を再​​割り当てする必要があり、リンクされたリストはノードを作成してポインターを変更する必要があるため、「自由に」行うことはできませんが、何千ものインターンされた文字列を連結している場合、それらは彼らがより効率的であるように。

ここで、各 SQL ステートメントの文字カウントに関するヒューリスティックを考え出し、各タイプをカウントして、大まかなアイデアを得て、char[] の再割り当てを避けるために StringBuilder の容量を事前に設定できると思いますが、かなりのマージンでオーバーシュートする必要があります。再割り当ての可能性を減らします。

したがって、この場合、連結された単一の文字列を取得するのに最も速いのは次のとおりです。

  • StringBuilder
  • インターンされた文字列の List<string>
  • インターンされた文字列の LinkedList<string>
  • 容量ヒューリスティックを使用した StringBuilder
  • 他の何か?

上記に対する別の質問(私は常にディスクにアクセスするとは限りません) として: 出力ファイルへの単一の StreamWriter はさらに高速でしょうか? または、List または LinkedList を使用してから、最初にメモリ内で連結する代わりに、リストからファイルに書き込みます。

編集: 要求に応じて、MSDN への参照(.NET 3.5)。「空きがある場合は新しいデータがバッファの末尾に追加されます。そうでない場合は、新しい大きなバッファが割り当てられ、元のバッファのデータが新しいバッファにコピーされ、新しいデータが新しいバッファに追加されます。バッファ。" 私にとっては、それを大きくするために再割り当てされた char[] を意味し (古いデータをサイズ変更された配列にコピーする必要があります)、追加します。