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.
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 ...
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.
Il n'y a pas de personnage vide. Il contient toujours quelque chose. Même '\ 0' est un caractère.
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
.
Vous pouvez utiliser nullable chars.
char? c
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"
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
:)
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(), "");
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.
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.
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?
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"
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'
.
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
Que diriez-vous de BOM , le caractère magique que Microsoft ajoute au début des fichiers (au moins XML)?
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));
}
}
}
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.
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());
}
}
}