¿Por qué no hay Char.Vacío como Una Cuerda.¿Vacío?


Hay una razón para esto? Estoy preguntando porque si necesitabas usar muchos caracteres vacíos, entonces te metes en la misma situación que lo harías cuando usas muchas cadenas vacías.

Editar: La razón de este uso fue esta:

myString.Replace ('c', '')

Así que elimina todas las instancias de 'c' de myString.

Author: JohnOsborne, 2010-09-08

19 answers

No hay tal cosa como un char vacío. Lo más cercano que puede obtener es '\0', el carácter Unicode "null". 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? Del mismo modo, los argumentos" es fácil confundir "" y " " " no se aplican para '\0'.

Si pudiera dar un ejemplo de dónde querría usarlo y por qué cree que sería mejor, eso podría ayudar...

 221
Author: Jon Skeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-27 19:32:31

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.Vacío realmente no tiene sentido en ese contexto. Si tienes un carbón, no está vacío.

 69
Author: Joe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-08 17:46:53

No hay tal cosa como un carácter vacío. Siempre contiene algo. Incluso '\0 ' es un carácter.

 25
Author: Philippe Leybaert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-08 17:46:37

Puedes usar caracteres nullables.

char? c
 19
Author: paquetp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-08 17:54:25

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

 19
Author: Aliostad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-28 11:08:16

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

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

Incluso puede combinar varios caracteres...

string veryLongText = "abcdefghijk...";

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

... y solo se evaluarán los primeros 7 caracteres:)

EDITAR: o, aún mejor:

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"
 10
Author: Notoriousxl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-09 19:08:15

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), utilice '\0'. Si se refiere a null, utilice null :)

 4
Author: tenfour,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-08 17:51:36

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

Dado que no puede ser null, in contiene algún código numérico y cada código se asigna a algún carácter.

 4
Author: epotter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-08 17:53:41
myString = myString.Replace('c'.ToString(), "");

OK, esto no es particularmente elegante para eliminar letras, ya que el .El método Replace tiene una sobrecarga que toma parámetros de cadena. Pero esto funciona para eliminar retornos de carro, feeds de línea, pestañas, etc. Este ejemplo elimina los caracteres de tabulación:

myString = myString.Replace('\t'.ToString(), "");
 3
Author: Mike Taverne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-21 00:26:07

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

default(char)

Que es lo mismo que char.MinValue que a su vez es lo mismo que \0. Sin embargo, no se debe usar if para algo como una cadena vacía.

 3
Author: nawfal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-04 09:53:43

No responde a su primera pregunta, pero para el problema específico que tuvo, puede usar cadenas en lugar de caracteres, ¿verdad?:

myString.Replace("c", "")

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

 1
Author: Ian Grainger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-29 16:32:20

También puede reconstruir su cadena carácter 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"
 1
Author: matrixugly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-02 14:12:21

La forma más fácil de eliminar un carácter de la cadena es recortarlo

cl = cl.Trim(' ');

Elimina todos los espacios de una cadena

 1
Author: MrSmudge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-04 11:07:06

¿Qué tal BOM, el carácter mágico que Microsoft añade al inicio de los archivos (al menos XML)?

 0
Author: Arto Viitanen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-10 05:02:19

Si desea eliminar el carácter vacío en la cadena, lo siguiente funcionará, 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());
            }

        }

    }
 0
Author: Alexander Zaldostanov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-27 09:28:56

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 mi escenario de negocio

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

El null y white space tuvieron diferentes flujos de negocio en mi proyecto. Al insertar en la base de datos, necesito insertar empty string en la base de datos si es un espacio en blanco.

 0
Author: Lijo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-05 10:16:14

Sé que este es bastante antiguo, pero recientemente me encontré con un problema con tener que hacer varios reemplazos para hacer un nombre de archivo seguro. Primero, en la última cadena. NET.Reemplazar función null es el equivalente al carácter vacío. Dicho esto, lo que falta de.Net es un simple reemplazar todo lo que reemplazará cualquier carácter 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 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));
        }

    }

}
 0
Author: Jim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-27 15:18:16

Use

myString.Replace ("c", "")
 0
Author: Chintan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-26 06:30:45

Si desea eliminar caracteres que cumplen 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 mayúsculas en la cadena.)

En otras palabras, puede convertir la cadena a un IEnumerable<char>, hacer cambios en ella y luego convertirla de nuevo 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 de la siguiente manera: c => c != 't'.

 0
Author: florien,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-26 16:49:37