¿Por qué no hay Char. Vacío como String.Empty?

¿Hay alguna razón para esto? Te pregunto porque si necesitas usar muchos caracteres vacíos, entonces te encuentras en la misma situación que si usaras muchas cadenas vacías.

Editar: El motivo de este uso fue este:

myString.Replace ('c', '') 

Por lo tanto, elimine todas las instancias de ‘c’s de myString.

No hay tal cosa como un char vacío. Lo más cercano que puede obtener es '\0' , el carácter “nulo” de Unicode. Dado que puede insertar eso dentro de cadenas literales o expresslo por sí mismo muy fácilmente, ¿por qué querría un campo separado para él? Igualmente, los argumentos “es fácil confundir "" y " " ” no se aplican a '\0' .

Si pudieras dar un ejemplo de dónde te gustaría usarlo y por qué crees que sería mejor, eso podría ayudar …

Un char, a diferencia de una cadena, es algo discreto con un tamaño fijo. Una cadena es realmente un contenedor de caracteres.

Entonces, Char.Empty realmente no tiene sentido en ese contexto. Si tienes un char, no está vacío.

No hay tal cosa como un personaje vacío. Siempre contiene algo . Incluso ‘\ 0’ es un personaje.

Use Char.MinValue que funciona igual que ‘\ 0’. Pero ten cuidado, no es lo mismo que String.Empty .

Podría usar caracteres nullables .

 char? c 

Si no necesita toda la cadena, puede aprovechar la ejecución retrasada:

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

Incluso puedes combinar varios personajes …

 string veryLongText = "abcdefghijk..."; IEnumerable firstFiveCharsWithoutCsAndDs = veryLongText .RemoveChar('c') .RemoveChar('d') .Take(5); 

… y solo los primeros 7 personajes serán evaluados 🙂

EDITAR: o, mejor aún:

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

y su uso:

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

la misma razón por la que no hay un int.Empty . Los contenedores pueden estar vacíos. Los valores escalares no pueden ser Si te refieres a 0 (que no está vacío), entonces usa '\0' . Si quieres decir null , entonces usa null 🙂

Un char es un tipo de valor, por lo que su valor no puede ser nulo. (A menos que esté envuelto en un contenedor Nullable).

Como no puede ser nulo, contiene un código numérico y cada código se asigna a un personaje.

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

OK, esto no es particularmente elegante para eliminar letras, ya que el método .Replace tiene una sobrecarga que toma los parámetros de cadena. Pero esto funciona para eliminar devoluciones de carro, avances de línea, tabs, etc. Este ejemplo elimina los caracteres de tabs:

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

No es una respuesta a su pregunta, sino para denotar un char predeterminado que puede usar solo

 default(char) 

que es lo mismo que char.MinValue que a su vez es igual a \0 . Sin embargo, uno no debería usar si es para algo así como una cadena vacía.

No responde tu primera pregunta, pero para el problema específico que tienes, puedes usar cadenas en lugar de caracteres, ¿verdad?

 myString.Replace("c", "") 

Hay una razón por la que no querrías hacer eso?

También puede reconstruir su cadena carácter por carácter, excluyendo los caracteres que desea eliminar.

Aquí hay un método de extensión para hacer esto:

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

No es elegante ni elegante, pero funciona bien.

Use esto:

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

La forma más fácil de eliminar un personaje de una cuerda es recortarlo

cl = cl.Trim(' ');

Elimina todos los espacios en una cadena

¿Qué hay de BOM , el personaje mágico que Microsoft agrega al inicio de los archivos (al menos XML)?

Si quiere eliminar el char vacío en la cadena, funcionará lo siguiente, simplemente convierta a cualquier representación de tipo de datos que desee. Gracias,

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

En términos de lenguaje C #, lo siguiente puede no tener mucho sentido. Y esta no es una respuesta directa a la pregunta. Pero fowlloing es lo que hice en uno de mis escenarios de negocios

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

El white space null y white space tenía diferentes flujos de negocios en mi proyecto. Al insertar en la base de datos, necesito insertar una empty string en la base de datos si es un espacio en blanco.

Sé que este es bastante viejo, pero recientemente me encontré con un problema al tener que hacer múltiples reemplazos para hacer que el nombre de un archivo sea seguro. Primero, en la última cadena .NET. La función Reemplazar null es el equivalente a un carácter vacío. Habiendo dicho eso, lo que falta en .Net es un simple reemplazo que reemplazará a cualquier personaje en una matriz con el carácter deseado. Por favor, siéntase libre de hacer referencia al siguiente código (se ejecuta en LinqPad para probar).

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

utilizar

 myString.Replace ("c", "") 

Si desea eliminar caracteres que satisfacen una condición específica, puede usar esto:

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

(Esto dejará solo los caracteres en mayúsculas en la cadena).

En otras palabras, puede convertir la cadena en un IEnumerable , hacer cambios en él y luego convertirlo a una cadena como se muestra arriba.

De nuevo, esto permite no solo eliminar un carácter específico debido a la expresión lambda, aunque puede hacerlo si cambia la expresión lambda así: c => c != 't' .