c# - initialize - ¿Por qué no hay Char.Empty como String.Empty?
char vacio c# (19)
¿Hay alguna razón para esto? Lo pregunto porque si necesitaras usar muchos caracteres vacíos, te metes en la misma situación que usarías cuando usas muchos hilos vacíos.
Editar: La razón de este uso fue la siguiente:
myString.Replace (''c'', '''')
Así que elimine todas las instancias de ''c''s de myString.
¿Qué hay de BOM , el carácter mágico que Microsoft agrega al inicio de archivos (al menos XML)?
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 insertarlo en la base de datos, debo insertar una empty string
en la base de datos si es un espacio en blanco.
La forma más fácil de quitar un carácter de una cadena es recortarlo
cl = cl.Trim('' '');
Elimina todos los espacios en una cadena
No es una respuesta a su pregunta, pero para indicar un char
predeterminado que puede usar solo
default(char)
que es igual que char.MinValue
que a su vez es igual que /0
. Uno no debería usar si para algo como una cadena vacía sin embargo.
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 incrustar eso dentro de literales de cadena o expresarlo por sí mismo muy fácilmente, ¿por qué querría un campo separado para él? Igualmente, los argumentos "es fácil de confundir ""
y " "
no se aplican a ''/0''
.
Si pudiera dar un ejemplo de dónde querría usarlo y por qué cree que sería mejor, eso podría ayudar ...
No hay tal cosa como un personaje vacío. Siempre contiene algo . Incluso ''/ 0'' es un personaje.
No responde tu primera pregunta, pero para el problema específico que tuviste, puedes usar cadenas en lugar de caracteres, ¿no?
myString.Replace("c", "")
¿Hay alguna razón por la que no quieras hacer eso?
Podrías usar caracteres nullable .
char? c
Sé que este es bastante antiguo, pero recientemente tuve un problema con la necesidad de hacer varios reemplazos para hacer seguro el nombre de un archivo. Primero, en la última cadena de .NET. La función de reemplazo nula es el equivalente al carácter vacío. Dicho esto, lo que falta en .Net es un simple reemplazo de todo lo que reemplazará cualquier carácter en una matriz con el carácter deseado. No dude en consultar el código a continuación (se ejecuta en LinqPad para realizar pruebas).
// 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));
}
}
}
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úscula en la cadena).
En otras palabras, puede convertir la cadena a un IEnumerable<char>
, hacer cambios en ella y luego volver a convertirla en una cadena como se muestra arriba.
Nuevamente, 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 de esta manera: c => c != ''t''
.
Si desea eliminar el carácter de caracteres 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());
}
}
}
Si no necesita la cadena completa, puede aprovechar la ejecución demorada:
public static class StringExtensions
{
public static IEnumerable<char> RemoveChar(this IEnumerable<char> originalString, char removingChar)
{
return originalString.Where(@char => @char != removingChar);
}
}
Incluso puedes combinar varios personajes ...
string veryLongText = "abcdefghijk...";
IEnumerable<char> firstFiveCharsWithoutCsAndDs = veryLongText
.RemoveChar(''c'')
.RemoveChar(''d'')
.Take(5);
... y solo los primeros 7 caracteres serán evaluados :)
EDITAR: o, mejor aún:
public static class StringExtensions
{
public static IEnumerable<char> RemoveChars(this IEnumerable<char> originalString,
params char[] removingChars)
{
return originalString.Except(removingChars);
}
}
y su uso:
var veryLongText = "abcdefghijk...";
IEnumerable<char> firstFiveCharsWithoutCsAndDs = veryLongText
.RemoveChars(''c'', ''d'')
.Take(5)
.ToArray(); //to prevent multiple execution of "RemoveChars"
También puede reconstruir su cadena de caracteres por carácter, excluyendo los caracteres de los que desea deshacerse.
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 o elegante, pero funciona bien.
Use así:
string newString = "My_String".RemoveAny("_"); //yields "MyString"
Un char es un tipo de valor, por lo que su valor no puede ser nulo. (A menos que esté envuelto en un contenedor de Nullable).
Como no puede ser nulo, in contiene algún código numérico y cada código se asigna a algún carácter.
Un char, a diferencia de una cadena, es una cosa discreta 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.
Use Char.MinValue
que funciona igual que ''/ 0''. Pero ten cuidado, no es lo mismo que String.Empty
.
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 quiere decir 0 (que no está vacío), use ''/0''
. Si quieres decir null
, usa null
:)
utilizar
myString.Replace ("c", "")
myString = myString.Replace(''c''.ToString(), "");
De acuerdo, esto no es particularmente elegante para eliminar letras, ya que el método .Replace tiene una sobrecarga que toma parámetros de cadena. Pero esto funciona para eliminar retornos de carro, avances de línea, pestañas, etc. Este ejemplo elimina los caracteres de tabulación:
myString = myString.Replace(''/t''.ToString(), "");