297

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

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

myString.Replace ('c', '')

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

4

23 に答える 23

302

空のcharのようなものはありません。あなたが得ることができる最も近いものは'\0'、Unicodeの「ヌル」文字です。それを文字列リテラル内に埋め込んだり、それ自体を非常に簡単に表現したりできるとすると、なぜ別のフィールドが必要になるのでしょうか。""同様に、「混乱しやすい" "」という議論は当てはまりません'\0'

あなたがそれを使いたい場所とあなたがそれがより良いと思う理由の例を与えることができれば、それは役立つかもしれません...

于 2010-09-08T17:45:56.567 に答える
195

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

文字列から特定の文字を削除するには、文字列のオーバーロードを使用できます。

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

あなたの声明

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

文字を削除しません。それらを'\0'(End-Of-String、EOS)に置き換えるだけで、さまざまな結果が得られます。一部の文字列操作は、EOSに遭遇すると停止する場合がありますが、.NETでは、ほとんどのアクションが他の文字と同じように処理します。'\0'できるだけ避けるのが最善です。

于 2010-09-08T18:07:47.023 に答える
96

文字列とは異なり、charは固定サイズの個別のものです。文字列は実際には文字のコンテナです。

したがって、Char.Emptyはそのコンテキストでは実際には意味がありません。あなたがcharを持っているなら、それは空ではありません。

于 2010-09-08T17:46:53.943 に答える
36

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

于 2010-09-08T17:46:37.137 に答える
33

Char.MinValue'\0'と同じように機能するものを使用します。ただし、と同じではないことに注意してString.Emptyください。

于 2010-09-08T17:48:15.127 に答える
19

null許容文字を使用できます。

char? c
于 2010-09-08T17:54:25.333 に答える
13

文字列全体が必要ない場合は、実行の遅延を利用できます。

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"
于 2010-09-08T19:17:16.243 に答える
12
myString = myString.Replace('c'.ToString(), "");

OK、これは文字を削除するのに特にエレガントではありません。.Replaceメソッドには文字列パラメーターを受け取るオーバーロードがあるためです。ただし、これはキャリッジリターン、改行、タブなどを削除する場合に機能します。この例では、タブ文字を削除します。

myString = myString.Replace('\t'.ToString(), "");
于 2011-05-21T00:12:39.503 に答える
9

あなたの質問への答えではありませんが、デフォルトを示すためにcharあなたはただ使うことができます

default(char)

これは、とchar.MinValue同じ\0です。ただし、空の文字列のようなものには使用しないでください。

于 2013-02-04T09:53:43.347 に答える
7

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

于 2010-09-08T17:51:36.960 に答える
6

charは値型であるため、その値をnullにすることはできません。(Nullableコンテナーにラップされている場合を除く)。

nullにすることはできないため、inには数値コードが含まれ、各コードはいくつかの文字にマップされます。

于 2010-09-08T17:53:41.670 に答える
3

最初の質問には答えませんが、特定の問題については、文字の代わりに文字列を使用できますよね?:

myString.Replace("c", "")

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

于 2013-01-29T16:24:04.203 に答える
3

String.ReplaceのReplace(String、String)オーバーロードのドキュメントを見ると、備考セクションで、2番目の引数がtheの場合、null指定したもののすべてのインスタンスが削除されることがわかります。したがって、使用するだけでは、文字列内のmyString = myString.Replace("c", null);すべてが削除さcれます。

于 2021-07-23T07:30:15.183 に答える
2

削除したい文字を除いて、文字列を文字ごとに再構築することもできます。

これを行うための拡張メソッドは次のとおりです。

    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"
于 2015-09-02T14:12:21.103 に答える
1

文字列内の空の文字を削除する場合は、次のように機能します。必要なデータ型表現に変換するだけです。

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());
        }
    }
}
于 2013-06-26T13:48:39.790 に答える
1

C#言語に関しては、次のことはあまり意味がないかもしれません。そして、これは質問に対する直接の答えではありません。しかし、以下は私のビジネスシナリオの1つで行ったことです。

char? myCharFromUI = Convert.ToChar(" ");
string myStringForDatabaseInsert = myCharFromUI.ToString().Trim();
if (String.IsNullOrEmpty(myStringForDatabaseInsert.Trim()))
{
    Console.Write("Success");
}

私のプロジェクトでは、nullwhite spaceは異なるビジネスフローを持っていました。empty stringデータベースに挿入するときに、空白の場合はデータベースに挿入する必要があります。

于 2013-09-05T10:16:14.043 に答える
1

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

    }

}
于 2015-02-27T15:18:16.350 に答える
1

特定の条件を満たす文字を削除する場合は、次を使用できます。

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

(これにより、文字列には大文字のみが残ります。)

つまり、文字列をとして「使用」し、IEnumerable<char>変更を加えてから、上記のように文字列に変換し直すことができます。

繰り返しになりますが、これにより、ラムダ式のために特定の文字を削除できるだけでなく、次のようにラムダ式を変更すると削除できますc => c != 't'

于 2016-06-26T16:49:37.560 に答える
0

Microsoftがファイルの先頭(少なくともXML)に追加する魔法の文字であるBOMはどうですか?

于 2010-09-10T05:02:19.300 に答える
0
public static string QuitEscChars(this string s) 
{
    return s.Replace(((char)27).ToString(), "");
}
于 2020-07-30T12:08:31.657 に答える
0

これが私たちのやり方です:myString.Replace('''.ToString()、 "");

于 2022-01-23T17:39:13.647 に答える
-3

使用する

myString.Replace ("c", "")
于 2016-01-26T06:30:45.900 に答える
-4

文字列から文字を包括的に削除する最も簡単な方法は、文字をトリミングすることです。

cl = cl.Trim(' ');

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

于 2017-09-04T11:07:06.880 に答える