web-dev-qa-db-fra.com

Pourquoi n'y a-t-il pas de Char.Empty comme String.Empty?

Y a-t-il une raison à cela? Je demande parce que si vous aviez besoin d'utiliser beaucoup de caractères vides, alors vous vous retrouvez dans la même situation que lorsque vous utilisez beaucoup de chaînes vides.

Edit: La raison de cet usage était la suivante:

myString.Replace ('c', '')

Donc, supprimez toutes les occurrences de 'c's de myString.

239
Joan Venge

Il n'y a pas de personnage vide. Le plus proche que vous pouvez obtenir est '\0', le caractère Unicode "null". Étant donné que vous pouvez intégrer cela dans des littéraux de chaîne ou l'exprimer très facilement, pourquoi voudriez-vous un champ distinct pour celui-ci? De même, les arguments "il est facile de confondre "" et " "" ne s'appliquent pas à '\0'.

Si vous pouviez donner un exemple de l'endroit où vous voudriez l'utiliser et pourquoi vous pensez que ce serait mieux, cela pourrait aider ...

253
Jon Skeet

Un caractère, contrairement à une chaîne, est une chose discrète avec une taille fixe. Une chaîne est vraiment un conteneur de caractères.

Donc, Char.Empty n'a pas vraiment de sens dans ce contexte. Si vous avez un personnage, il n'est pas vide.

78
Joe

Il n'y a pas de personnage vide. Il contient toujours quelque chose. Même '\ 0' est un caractère.

30
Philippe Leybaert

Utilisez Char.MinValue qui fonctionne de la même manière que '\ 0'. Mais attention, ce n'est pas la même chose que String.Empty.

25
Aliostad

Vous pouvez utiliser nullable chars.

char? c
19
paquetp

Si vous n'avez pas besoin de toute la chaîne, vous pouvez tirer parti de l'exécution différée:

public static class StringExtensions
{
    public static IEnumerable<char> RemoveChar(this IEnumerable<char> originalString, char removingChar)
    {
        return originalString.Where(@char => @char != removingChar);
    }
}

Vous pouvez même combiner plusieurs personnages ...

string veryLongText = "abcdefghijk...";

IEnumerable<char> firstFiveCharsWithoutCsAndDs = veryLongText
            .RemoveChar('c')
            .RemoveChar('d')
            .Take(5);

... et seuls les 7 premiers caractères seront évalués :)

EDIT: ou encore mieux:

public static class StringExtensions
{
    public static IEnumerable<char> RemoveChars(this IEnumerable<char> originalString,
        params char[] removingChars)
    {
        return originalString.Except(removingChars);
    }
}

et son utilisation:

        var veryLongText = "abcdefghijk...";
        IEnumerable<char> firstFiveCharsWithoutCsAndDs = veryLongText
            .RemoveChars('c', 'd')
            .Take(5)
            .ToArray(); //to prevent multiple execution of "RemoveChars"
10
Notoriousxl

pour la même raison, il n'y a pas de int.Empty. Les conteneurs peuvent être vides. Les valeurs scalaires ne peuvent pas être. Si vous voulez dire 0 (ce qui n'est pas vide), utilisez '\0'. Si vous voulez dire null, utilisez null :)

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

OK, cela n’est pas particulièrement élégant pour supprimer des lettres, car la méthode .Replace a une surcharge qui prend des paramètres de chaîne. Mais cela fonctionne pour supprimer les retours à la ligne, les sauts de ligne, les tabulations, etc. Cet exemple supprime les caractères de tabulation:

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

Un caractère est un type de valeur, sa valeur ne peut donc pas être null. (Sauf si elle est emballée dans un conteneur Nullable).

Comme il ne peut pas être nul, contient un code numérique et chaque code est associé à un caractère.

5
epotter

Pas une réponse à votre question, mais pour désigner une valeur par défaut char vous pouvez simplement utiliser

default(char)

qui est identique à char.MinValue qui à son tour est identique à \0. Cependant, il ne faut pas utiliser si quelque chose ressemble à une chaîne vide.

4
nawfal

Ne répondez pas à votre première question - mais pour le problème spécifique que vous avez eu, vous pouvez simplement utiliser des chaînes de caractères au lieu de caractères, non?:

myString.Replace("c", "")

Il y a une raison pour laquelle vous ne voudriez pas faire ça?

1
Ian Grainger

Vous pouvez également reconstruire votre chaîne caractère par caractère, en excluant les caractères dont vous souhaitez vous débarrasser.

Voici une méthode d'extension pour faire cela:

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

Ce n'est pas lisse ou fantaisie, mais cela fonctionne bien.

Utilisez comme ceci:

string newString = "My_String".RemoveAny("_"); //yields "MyString"
1
C. Tewalt

Si vous souhaitez supprimer des caractères répondant à une condition spécifique, vous pouvez utiliser ceci:

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

(Cela ne laissera que les caractères majuscules dans la chaîne.)

En d'autres termes, vous pouvez convertir la chaîne en IEnumerable<char>, y apporter des modifications, puis la reconvertir en chaîne, comme indiqué ci-dessus.

Là encore, cela permet non seulement de supprimer un caractère spécifique à cause de l'expression lambda, bien que vous puissiez le faire si vous modifiez l'expression lambda comme ceci: c => c != 't'.

0
florien

Le moyen le plus simple de supprimer un caractère de la chaîne consiste à le rogner

cl = cl.Trim(' ');

Supprime tous les espaces d'une chaîne

0
MrSmudge

Que diriez-vous de BOM , le caractère magique que Microsoft ajoute au début des fichiers (au moins XML)?

0
Arto Viitanen

Je sais que celui-ci est assez ancien, mais j'ai récemment rencontré un problème lié à la nécessité d'effectuer plusieurs remplacements pour sécuriser un nom de fichier. Tout d’abord, dans la dernière fonction .NET string.Replace, la fonction null est l’équivalent du caractère vide. Cela dit, ce qui manque à .Net, c’est un simple remplacement de tout ce qui remplacera tout caractère d’un tableau par le caractère souhaité. N'hésitez pas à faire référence au code ci-dessous (fonctionne dans LinqPad pour les tests).

// 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

En termes de langage C #, ce qui suit n’a peut-être pas beaucoup de sens. Et ce n'est pas une réponse directe à la question. Mais ce que je faisais dans un de mes scénarios commerciaux

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

Les variables null et white space avaient des flux d'activité différents dans mon projet. Lors de l'insertion dans la base de données, je dois insérer empty string dans la base de données s'il s'agit d'un espace blanc.

0
Lijo

si vous souhaitez éliminer le caractère vide dans la chaîne, les opérations suivantes fonctionneront, convertissez-les simplement en toute représentation de type de données de votre choix. Merci,

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

        }

    }
0