これには理由がありますか?空の文字をたくさん使用する必要がある場合は、空の文字列をたくさん使用する場合と同じ状況になるため、私は質問しています。
編集:この使用法の理由はこれでした:
myString.Replace ('c', '')
したがって、myStringから'c'のすべてのインスタンスを削除します。
これには理由がありますか?空の文字をたくさん使用する必要がある場合は、空の文字列をたくさん使用する場合と同じ状況になるため、私は質問しています。
編集:この使用法の理由はこれでした:
myString.Replace ('c', '')
したがって、myStringから'c'のすべてのインスタンスを削除します。
空のcharのようなものはありません。あなたが得ることができる最も近いものは'\0'
、Unicodeの「ヌル」文字です。それを文字列リテラル内に埋め込んだり、それ自体を非常に簡単に表現したりできるとすると、なぜ別のフィールドが必要になるのでしょうか。""
同様に、「混乱しやすい" "
」という議論は当てはまりません'\0'
。
あなたがそれを使いたい場所とあなたがそれがより良いと思う理由の例を与えることができれば、それは役立つかもしれません...
この使用法の理由は次のとおりです。したがって、myStringから
myString.Replace ('c', '')
のすべてのインスタンスを削除します。'c'
文字列から特定の文字を削除するには、文字列のオーバーロードを使用できます。
myString = myString.Replace ("c", String.Empty);
あなたの声明
myString.Replace ('c', '\0')
文字を削除しません。それらを'\0'
(End-Of-String、EOS)に置き換えるだけで、さまざまな結果が得られます。一部の文字列操作は、EOSに遭遇すると停止する場合がありますが、.NETでは、ほとんどのアクションが他の文字と同じように処理します。'\0'
できるだけ避けるのが最善です。
文字列とは異なり、charは固定サイズの個別のものです。文字列は実際には文字のコンテナです。
したがって、Char.Emptyはそのコンテキストでは実際には意味がありません。あなたがcharを持っているなら、それは空ではありません。
空の文字などはありません。常に何かが含まれています。'\0'も文字です。
Char.MinValue
'\0'と同じように機能するものを使用します。ただし、と同じではないことに注意してString.Empty
ください。
null許容文字を使用できます。
char? c
文字列全体が必要ない場合は、実行の遅延を利用できます。
public static class StringExtensions
{
public static IEnumerable<char> RemoveChar(this IEnumerable<char> originalString, char removingChar)
{
return originalString.Where(@char => @char != removingChar);
}
}
複数のキャラクターを組み合わせることもできます...
string veryLongText = "abcdefghijk...";
IEnumerable<char> firstFiveCharsWithoutCsAndDs = veryLongText
.RemoveChar('c')
.RemoveChar('d')
.Take(5);
...そして最初の7文字だけが評価されます:)
編集:または、さらに良い:
public static class StringExtensions
{
public static IEnumerable<char> RemoveChars(this IEnumerable<char> originalString,
params char[] removingChars)
{
return originalString.Except(removingChars);
}
}
とその使用法:
var veryLongText = "abcdefghijk...";
IEnumerable<char> firstFiveCharsWithoutCsAndDs = veryLongText
.RemoveChars('c', 'd')
.Take(5)
.ToArray(); //to prevent multiple execution of "RemoveChars"
myString = myString.Replace('c'.ToString(), "");
OK、これは文字を削除するのに特にエレガントではありません。.Replaceメソッドには文字列パラメーターを受け取るオーバーロードがあるためです。ただし、これはキャリッジリターン、改行、タブなどを削除する場合に機能します。この例では、タブ文字を削除します。
myString = myString.Replace('\t'.ToString(), "");
あなたの質問への答えではありませんが、デフォルトを示すためにchar
あなたはただ使うことができます
default(char)
これは、とchar.MinValue
同じ\0
です。ただし、空の文字列のようなものには使用しないでください。
がないのと同じ理由int.Empty
。コンテナは空にすることができますが、スカラー値はできません。0(空ではない)を意味する場合は、を使用します'\0'
。あなたが意味するならnull
、それから使用してくださいnull
:)
charは値型であるため、その値をnullにすることはできません。(Nullableコンテナーにラップされている場合を除く)。
nullにすることはできないため、inには数値コードが含まれ、各コードはいくつかの文字にマップされます。
最初の質問には答えませんが、特定の問題については、文字の代わりに文字列を使用できますよね?:
myString.Replace("c", "")
あなたがそれをしたくない理由はありますか?
String.ReplaceのReplace(String、String)オーバーロードのドキュメントを見ると、備考セクションで、2番目の引数がtheの場合、null
指定したもののすべてのインスタンスが削除されることがわかります。したがって、使用するだけでは、文字列内のmyString = myString.Replace("c", null);
すべてが削除さc
れます。
削除したい文字を除いて、文字列を文字ごとに再構築することもできます。
これを行うための拡張メソッドは次のとおりです。
static public string RemoveAny(this string s, string charsToRemove)
{
var result = "";
foreach (var c in s)
if (charsToRemove.Contains(c))
continue;
else
result += c;
return result;
}
滑らかでも派手でもありませんが、うまく機能します。
このように使用します:
string newString = "My_String".RemoveAny("_"); //yields "MyString"
文字列内の空の文字を削除する場合は、次のように機能します。必要なデータ型表現に変換するだけです。
private void button1_Click(object sender, EventArgs e)
{
Int32 i;
String name;
Int32[] array_number = new int[100];
name = "1 3 5 17 8 9 6";
name = name.Replace(' ', 'x');
char[] chr = name.ToCharArray();
for (i = 0; i < name.Length; i++)
{
if ((chr[i] != 'x'))
{
array_number[i] = Convert.ToInt32(chr[i].ToString());
MessageBox.Show(array_number[i].ToString());
}
}
}
C#言語に関しては、次のことはあまり意味がないかもしれません。そして、これは質問に対する直接の答えではありません。しかし、以下は私のビジネスシナリオの1つで行ったことです。
char? myCharFromUI = Convert.ToChar(" ");
string myStringForDatabaseInsert = myCharFromUI.ToString().Trim();
if (String.IsNullOrEmpty(myStringForDatabaseInsert.Trim()))
{
Console.Write("Success");
}
私のプロジェクトでは、null
とwhite space
は異なるビジネスフローを持っていました。empty string
データベースに挿入するときに、空白の場合はデータベースに挿入する必要があります。
これはかなり古いことは知っていますが、最近、ファイル名を安全にするために複数の置換を行う必要があるという問題が発生しました。まず、最新の.NET string.Replace関数では、nullは空の文字と同等です。そうは言っても、.Netに欠けているのは、配列内の任意の文字を目的の文字に置き換えるすべてを単純に置き換えることです。以下のコードを自由に参照してください(テストのためにLinqPadで実行されます)。
// LinqPad .ReplaceAll and SafeFileName
void Main()
{
("a:B:C").Replace(":", "_").Dump(); // can only replace 1 character for one character => a_B_C
("a:B:C").Replace(":", null).Dump(); // null replaces with empty => aBC
("a:B*C").Replace(":", null).Replace("*",null).Dump(); // Have to chain for multiples
// Need a ReplaceAll, so I don't have to chain calls
("abc/123.txt").SafeFileName().Dump();
("abc/1/2/3.txt").SafeFileName().Dump();
("a:bc/1/2/3.txt").SafeFileName().Dump();
("a:bc/1/2/3.txt").SafeFileName('_').Dump();
//("abc/123").SafeFileName(':').Dump(); // Throws exception as expected
}
static class StringExtensions
{
public static string SafeFileName(this string value, char? replacement = null)
{
return value.ReplaceAll(replacement, ':','*','?','"','<','>', '|', '/', '\\');
}
public static string ReplaceAll(this string value, char? replacement, params char[] charsToGo){
if(replacement.HasValue == false){
return string.Join("", value.AsEnumerable().Where(x => charsToGo.Contains(x) == false));
}
else{
if(charsToGo.Contains(replacement.Value)){
throw new ArgumentException(string.Format("Replacement '{0}' is invalid. ", replacement), "replacement");
}
return string.Join("", value.AsEnumerable().Select(x => charsToGo.Contains(x) == true ? replacement : x));
}
}
}
特定の条件を満たす文字を削除する場合は、次を使用できます。
string s = "SoMEthInG";
s = new string(s.Where(c => char.IsUpper(c)).ToArray());
(これにより、文字列には大文字のみが残ります。)
つまり、文字列をとして「使用」し、IEnumerable<char>
変更を加えてから、上記のように文字列に変換し直すことができます。
繰り返しになりますが、これにより、ラムダ式のために特定の文字を削除できるだけでなく、次のようにラムダ式を変更すると削除できますc => c != 't'
。
Microsoftがファイルの先頭(少なくともXML)に追加する魔法の文字であるBOMはどうですか?
public static string QuitEscChars(this string s)
{
return s.Replace(((char)27).ToString(), "");
}
これが私たちのやり方です:myString.Replace('''.ToString()、 "");
使用する
myString.Replace ("c", "")
文字列から文字を包括的に削除する最も簡単な方法は、文字をトリミングすることです。
cl = cl.Trim(' ');
文字列内のすべてのスペースを削除します