metodos before c# string

before - string methods c#



Detectando si una cadena es todo CAPS (10)

En C #, ¿hay alguna forma de detectar si una cadena tiene todas las mayúsculas?

La mayoría de las cadenas serán cortas (es decir, menos de 100 caracteres)


¿Sencillo?

if (input.ToUpper() == input) { // string is all upper }


Convertiría la cadena en mayúsculas (con ToUpper ) y luego compararía eso con el original (usando Equals ). Debería ser factible en una línea de código.

return s.Equals(s.ToUpper())


Creo que lo siguiente:

bool equals = (String.Compare(input, input.ToUpper(), StringComparison.Ordinal) == 0)

También funcionará, y puede asegurarse de que la comparación se realice sin tener en cuenta la envoltura de cadena (creo que VB.NET ignora caso por defecto). O incluso use String.CompareOrdinal(input, input.ToUpper()) .



Si esto necesita tener un buen rendimiento, supongo que sucede mucho. Si es así, tome su solución y hágalo unos millones de veces y cronometrala. Sospecho que lo que tienes es mejor que las otras soluciones porque no estás creando un nuevo objeto recogido basura que debe limpiarse, y no puedes hacer una copia de una cadena sin iterar de todos modos.


Utilizar

if (input == input.ToUpper())


No es necesario crear una nueva cadena:

bool IsAllUpper(string input) { for (int i = 0; i < input.Length; i++) { if (!Char.IsUpper(input[i])) return false; } return true; }

Editar: si desea omitir caracteres no alfabéticos ( la implementación original del OP no, pero sus comentarios indican que pueden querer ):

bool IsAllUpper(string input) { for (int i = 0; i < input.Length; i++) { if (Char.IsLetter(input[i]) && !Char.IsUpper(input[i])) return false; } return true; }


Asegúrese de que su definición de capitalización coincida con la definición de mayúsculas de.

ToUpper () en .Net es una operación lingüística. En algunos idiomas, las reglas de capitalización no son sencillas. El turco I es famoso por esto .

// Meaning of ToUpper is linguistic and depends on what locale this executes // This test could pass or fail in ways that surprise you. if (input.ToUpper() == input) { // string is all upper }

Podrías usar

// Meaning of ToUpper is basically ''ASCII'' ToUpper no matter the locale. if (input.ToUpper(CultureInfo.InvariantCulture) == input) { // string is all upper }

Es posible que tengas la tentación de guardar memoria haciendo personaje por mayúsculas y minúsculas

MSDN advierte contra esto

for(int i = 0; i < input.Length; i++) { if(input[i] != Char.ToUpper(input[i], CultureInfo.InvariantCulture)) { return false; } }

El código anterior introduce un error. Algunas ''letras'' no inglesas requieren dos caracteres .net para codificar (un par suplente). Tienes que detectar estos pares y capitalizarlos como una sola unidad.

Además, si omite la información cultural para obtener el uso de mayúsculas y minúsculas lingüísticas, está introduciendo un error en el que, en algunos lugares, su algoritmo de capitalización de fabricación casera no está de acuerdo con el algoritmo .net para esa configuración regional.

Por supuesto, nada de esto importa si su código nunca se ejecutará fuera de las configuraciones de habla inglesa o nunca recibirá texto que no esté en inglés.


Me gusta el enfoque LINQ.

Si desea restringirlo a todas las letras mayúsculas (es decir, sin espacios, etc.):

return input.All(c => char.IsUpper(c));

o usando una conversión de grupo de métodos:

return input.All(char.IsUpper);

Si solo quieres prohibir letras minúsculas:

return !input.Any(c => char.IsLower(c));

o

return !input.Any(char.IsLower);


Otro enfoque

return input.Equals(input.ToUpper(), StringComparison.Ordinal)