[c#] String.EmptyのようなChar.Emptyがないのはなぜですか?


9 Answers

あなたの声明

 myString.Replace ('c', '\0')

文字を削除しません。 '\0' (End-of-String、EOS)で置き換えられ、さまざまな結果がもたらされます。 一部の文字列操作はEOSに遭遇すると停止することがありますが、.NETではほとんどのアクションが他の文字と同様に扱います。 可能な限り'\0'を避ける'\0'ベストです。

この使用の理由は次のとおりですmyString.Replace ('c', '')したがって、myStringから'c'すべてのインスタンスを削除します。

文字列から特定の文字を削除するには、文字列overloadを使用します。

 myString = myString.Replace ("c", String.Empty);
Question

これには理由がありますか? 空の文字列をたくさん使用する必要がある場合は、空の文字列をたくさん使用するときと同じ状況になるため、私は尋ねています。

編集:この使用の理由はこれでした:

myString.Replace ('c', '')

したがって、myStringから 'c'のすべてのインスタンスを削除します。




あなたの最初の質問に答えることはできませんが、特定の問題については文字列の代わりに文字列を使うことができます。

myString.Replace("c", "")

あなたがそれをしたくない理由がありますか?




私はこれがかなり古くなっていることを知っていますが、ファイル名を安全にするために複数の置換えをしなければならないという問題が最近発生しました。 まず、最新の.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));
        }

    }

}



myString = myString.Replace('c'.ToString(), "");

これは、.Replaceメソッドが文字列パラメータを受け取るオーバーロードを持っているため、文字を削除するのに特に優雅ではありません。 しかし、これは復帰改行、ラインフィード、タブなどを削除するために機能します。この例ではタブ文字を削除します:

myString = myString.Replace('\t'.ToString(), "");



文字列中の空の文字を削除する場合は、次のようになります。必要なデータ型の表現に変換するだけです。 ありがとう、

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());
            }

        }

    }



文字列から文字を取り除く最も簡単な方法は、それをトリムすることです

cl = cl.Trim(' ');

文字列内のすべてのスペースを削除します。




同じ理由でint.Emptyがありません。 コンテナは空にすることができます。 スカラー値は、できません。 0(空ではない)を意味する場合は、 '\0'使用します。 nullを意味するなら、 nullを使用してください:)




nullable文字を使用できます。

char? c



特定の条件を満たす文字を削除するには、次のようにします。

string s = "SoMEthInG";
s = new string(s.ToCharArray().Where(c => char.IsUpper(c)).ToArray());

(これにより、文字列には大文字だけが残されます)。

言い換えれば、文字列をIEnumerable<char>に変換し、それを変更して上に示したように文字列に変換することができます。

この場合も、ラムダ式のために特定のcharを削除するだけでなく、次のようにラムダ式を変更することもできますc => c != 't'




空の文字はありません。 それは常に何かを含んでいます 。 '\ 0'でも文字です。




Related