web-dev-qa-db-ja.com

なぜString.EmptyのようなChar.Emptyがないのですか?

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

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

myString.Replace ('c', '')

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

234
Joan Venge

空の文字のようなものはありません。一番近いのはUnicodeの "null"文字である'\0'です。あなたがそれを文字列リテラルの中に埋め込むことができるか、あるいは非常に簡単にそれ自身で表現することができるとしたら、なぜあなたはそれのために別のフィールドが欲しいと思いますか?同様に、「""" "を混同しやすい」という引数は、'\0'には適用されません。

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

248
Jon Skeet

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

そのため、Char.Emptyはその意味では意味がありません。あなたがcharを持っているなら、それは空ではありません。

76
Joe

空文字のようなものはありません。それは常にsomethingを含みます。 '\ 0'でも文字です。

30

Char.MinValueを使ってください。これは '\ 0'と同じ働きをします。しかしString.Emptyと同じではないことに注意してください。

24
Aliostad

あなたは null許容 charsを使うことができます。

char? c
19
paquetp

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

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"
10
Notoriousxl

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

6
tenfour

Charは値型なので、その値をnullにすることはできません。 (Nullableコンテナにラップされていない限り).

Nullにすることはできないため、inには数値コードが含まれ、各コードは文字にマッピングされています。

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

.Replaceメソッドは文字列パラメータを受け取るオーバーロードを持っているので、これは文字を削除するのに特に優雅ではありません。しかし、これはキャリッジリターン、ラインフィード、タブなどを削除するのに役立ちます。この例ではタブ文字を削除します。

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

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

default(char)

これはchar.MinValueと同じで、\0と同じです。空の文字列のようなものにはifを使うべきではありません。

4
nawfal

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

myString.Replace("c", "")

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

1
Ian Grainger

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

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

    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"
1
C. Tewalt

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

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

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

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

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

0
florien

文字列から文字を取り除くための最も簡単な方法は、それをトリミングすることです。

cl = cl.Trim(' ');

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

0
MrSmudge

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

0
Arto Viitanen

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

    }

}
0
Jim

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

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

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

0
Lijo

文字列の空の文字を削除したい場合は、次のように動作します。必要なデータ型表現に変換するだけです。おかげで、

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

        }

    }