Eu tenho um DetailsView
com a TextBox
e quero que os dados de entrada sejam salvos sempre com a PRIMEIRA LETRA EM CAPITAL.
Exemplo:
"red" --> "Red"
"red house" --> " Red house"
Como posso obter esse desempenho maximizador ?
NOTA :
Com base nas respostas e nos comentários das respostas, muitas pessoas pensam que isso é perguntar sobre colocar em maiúscula todas as palavras na sequência. Por exemplo => Red House
, não é, mas se é isso que você procura , procure uma das respostas que usa TextInfo
o ToTitleCase
método de. (OBSERVAÇÃO: Essas respostas estão incorretas para a pergunta realmente feita.)
Consulte o documento TextInfo.ToTitleCase para advertências (não toca em letras maiúsculas - elas são consideradas siglas; podem ser minúsculas no meio das palavras que "não deveriam" ser reduzido, por exemplo, "McDonald" => "Mcdonald"; não é garantido o manuseio de todas as sutilezas específicas da cultura quanto às regras de capitalização.)
NOTA :
A questão é ambígua se as letras após a primeira devem ser forçadas a minúsculas . A resposta aceita pressupõe que apenas a primeira letra deve ser alterada . Se você deseja forçar todas as letras da string, exceto a primeira em minúscula, procure uma resposta que contenha ToLower
e não contenha ToTitleCase .
fonte
Respostas:
Atualizado para C # 8
C # 7
Respostas realmente antigas
EDIT : Esta versão é mais curta. Para uma solução mais rápida, dê uma olhada na resposta da Equiso
EDIT 2 : Provavelmente a solução mais rápida é a de Darren (há até uma referência), embora eu alterasse sua
string.IsNullOrEmpty(s)
validação para lançar uma exceção, pois o requisito original espera que uma primeira letra exista para que possa ser maiúscula. Observe que esse código funciona para uma sequência genérica e não particularmente para valores válidos deTextbox
.fonte
String.Join
é separador com o qual juntar as strings fornecidas com o segundo parâmetro.var arr = input.ToCharArray(); arr[0] = Char.ToUpperInvariant(arr[0]); return new String(arr);
provavelmente ganharia velocidade já que você está criando objetos menos imutáveis (e especialmente você está pulandoString.Join
). Obviamente, isso depende do comprimento da string."Argh!"
para manter a regra de Primeira Letra Maiúscula . ;)Resposta antiga: isso coloca todas as primeiras letras em maiúsculas
fonte
O caminho certo é usar o Culture:
Nota: Isso colocará em maiúscula cada palavra em uma sequência, por exemplo "casa vermelha" -> "Casa vermelha". A solução também usará letras minúsculas em palavras, por exemplo, "old McDonald" -> "Old Mcdonald".
fonte
ToLower
é um erro, pois apaga a capitalização no meio da palavra, por exemplo, "McDonalds". 3) A questão é mudar apenas a primeira palavra da string , não o TitleCase.Peguei o método mais rápido em http://www.dotnetperls.com/uppercase-first-letter e converti para o método de extensão:
NOTA: O motivo pelo qual o uso
ToCharArray
é mais rápido que a alternativachar.ToUpper(s[0]) + s.Substring(1)
é que apenas uma string é alocada, enquanto aSubstring
abordagem aloca uma string para a substring e, em seguida, uma segunda string para compor o resultado final.EDIT : Aqui está a aparência dessa abordagem, combinada com o teste inicial de CarlosMuñoz, resposta aceita :
fonte
return string.Empty
aqui ocultaria uma chamada "ruim" ao método.Você pode usar o "método ToTitleCase"
este método de extensão resolve todos os problemas de titlecase.
fácil de usar
o método de extensão
fonte
FirstLetterToUpper
na resposta de Equiso (ou na resposta mais recente de Guillernet) eToTitleCase
aqui, mas sem o segundo parâmetro. Então não precisaenum TitleCase
.Para a primeira letra, com verificação de erros:
E aqui está o mesmo que uma extensão útil
fonte
fonte
Se o desempenho / uso da memória for um problema, este criará apenas um (1) StringBuilder e um (1) novo String do mesmo tamanho que o String original.
fonte
char[]
vez de ter toda a infraestrutura de umStringBuilder
empacotamento. Em vez denew StringBuilder(str)
, usestr.ToCharArray()
e em vez desb.ToString()
, usenew string(charArray)
.StringBuilder
emula o tipo de indexação que uma matriz de caracteres expõe nativamente, para que a.ToUpper
linha real possa ser essencialmente a mesma. :-)ToCharArray
, como sugerido porJonathanGilbertMétodo mais rápido.
Os testes mostram os próximos resultados (sequência com 10000000 símbolos como entrada): Resultados do teste
fonte
s
parâmetro quando nulo ou vazio.Tente o seguinte:
fonte
Se você se importa apenas com a primeira letra em maiúscula e não importa o restante da sequência, basta selecionar o primeiro caractere, colocá-lo em maiúscula e concatená-lo com o restante da sequência sem o primeiro caractere original.
Precisamos converter o primeiro caractere ToString () porque o estamos lendo como uma matriz Char, e o tipo Char não possui o método ToUpper ().
fonte
Aqui está uma maneira de fazer isso como um método de extensão:
Pode então ser chamado como:
E aqui estão alguns testes de unidade para isso:
fonte
string.Format
é um exagero; simplesmente façatext.Substring(0, 1).ToUpper() + text.Substring(1)
.Desde que eu estava trabalhando nisso também, e estava procurando idéias, essa foi a solução que encontrei. Ele usa o LINQ e poderá capitalizar a primeira letra de uma sequência, mesmo que a primeira ocorrência não seja uma letra. Aqui está o método de extensão que acabei fazendo.
Tenho certeza de que há uma maneira de otimizar ou limpar isso um pouco.
fonte
Encontrei algo aqui http://www.dotnetperls.com/uppercase-first-letter :
talvez isso ajude !!
fonte
Verifique se a sequência não é nula e converta o primeiro caractere para maiúsculas e o restante para minúsculas:
fonte
Isso será feito, mas também garantirá que não haja maiúsculas erradas que não estejam no início da palavra.
fonte
s
antes da chamada para ToTitleCase.Parece haver muita complexidade aqui quando tudo que você precisa é:
Pontos dignos de nota:
É um método de extensão.
Se a entrada for nula, em branco ou em branco, a entrada será retornada como está.
String.IsNullOrWhiteSpace foi introduzido no .NET Framework 4. Isso não funcionará com estruturas mais antigas.
fonte
IsNullOrWhiteSpace
em vez deIsNullOrEmpty
, é que se você está indo para encontrar e alterar o primeiro não- espaço em branco . Mas você não - você sempre operas[0]
. Portanto, é inútil usar [semântica e desempenho]IsNullOrWhiteSpace
.IsNullOrWhiteSpace
me incomoda, é que um leitor descuidado pode pensar "Ele checou o espaço em branco, para que o código a seguir encontre e mude realmente uma letra, mesmo que seja precedida por espaço em branco". Como seu código falhará ao alterar uma "primeira" letra precedida por espaço em branco, o usoIsNullOrWhiteSpace
poderá enganar apenas um leitor.fonte
String
is pode ser qualquer coisa suaUpper
ouLower
. então é uma solução genérica para todas as strings.Join
invés deemp.First().ToString().ToUpper() + emp.Substring(1);
? Provavelmente precisa ser mais defensivo também:output = string.IsNullOrEmpty(emp) ? string.Empty : [...]
. Além disso, fwiw, concorde com @ CarlosMuñoz - você não precisaToLower()
da pergunta do OP.Substring
também é um bom estilo de código de escrita, eu concordo que sua solução para aparar um código, mas nesse caso escrever umToLower()
é uma boa prática de programação.string
pode ser qualquer coisaUpper
Caso ouLower
caso dependa da entrada do usuário, eu dou uma solução genérica.Eu queria fornecer uma resposta "DESEMPENHO MÁXIMO". Na minha opinião, uma resposta de "DESEMPENHO MÁXIMO" captura todos os cenários e fornece a resposta para a pergunta que representa esses cenários. Então, aqui está a minha resposta. Por estes motivos:
Fornecê-los como parâmetros opcionais torna esse método totalmente reutilizável, sem a necessidade de digitar a cultura escolhida todas as vezes.
fonte
Recentemente, tive um requisito semelhante e lembrei que a função LINQ Select () fornece um índice:
Como eu preciso muito disso, criei um método de extensão para o tipo de string:
Observe que apenas a primeira letra é convertida para maiúscula - todos os caracteres restantes não são tocados. Se você precisar que os outros caracteres sejam minúsculos, também pode chamar Char.ToLower (currentChar) para o índice> 0 ou chamar ToLower () em toda a cadeia de caracteres em primeiro lugar.
Em relação ao desempenho, comparei o código com a solução de Darren. Na minha máquina, o código de Darren é cerca de duas vezes mais rápido, o que não é surpresa, pois ele está editando diretamente apenas a primeira letra em uma matriz de caracteres. Então, sugiro que você use o código de Darren se precisar da solução mais rápida disponível. Se você deseja integrar outras manipulações de string, pode ser conveniente ter o poder expressivo de uma função lambda tocando os caracteres da string de entrada - você pode facilmente estender essa função -, então deixo esta solução aqui.
fonte
Eu acho que o método abaixo é a melhor solução
ref
fonte
Como esta pergunta é sobre maximizar o desempenho , adotei a versão de Darren para usar
Span
s, o que reduz o lixo e melhora a velocidade em cerca de 10%.atuação
Código de teste completo
Edit: Houve um typeo, em vez de s [0], foi um [0] - isso resulta com o mesmo valor vazio para o Span alocado a.
fonte
Isso coloca em maiúscula essa primeira letra e todas as letras após um espaço e em minúsculas qualquer outra letra.
fonte
Use o seguinte código:
fonte
Parece que nenhuma das soluções fornecidas aqui tratará de um espaço em branco antes da string.
Apenas adicionando isso como um pensamento:
Ele deve ser manipulado
this won't work on other answers
(essa frase tem um espaço no começo) e, se você não gostar do corte de espaço, basta passar ofalse
segundo parâmetro (ou alterar o padrão parafalse
e passartrue
se quiser lidar com o espaço)fonte
O FluentSharp possui o
lowerCaseFirstLetter
método que faz issohttps://github.com/o2platform/FluentSharp/blob/700dc35759db8e2164771a71f73a801aa9379074/FluentSharp.CoreLib/ExtensionMethods/System/String_ExtensionMethods.cs#L575
fonte
A maneira mais fácil de capitalizar a primeira letra é:
1- Usando Sytem.Globalization;
`
fonte
a seguinte função está correta em todos os aspectos:
Eu achei isso aqui
fonte
char.IsWhiteSpace( array[ i -1 ] )
vez de.. == ' '
, para lidar com todo o espaço em branco. 2) remova os dois lugares que o fazemif (char.isLower(..))
- eles não servem para nada.ToUpper
simplesmente não faz nada se um personagem não estiver em minúsculas.Expandindo a pergunta de Carlos acima, se você quiser capitalizar várias frases, use este código:
fonte
Solução possível para resolver seu problema.
fonte