Por que não há Char.Empty como String.Empty?

Existe uma razão para isso? Eu estou perguntando porque se você precisasse usar muitos caracteres vazios então você entra na mesma situação que usaria quando usa muitas strings vazias.

Edit: O motivo para esse uso foi este:

myString.Replace ('c', '') 

Portanto, remova todas as ocorrências de ‘c’s’ de myString.

Não existe tal coisa como um char vazio. O mais próximo que você pode obter é '\0' , o caractere Unicode “nulo”. Dado que você pode inserir isso dentro de literais de string ou expressá-lo por conta própria com muita facilidade, por que você quer um campo separado para isso? Da mesma forma, os argumentos “é fácil confundir "" e " " não se aplicam a '\0' .

Se você pudesse dar um exemplo de onde você gostaria de usá-lo e por que você acha que seria melhor, isso poderia ajudar …

Um char, diferente de uma string, é uma coisa discreta com tamanho fixo. Uma string é realmente um container de chars.

Então, Char.Empty não faz sentido nesse contexto. Se você tem um char, não está vazio.

Não existe tal coisa como um personagem vazio. Sempre contém algo . Mesmo ‘\ 0’ é um personagem.

Use Char.MinValue que funciona da mesma maneira que ‘\ 0’. Mas tenha cuidado, não é o mesmo que String.Empty .

Você poderia usar caracteres anuláveis .

 char? c 

Se você não precisa da string inteira, você pode aproveitar a execução atrasada:

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

Você pode até combinar vários personagens …

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

… e apenas os primeiros 7 caracteres serão avaliados 🙂

EDIT: ou, melhor ainda:

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

e seu uso:

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

a mesma razão que não há um int.Empty . Os contêineres podem estar vazios. Valores escalares não podem ser. Se você quer dizer 0 (que não está vazio), então use '\0' . Se você quer dizer null , então use null 🙂

Um char é um tipo de valor, portanto, seu valor não pode ser nulo. (A menos que seja empacotado em um contêiner Nullable).

Como não pode ser nulo, contém algum código numérico e cada código é mapeado para algum caractere.

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

OK, isso não é particularmente elegante para remover letras, já que o método .Replace tem uma sobrecarga que recebe parâmetros de string. Mas isso funciona para remover retornos de carro, linha feeds, guias, etc. Este exemplo remove caracteres de tabulação:

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

Não é uma resposta à sua pergunta, mas para denotar um char padrão você pode usar apenas

 default(char) 

que é o mesmo que char.MinValue que por sua vez é o mesmo que \0 . Não se deve usar se para algo como uma string vazia embora.

Não responde à sua primeira pergunta – mas para o problema específico que você teve, você pode simplesmente usar strings ao invés de chars, certo ?:

 myString.Replace("c", "") 

Existe uma razão pela qual você não gostaria de fazer isso?

Você também pode reconstruir seu caractere de string por caractere, excluindo os caracteres dos quais deseja se livrar.

Aqui está um método de extensão para fazer isso:

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

Não é liso ou chique, mas funciona bem.

Use assim:

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

A maneira mais fácil de remover um caractere da cadeia é ajustá-lo

cl = cl.Trim(' ');

Remove todos os espaços em uma string

Que tal a BOM , o personagem mágico que a Microsoft adiciona ao início dos arquivos (pelo menos XML)?

Se você quiser elliminar o caractere vazio em string, o seguinte funcionará, basta converter em qualquer representação de tipo de dados desejada. obrigado,

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

Em termos de linguagem C #, o seguinte pode não fazer muito sentido. E esta não é uma resposta direta à pergunta. Mas fowlloing é o que eu fiz em um dos meus cenários de negócios

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

O white space null e white space tinha streams de negócios diferentes no meu projeto. Ao inserir no database, eu preciso inserir uma empty string no database se for espaço em branco.

Eu sei que este é muito antigo, mas eu encontrei um problema recentemente com ter que fazer várias substituições para tornar um nome de arquivo seguro. Em primeiro lugar, na última function do .NET string. Substituir a function null é o equivalente ao caractere vazio. Dito isto, o que está faltando no .net é um simples replace tudo o que irá replace qualquer caractere em uma matriz com o caractere desejado. Por favor, sinta-se livre para fazer referência ao código abaixo (executado no LinqPad para teste).

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

usar

 myString.Replace ("c", "") 

Se você quiser remover caracteres que satisfaçam uma condição específica, você pode usar isto:

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

(Isso deixará apenas os caracteres maiúsculos na string.)

Em outras palavras, você pode converter a string para um IEnumerable , fazer alterações nela e então convertê-la de volta para uma string como mostrado acima.

Novamente, isso permite não apenas remover um caractere específico por causa da expressão lambda, embora você possa fazer isso se alterar a expressão lambda desta forma: c => c != 't' .