文字列にはReplaceAt()
が含まれていません。私は、必要な機能を実行するためのちょっとした機能を少しぶつけています。私は、CPUのコストが高いと仮定しますが、最も簡単なアプローチのようなものになるだろう、それはすべてOK文字列内の指定されたインデックスの文字を置き換える?
答えて
はStringBuilder
を使用します。
StringBuilder sb = new StringBuilder(theString);
sb[index] = newChar;
theString = sb.ToString();
ああ、Stringbuilderはきちんとしています – Jason94
@ Jason94、これはJonの答えのようにToCharArrayを使うよりも効率的だとは思いますが、テストを実行してどちらが速いのかを確認する必要があります。 –
私は100k回の反復で少しのベンチマークを試みましたが、ToCharArrayは少なくとも2回速かったです。 –
string s = "ihj";
char[] array = s.ToCharArray();
array[1] = 'p';
s = new string(array);
受け入れられた答えの下のコメントは、このアプローチが2倍の速さであることを示しています。拡張方法にするためには – Dejan
ですので、文字列のサイズが小さい:
public static string ReplaceAt(this string input, int index, char newChar)
{
if (input == null)
{
throw new ArgumentNullException("input");
}
char[] chars = input.ToCharArray();
chars[index] = newChar;
return new string(chars);
}
これは現在、拡張メソッドであるあなたのように、使用することができます。
var foo = "hello".ReplaceAt(2, 'x');
Console.WriteLine(foo); // hexlo
それだけでデータの単一コピーを必要ないくつかの方法を考えていいだろうここでは2人ではなく作られることになっていますが、私はそれを行う方法についてはわかりません。これはそれを行うだろうと可能性です:
public static string ReplaceAt(this string input, int index, char newChar)
{
if (input == null)
{
throw new ArgumentNullException("input");
}
StringBuilder builder = new StringBuilder(input);
builder[index] = newChar;
return builder.ToString();
}
...私はそれは完全にあなたが使用しているフレームワークのバージョンに依存疑い。
+1。受け入れられた回答のコメントや他の回答でも触れたように、ToCharArray()メソッドはStringBuilderメソッドより高速です。 さらに改善が可能です:input.Count> index-1 && index> = 0をチェックします。そうしないと、chars [index]またはbuilder [index]を実行したときに例外が発生します。 –
文字列は不変オブジェクトであるので、あなたは、文字列内の指定された文字を置き換えることはできません。 あなたができることは、指定された文字を置き換えて新しい文字列を作成できることです。
しかし、あなたはStringBuilderを使用しない理由は、新しい文字列を作成するためにしている場合:私は突然、この作業を行うために必要とこのトピックを見つけ
string s = "abc";
StringBuilder sb = new StringBuilder(s);
sb[1] = 'x';
string newS = sb.ToString();
//newS = "axc";
public string ReplaceChar(string sourceString, char newChar, int charIndex)
{
try
{
// if the sourceString exists
if (!String.IsNullOrEmpty(sourceString))
{
// verify the lenght is in range
if (charIndex < sourceString.Length)
{
// Get the oldChar
char oldChar = sourceString[charIndex];
// Replace out the char ***WARNING - THIS CODE IS WRONG - it replaces ALL occurrences of oldChar in string!!!***
sourceString.Replace(oldChar, newChar);
}
}
}
catch (Exception error)
{
// for debugging only
string err = error.ToString();
}
// return value
return sourceString;
}
sourceString.Replace(oldChar、newChar)は、charIndexの文字だけでなく、文字列内のoldCharのすべてを置き換えます。 – EventHorizon
string err = error.ToString();どうして? –
を。私は.NET Frameworkの2を利用するために必要な最終的には
string instr = "Replace$dollar";
string outstr = instr.ReplaceAt(7, ' ');
ので、私はStringBuilder
クラスのバリアントを使用します。たとえば、
public static class Extensions
{
public static string ReplaceAt(this string value, int index, char newchar)
{
if (value.Length <= index)
return value;
else
return string.Concat(value.Select((c, i) => i == index ? newchar : c));
}
}
、その後: だから、これは私のLINQスタイルの変異体でありますしかし、。
長い文字列の場合、これは遅くならないでしょうか? 'StringBuilder'や' ToCharArray'ソリューションではなく、なぜこれを行うのですか? StringBuilderと比較して文字列のコピーが1つ少ないかもしれませんが、私は内部的に多くのことが起こると思います。 – ToolmakerSteve
プロジェクト(.csproj)は、安全でないコードは、おそらくこれが速いソリューションです許可する場合:
namespace System
{
public static class StringExt
{
public static unsafe void ReplaceAt(this string source, int index, char value)
{
if (source == null)
throw new ArgumentNullException("source");
if (index < 0 || index >= source.Length)
throw new IndexOutOfRangeException("invalid index value");
fixed (char* ptr = source)
{
ptr[index] = value;
}
}
}
}
あなたは文字列オブジェクトの拡張メソッドとしてそれを使用することができます。
もちろん、これは 'string'のセマンティクスに違反します - このオブジェクトへの他の参照に影響し、' string'オブジェクトが* immutable *であるという文書を無効化/矛盾させます。これを組み込みクラスに組み込むことは、非常に疑わしい(強いコードの匂い)。それに打たれた巨大なWARNINGコメントが必要です。個人的には、私はこれをしません**。誰かが*変更可能な文字列を必要とする場合は、適切なクラスを作成し、 'char []'をサブクラス化するか、またはラップします。 – ToolmakerSteve
- 1. 指定されたインデックスの文字列を別の文字列に置き換えます。
- 2. Java:文字列内の特定の文字をインデックスに置き換えます。
- 3. 指定された位置の文字列をPowerShellに置き換えます。
- 4. ベクトルに格納された文字列を文字に置き換えて文字を置き換えるC++
- 5. PHP文字列内の選択された文字を置き換えます。
- 6. 文字列内である文字を別の文字に置き換えたり、逆の文字を文字列に置き換えたりします。
- 7. 文字列内の1文字を別の文字列に置き換える
- 8. 文字列内の文字を置き換える方法
- 9. 文字列内の文字を置き換える?
- 10. 文字列内の文字列を特殊文字に置き換える
- 11. 指定された文字列以降のすべての文字を置換
- 12. Ruby:HTML文字列の指定されたURLを置き換えます。
- 13. 文字列内の文字を別の文字に置き換える方法
- 14. XSLT - 文字列内の文字数を置き換え
- 15. VBA - 文字列内の文字を置き換えます。
- 16. Javascript文字列内のutf文字を置き換えます
- 17. 文字列操作 - 文字列を指定した文字列に置き換えます
- 18. Java:特定の文字をインデックスの文字列の部分文字列に置き換えます。
- 19. 指定された文字数後に文字列を置換する方法
- 20. 返された文字列の文字列を置き換えます。
- 21. 文字列内の特定の文字を置き換えます
- 22. Javaは変数内の指定された値以外の文字列内の文字を置換します
- 23. SQL内の指定された文字列のアルファベットをゼロに置換する
- 24. pandas - 文字列内の1文字を大文字に置き換えます。
- 25. 文字列内の文字の置換
- 26. Javaで文字列を置き換えた後の文字列の長さ?
- 27. 指定された文字を除くすべての文字を*に置き換えてください
- 28. ファイル内の文字列+改行で文字列を置き換える
- 29. ファイル内の文字列を新しい文字列に置き換える
- 30. 次のようにキーワードを指定して文字列内の顔文字を置き換え
「持っていない」の代わりに「持っていない」という意味ではありませんか? :) – Abbas