sábado, 11 de junio de 2022

Curso Avanzado de C#. Manipulación de cadenas II

Clases String adicionales 

La clase String es intuitiva y fácil de usar. Podemos utilizar sus métodos para examinar fácilmente las cadenas, eliminar secciones, recortar el inicio o el final de una cadena y extraer subcadenas. Sin embargo, la forma inusual en que se introducen cadenas en nuestro programa, las hace ineficaces para algunos propósitos. La figura muestra el programa de ejemplo de permutaciones.

Clases String adicionales


Este programa muestra una cadena grande que contiene todas las permutaciones de un conjunto de letras entre la A y la H. Hay 8 letras y (5040 permutaciones de esas ocho letras) por lo que el resultado es 5040 cadenas concatenadas. Para empeorar las cosas, el programa crea cada permutación con un carácter cada vez, por lo que cada permutación requiere la construcción de ocho cadenas más pequeñas. Esto significa que el programa construye 8 × 5040 = 40.320 cadenas en total, cada una de las cuales debe ser ingresada. Como resultado, el programa es bastante lento, tardando aproximadamente 23 segundos en producir estas 5.040 permutaciones utilizando la concatenación de cadenas. Para casos especiales como este, cuando la clase String es particularmente ineficiente, un programa puede obtener un mejor rendimiento utilizando las clases de procesamiento de cadenas especializadas: 


StringBuilder 

StringWriter 

StringReader 

El programa tomó solo 0.05 segundos para construir las permutaciones cuando utilizamos StringBuilder en lugar de concatenaciones de String. Cada una de estas clases de procesamiento de cadenas se describe en las siguientes secciones. 

StringBuilder 

La clase StringBuilder representa una cadena mutable no internada. Almacena datos de caracteres en una matriz y puede agregar, eliminar, reemplazar y agregar caracteres sin crear un nuevo objeto String o usar el grupo interno. Normalmente, un programa usa un StringBuilder para construir una cadena en una larga serie de pasos y luego llama al método ToString de StringBuilder para convertir el resultado en una cadena normal. Por ejemplo, el siguiente código utiliza StringBuilder para construir una cadena que contiene una serie de nombres de empleados en líneas separadas:

String[] NombresEmpleados =

{

      "Abel",

      "Bartolo",

      "Carlos",

      "David",

};

StringBuilder allNames = New StringBuilder();

foreach (string name in NombresEmpleados)

{

      allNames.Append("[" + name + "]" + Environment.NewLine);

}

txtEmpleados.Text = allNames.ToString();

El código comienza definiendo una matriz de nombres de empleados. Luego crea un StringBuilder y recorre los nombres en la matriz NombresEmpleados. Para cada nombre, el código llama al método Append de StringBuilder para agregar el nombre entre corchetes a la cadena. Una vez que ha procesado todos los nombres, el código llama al método ToString de StringBuilder para convertirlo en un String normal y muestra el resultado en la caja de texto txtEmpleados

La Tabla describe las propiedades más útiles de la clase StringBuilder.

 

Propiedad

Descripción

Capacity

Obtiene o establece el número de caracteres que puede contener StringBuilder. Si la cantidad de texto almacenado en StringBuilder excede esta cantidad, el objeto asigna más espacio. Si sabe que StringBuilder debe contener al menos un cierto número de caracteres, podemos utilizar esta propiedad para hacer que el objeto se preasigne

memoria en lugar de asignar memoria de forma incremental. Algunas versiones sobrecargadas del constructor de la clase  permiten especificar una capacidad inicial.

Length

Obtiene o establece el número actual de caracteres almacenados en StringBuilder. Si establecemos este valor a un menor valor que la longitud actual, el texto en StringBuilder se trunca.

El indexador de StringBuilder devuelve los caracteres almacenados en el objeto. Un programa puede usar el indexador para obtener y establecer valores de caracteres. Por ejemplo, la declaración allNames [10] = 'X' establece el carácter número 10 en X. 

La tabla describe los métodos más útiles de la clase StringBuilder.

 

Método

Descripción

Append

Añade una representación de cadena de un objeto al final del texto de StringBuilder

AppendFormat

Formatea una serie de objetos y agrega el resultado al final del texto de StringBuilder

EnsureCapacity

Garantiza que StringBuilder tenga al menos una capacidad determinada

Insert

Inserta una representación de cadena de un objeto en una posición dada en el texto de StringBuilder

Remove

Elimina un rango de caracteres del texto de StringBuilder

Replace

Reemplaza todas las instancias de un carácter o cadena con un nuevo carácter o cadena

ToString

Devuelve una representación de cadena normal del texto de StringBuilder

 

La clase StringBuilder agrega algo de sobrecarga a un programa y, a veces, hace que el código sea más difícil de leer, por lo que generalmente debemos usarlo solo si realizamos una gran cantidad de operaciones de cadena. En un conjunto de pruebas, la concatenación de cadenas simple fue más rápida que la creación y el uso de StringBuilder para menos de aproximadamente siete concatenaciones.

También hay que tener en cuenta en cuenta que los tiempos involucrados para algunas operaciones de cadena son pequeños. Pero utilizar StringBuilder para concatenar 10 cadenas puede ser un poco más rápido que realizar 10 concatenaciones simples de cadena, pero la cantidad total de tiempo ahorrado se mide en milisegundos. A menos que el programa repita esa operación muchas veces o haga concatenaciones mucho más largas, podemos sacrificar algunos milisegundos para que el código sea más fácil de entender. 

StringWriter 

La clase StringWriter proporciona una interfaz que facilita en algunos casos la creación de una cadena en un StringBuilder subyacente. La clase StringWriter proporciona métodos que facilitan la escritura secuencial de valores en una cadena. La tabla  describe los métodos más útiles de StringWriter. 

 

Método

Descripción

Flush

Vacía los datos almacenados en búfer en el StringWriter subyacente

ToString

Devuelve el contenido actual del objeto como una cadena

Write

Añade un elemento a los datos de la cadena. Las versiones sobrecargadas agregan char, string, int, double y otros muchos tipos de datos.

WriteAsync

Anexa de forma asíncrona un char,string o una matriz de caracteres al final de los datos de la cadena

WriteLine

Agrega un elemento a los datos de la cadena como lo hace Write y luego agrega una nueva línea

 

StringWriter puede ser útil cuando solo deseamos agregar valores a una cadena. StringWriter también implementa una interfaz TextWriter, lo que puede ser útil cuando otras clases requieren un TextWriter para producir una salida y deseamos almacenar esa salida en una cadena. Por ejemplo, el método Serialize de la clase XmlSerializer envía la salida a un TextWriter. Si queremos serializar en una cadena, podemos enviar la salida a StringWriter y luego usar el método ToString de StringWriter para obtener el resultado. Si necesita manipular los datos de la cadena subyacente de otras formas, como eliminar o reemplazar caracteres, StringBuilder proporciona más flexibilidad. 

StringReader 

La clase StringReader proporciona una implementación TextReader que lee fragmentos de datos tomados de un StringBuilder subyacente. Proporciona métodos que facilitan la lectura secuencial de fragmentos de texto de una cadena. La tabla  describe los métodos más útiles de StringReader.

 

Método

Descripción

Peek

Devuelve el siguiente carácter en los datos pero no avanza al carácter

Read

Devuelve el siguiente carácter de los datos y avanza al siguiente carácter. Una versión sobrecargada puede leer un bloque de caracteres

ReadAsync

Lee de forma asíncrona caracteres de StringReader en un búfer

ReadBlock

Lee hasta un número máximo de caracteres de StringReader en un búfer que comienza en un índice especificado

ReadBlockAsync

Lee asincrónicamente hasta un número máximo de carácteres de StringReader en un búfer que comienza en un índice especificado.

ReadLine

Lee carácteres de StringReader hasta que encuentra el final de línea

ReadLineAsync

Lee de forma asíncrona los caracteres de StringReader hasta que encuentra el fin de la línea

ReadToEnd

Devuelve el texto restante de StringReader como una cadena

ReadToEndAsync

Devuelve de forma asíncrona el texto restante de StringReader como una cadena

 

La clase StringReader proporciona acceso a los datos de StringBuilder a un nivel relativamente bajo. A menudo, un programa usa un StringReader solo porque necesita pasar información a un método predefinido que requiere un StringReader o TextReader como parámetro. 

Veamos un ejemplo: Usando StringBuilder 

Usando solo StringBuilders (sin Strings), escribir un programa que muestre todas las subsecuencias iniciales de las letras del alfabeto A, AB, ABC, y así sucesivamente en un TextBox, como se muestra en la figura 

StringBuilder

Private void Form1_Load(Object sender, EventArgs e)

{

      // Genera un StringBuilder sosteniendo los ABC

      StringBuilder letters =

      New StringBuilder("ABCDEFGHIJKLMNOPQRSTUVWXYZ");

      // Éste contiene la siguiente línea de letras.

      StringBuilder line = New StringBuilder();

      // Crea el resultado StringBuilder.

      StringBuilder result = New StringBuilder();

      // Recorre las letras.

      For (int i = 0; i < 26; i++)

      {

            // Agregua la siguiente letra a la línea.

            line.Append(letters[i]);

            //Agrega una línea al resultado.

            result.AppendLine(line.ToString());

      }

      // Muestra el resultado.

      stringBuilderTextBox.Text = result.ToString();

      stringBuilderTextBox.Select(0, 0);

}

El código construye un StringBuilder que contiene las letras del alfabeto. Hace un segundo StringBuilder para mantener una línea de salida y un tercero para mantener el resultado final. A continuación, el código recorre los números del 0 al 25. Para cada valor de i, el código agrega el i-ésimo carácter en letras al valor en línea. Luego agrega el nuevo valor de línea al resultado, siguiéndolo con una nueva línea. Cuando el código termina su ciclo, muestra el resultado. En este ejemplo, no está claro si usar StringBuilder es más rápido que usar concatenaciones de cadenas simples. En una prueba que ejecutó este código y un código similar que realizó concatenaciones de cadenas 100.000 veces, la versión de StringBuilder tomó aproximadamente el 54 por ciento de tiempo, por lo que hay un ahorro de tiempo, pero el resultado para una sola ejecución es insignificante.


sábado, 4 de junio de 2022

Diseño de un proceso de gobierno de datos

El objetivo del gobierno de los datos es su protección, por lo que puede ser una buena idea considerar la nube. Al comienzo del proceso de diseño de una política de gobierno de datos, es importante identificar a los jugadores. La gobernanza de datos no necesita necesariamente experiencia técnica. Un equipo debe incluir experiencia técnica, pero debe estar equilibrado con otras habilidades, como experiencia empresarial, cumplimiento legal, comunicación, gestión y planificación de proyectos, etc.

Probablemente sea necesario un equipo de gobierno de datos que pueda hacer coincidir los objetivos comerciales con la recopilación de datos, con personal especializado en  cumplimiento de leyes y normativa, pero navegar por el espacio de big data es un desafío especial y no es recomendable tener una sola persona especializada en eso. Aunque al  menos, deberemos tener un recurso dedicado a ello. En la UE, por ejemplo, si estamos recopilando la información de residentes en la UE, entonces, según el RGPD, debemos tener un oficial de protección de datos. Debemos tener una buena representación de cualquier unidad organizativa interna o externa de nuestra empresa, que deba formar parte de la recopilación y el análisis de datos. 

Diseño de un proceso de gobierno de datos


Necesitamos personas capacitadas en la creación y mantenimiento de políticas. También necesitamos planificadores y expertos en proyectos. Son parte integral de los mecanismos que recopilan y analizan los datos. Debemos tener representadas las operaciones de TI, así como la seguridad de TI. Además, deberían participar las unidades de negocio que tengan interés en los datos. Así como el cumplimiento de leyes debe ser el principal punto de contacto entre la organización interna y la normativa externa.

Supervisión de una estrategia de gobernanza de datos

Hay cuatro pilares para una estrategia de gobernanza de datos exitosa. Primero tenemos que proteger nuestros datos. Esto es de suma importancia porque la alternativa puede ser devastadora para una empresa. Debemos garantizar la disponibilidad, porque los datos son tan buenos como la capacidad de acceso que tengamos a ellos, por eso es importante la velocidad de acceso porque estamos hablando de una cantidad significativa de datos complejos.

También es importante tener en cuenta la tasa de cambios. Los datos pueden cambiar con frecuencia. Especialmente cuando se recolectan las 24 horas del día, los 365 días del año.

La comunicación es clave para una estrategia de gobernanza de datos exitosa. Nuestro equipo debe establecer un hito y estar de acuerdo. Necesitamos empoderar a nuestro equipo y darle lo que necesite para tener éxito. Y en la medida de lo posible, planificar y ser proactivo. Intentar anticipar los problemas menores y evitarlos antes de que se conviertan en problemas importantes. Pero también necesitamos planes para reaccionar, desarrollando respuestas incluso ante los problemas más mínimos.

La coordinación y el seguimiento son elementos que deben incluirse en nuestra estrategia. Nuestro equipo, siempre debe tomar la iniciativa porque será el que más  estará al tanto de la recopilación y el análisis de datos. Seguridad, privacidad, cumplimiento, objetivos comerciales legales y cualquier otro elemento que podamos identificar como tarea del equipo de gobierno de datos.

El equipo también necesita tener un canal ascendente sin obstáculos hacia la alta dirección. El equipo también debe estar equipado para evaluar cómo se utilizan los datos, que se utilizan de acuerdo con las leyes y regulaciones. ¿Se está utilizando de la forma prevista en las políticas de datos y se está utilizando para lograr las métricas comerciales detalladas en la política de gobierno? Y la auditoría es, por supuesto, una actividad crucial, debe haber auditorías para fines comerciales y legales.

Mantener una estrategia de gobernanza de datos

La recopilación de datos es tan útil como la forma en que se utilizan. Debemos reconocer cuándo se están logrando resultados y cuándo debemos modificarlos. Así que aquí hay algunas cosas que podemos incorporar a su estrategia de gobierno de datos. Primero, no apresurarse a encontrar una solución para entregarla a los usuarios finales de nuestra empresa. Trabajaremos con las herramientas y los datos. Debemos construirlo y probarlo cuidadosamente en entornos sandbox para asegurarnos de que funciona y funcione bien. Esta es una de las razones por las que una pequeña prueba de concepto dirigida a un dominio específico es una muy buena idea. Podemos planear escalar más adelante, pero al principio, lo extenderemos para que funcione. Nuestras soluciones y resultados deben tener estructuras de monitoreo integradas, para que el monitoreo sea constante. Y planificaremos actualizar nuestra estrategia, políticas de gobierno y procedimientos en un ciclo. En algunos casos, el momento es indeterminado. Debemos reaccionar a los problemas según sea necesario. Luego está la medición. Debemos conocer nuestros resultados para determinar si vale la pena el esfuerzo. Revisar los resultados con regularidad. Construiremos una estructura que sea ágil y capaz de evolucionar junto con los resultados, nuestras necesidades y cambios comerciales. Definiremos métricas en las estrategias de datos y las utilizaremos para medir resultados. Y actualizaremos las políticas y procedimientos según sea necesario utilizando los resultados como guía. También mantendremos la disponibilidad de los datos. En este sentido, dejaremos que TI tome la iniciativa. Son los expertos en hacer que las herramientas funcionen y el flujo de datos. Evitaremos a toda costa puntos únicos de falla. Normalmente, los mecanismos de redundancia de datos, como los sitios espejo, mitigarán los problemas de disponibilidad. Y si nuestros datos residen en un centro de datos o un proveedor en la nube, esto no debería ser un problema. No obstante, trataremos estos datos como lo hace con el resto de datos. Siempre es prudente asegurarse de que esté respaldado y almacenado de manera segura. 


sábado, 28 de mayo de 2022

Curso avanzado de C#. Manipulación de cadenas I

Las cadenas son diferentes de otros tipos de datos. Los programas generalmente las tratan como si fueran cualquier otro dato de tipo valor, pero detrás hay una clase cadena que es notablemente compleja. Podemos ignorar esta complejidad en la mayoría de la programación diaria, pero es importante comprender cómo funcionan las cadenas para que poder manejar situaciones especiales cuando surjan. 

Por ejemplo, si comprendemos cómo se almacenan las cadenas, sabremos cuándo sería mejor utilizar la clase StringBuilder en lugar de concatenarlas. 

Curso avanzado de C#. Manipulación de cadenas I


Nota: 

En C#, palabra clave string es un alias de System.String, por lo que cuando creamos una variable de tipo string, en realidad estamos creando un objeto String. Estilísticamente, la mayoría de los programadores de C# prefieren usar string, pero aquí utilizaremos String para enfatizar que son objetos y no los tipos de valores simples que pueden parecer. 

Detrás de las cadenas 

.NET representa los caracteres como la versión Unicode UTF-16, un formato que usa 16 bits para almacenar cada carácter. Eso permite que un carácter Unicode represente muchos más caracteres de los que se proporcionan en un teclado estándar. (La última versión de Unicode define valores para más de 110.000 caracteres en más de 100 scripts). Una cadena es un objeto que usa una serie de caracteres Unicode para representar un texto. Una de las características más inusuales de los objetos String es que son inmutables. Eso significa que el contenido de una cadena no se puede cambiar después de que se haya creado la cadena. En cambio, los métodos que parecen modificar el valor de una cadena, como Replace y ToUpper, en realidad devuelven un nuevo objeto String que contiene el valor modificado. 

Para conservar memoria, el CLR mantiene una tabla llamada grupo interno (intern pool) que contiene una única referencia a cada valor de texto único utilizado por el programa. Cualquier variable de cadena que se refiera a un texto en particular es en realidad una referencia a un grupo de internos. Varias cadenas que representan el mismo valor se refieren a la misma entrada en el grupo de internos. 

Todo esto requiere algo de sobrecarga, por lo que trabajar con cadenas no es tan rápido como trabajar con tipos de valor. Si un programa debe realizar una gran cantidad de concatenaciones, cada una crea una nueva instancia de String que debe ser internada (añadida al grupo de internos o intern pool) y eso lleva tiempo. En ese caso, el uso de la clase StringBuilder puede ofrecer un mejor rendimiento. 

Constructores de String 

Tres de las formas más comunes de inicializar una variable de cadena son: 

-Establecerla igual a un literal de cadena.

-Establecerla igual al texto introducido por el usuario en un control como un TextBox o ComboBox. 

-Establecerla igual al resultado de un cálculo de cadena. 

El último de estos incluye métodos que formatean una variable para producir un String, como usar el método ToString o el método String.Format. 

Además de estos métodos, la clase String proporciona varios constructores que a veces pueden ser útiles: 

-Un constructor inicializa String a partir de una matriz de caracteres char.

 -Un segundo constructor usa solo parte de una matriz de caracteres, tomando como parámetros la matriz, una posición de inicio y la longitud de los caracteres a usar. 

-Un tercer constructor toma como parámetro un carácter y la cantidad de veces que queremos repetir ese carácter en la nueva cadena. Esto puede resultar especialmente útil si queremos aplicar una sangría a una cadena con un cierto número de espacios o caracteres de tabulación. Por ejemplo, el siguiente código muestra los números del 1 al 10 en líneas separadas con cada línea con sangría de cuatro espacios más que la anterior:

For (int i = 1;i <= 10; i++)

{

     String indent = New String(' ', 4 * i);

    Console.WriteLine(indent + i.ToString());

La mayoría de los valores de cadena se crean mediante literales de cadena, texto ingresado por el usuario o resultados de cálculos, pero los constructores de cadenas a veces pueden ser útiles. 

Campos y propiedades de String 

La clase String proporciona solo tres campos y propiedades: Empty, Length  y un indexador de solo lectura. El campo Empty devuelve un objeto que representa una cadena vacía. Podemos utilizar este valor para establecer el valor de una cadena o para ver si una cadena tiene un valor vacío. (Alternativamente, podemos utilizar el literal de cadena vacía " ".) 

La propiedad Length devuelve el número de caracteres de la cadena. El indexador de solo lectura devuelve los caracteres chars de la cadena. Debido a que es un indexador, podemos obtener sus valores agregando

un índice para el nombre de una variable String. Por ejemplo, la instrucción username [4] devuelve el carácter número 4 en la cadena username. 

El indexador es de solo lectura, por lo que no podemos establecer uno de los caracteres de la cadena con una declaración como username [4] = 'x'. Si queremos hacer algo así, tenemos que utilizar los métodos String que se describen en el siguiente epigrafe. 


Si fuera más fácil tratar String como si fuera una matriz de caracteres de lectura / escritura, podemos utilizar el método ToCharArray para convertir String en una matriz (array) de caracteres, manipularlos y luego crear un nuevo String pasando al constructor la matriz modificada. Por ejemplo, el siguiente código utiliza una matriz para hacer que los caracteres de una cadena se alternen entre mayúsculas y minúsculas: 

Char [] caracteres = text.ToCharArray ();

For (int i = 0; i <caracteres .Length; i ++)

     If (i% 2 == 0) caracteres[i] = char.ToUpper ( caracteres[i]);

     Else caracteres[i] = Char.ToLower (caracteres[i]);

text = New string(caracteres);

También podemos utilizar el indexador como fuente de iteración en un bucle foreach:

String texto = "Podemos acercarnos más a la verdad mediante ejemplos negativos que con verificaciones de nuestras creencias.";

int[] conteos = New int[26]; texto = texto.ToUpper ();

foreach (char ch in texto)

{

     If (Char.IsLetter(ch))

     {

         int index = (Int()) ch - (int)'A';

         conteos [index] ++;

     }

} 

Este código crea un objeto String llamado texto. Crea una matriz (array) de conteos para contener los conteos de las 26 letras de la A a la Z utilizadas en la cadena. Antes de procesar la cadena, el código convierte el texto en mayúsculas. 

A continuación, se utiliza una instrucción foreach para recorrer los caracteres de la cadena. Para cada carácter, el código utiliza el método IsLetter de la clase char para decidir si el carácter es una letra y no un espacio o un signo de puntuación. Si el carácter es una letra, el código lo convierte en un número entero y le resta el valor de "A" convertido en un número entero para obtener un índice en la matriz de conteos. La letra A tiene índice 0, B tiene índice 1 y así sucesivamente. Luego, el código incrementa el recuento de ese índice. Cuando finaliza el código, la matriz de conteos contiene el número de veces que aparece cada carácter en la cadena. 

Métodos de String

 La clase String proporciona muchos métodos que nos permiten trabajar con cadenas. La Tabla mostrada a continuación, describe los métodos estáticos más útiles proporcionados por la clase String. Debido a que estos son métodos estáticos, un programa usa la clase String para invocar estos métodos. Por ejemplo, para utilizar el método Compare, el programa utiliza una declaración similar a if (String.Compare (value1, value2)> 0) .... 

 

Método

Descripción

Compare

Compara dos cadenas y devuelve –1, 0 o 1 para indicar si la primera cadena debe considerarse anterior, igual o posterior de la segunda cadena en el orden de clasificación. Versiones sobrecargadas de este método nos permiten especificar reglas de comparación de cadenas, como ignorar mayúsculas y minúsculas, o qué reglas de comparación de cultura utilizar.

Concat

Toma como parámetro una matriz de cadenas u otros objetos y devuelve una cadena que contiene la concatenación de los objetos. Una versión sobrecargada permite pasar cualquier número de argumentos como parámetros y devuelve los argumentos concatenados. (ver también join)

Copy

Devuelve una copia de la cadena (ver también clone en la siguiente tabla)

Equals

Devuelve verdadero si dos cadenas tienen el mismo valor. (Ver también la instancia Equals de la siguiente tabla)

Format

Utiliza una cadena de formato y una serie de objetos para generar una cadena de texto formateada.

IsNullOrEmpty

Devuelve verdadero si String contiene una cadena en blanco "" o la variable de cadena se refiere a nulo. El siguiente código establece dos variables iguales a una cadena vacía y una tercera variable a nula:

 

String value1 = "";

String value2 = String.Empty;

String value3 = null;

 

Existe una diferencia entre una cadena vacía y una nula El método IsNullOrEmpty hace que sea más fácil tratar ambos valores de la misma manera

 

IsNullOrWhiteSpace

Devuelve verdadero si la variable String contiene una cadena en blanco, hace referencia a nulo o solo contiene caracteres de espacio en blanco. Los caracteres de espacio en blanco son los que Char.IsWhiteSpace devuelve verdadero

Join

Une los valores en una matriz (array) de cadenas u otros objetos separados por una cadena de separación. Por ejemplo, el siguiente código establece la variable allDays para contener los días de la semana separados por comas:

 

String[] diasSemana =

{

"Lunes", "Martes", "Miércoles",

"Jueves", "Viernes", "Sabado",

"Domingo"

};

String todosLosDias = String.Join(",", diasSemana);

 


Métodos de Instancia

La siguiente tabla describe los métodos de instancia más útiles proporcionados por la clase String. Debido a que estos son métodos de instancia, un programa debe usar una instancia de la clase String para invocar estos métodos. 

Por ejemplo, para usar el método CompareTo, el programa usaría una declaración similar a if (valor1.CompareTo (valor2)> 0) .... 

Método

Descripción

Clone

Devuelve una nueva referencia a la cadena. El comportamiento es un poco diferente al

Clonar métodos proporcionados por la mayoría de las otras clases porque las cadenas son inmutables.

Para esta clase, la nueva referencia se refiere al mismo valor en el grupo de internos. Como el String original.

CompareTo

Compara la cadena con otra cadena y devuelve –1, 0 o 1 para indicar que esta Cadena debe considerarse antes, igual o después de la otra cadena en el orden de clasificación. Si queremos especificar reglas de comparación de cadenas, ya sea

para ignorar el uso de mayúsculas y minúsculas y qué reglas de comparación de la cultura utilizar, utilizaremos el método

Compare.

Contains

Devuelve verdadero si la cadena contiene una subcadena especificada.

CopyTo

Copia un número específico de caracteres desde una posición de inicio especificada en una matriz (array)  de caracteres.

EndsWith

Devuelve verdadero si la cadena termina con una subcadena especificada.

Versiones sobrecargadas nos permiten especificar el tipo de comparación de cadenas.

Equals

Devuelve verdadero si esta cadena tiene el mismo valor que otra cadena.

IndexOf

Devuelve el índice de la primera aparición de un carácter o subcadena dentro de

una cadena. Los parámetros permiten especificar la posición en la cadena donde la búsqueda debe comenzar y terminar, y las opciones de comparación de cadenas.

IndexOfAny

Devuelve el índice de la primera aparición de cualquier carácter en una matriz dentro de la cadena. Los parámetros permiten especificar la posición en la Cadena donde  debe comenzar y terminar la búsqueda.

Insert

Inserta una cadena en una posición específica dentro de esta cadena y devuelve el resultado.

LastIndexOf

Devuelve el índice de la última aparición de un carácter o subcadena dentro de una cadena. Los parámetros permiten especificar la posición en la cadena donde debe comenzar y finalizar la búsqueda, y las opciones de comparación.

LastIndexOfAny

Devuelve el índice de la última aparición de cualquier carácter en una matriz dentro de la cadena. Los parámetros permiten especificar la posición en la cadena donde debe comenzar y terminar la búsqueda.

PadLeft

Devuelve la cadena rellenada a una cierta longitud agregando espacios o un carácter especificado a la izquierda. Esto facilita la alineación del texto en columnas con un ancho de fuente fija.

PadRight

Devuelve la Cadena rellenada a una cierta longitud agregando espacios o un carácter especificado a la derecha. Esto facilita la alineación del texto en columnas con un ancho de fuente fija.

Remove

Elimina los caracteres que comienzan en una posición especificada o al final de la

cadena o para un cierto número de caracteres y devuelve el resultado.

Replace

Reemplaza todas las instancias de un carácter o cadena con otro carácter o cadena y devuelve el resultado.

Split

Devuelve una matriz que contiene trozos de cadena delimitados por caracteres. Las versiones sobrecargadas permiten indicar el número máximo de trozos a devolver y dividir opciones, como eliminar entradas vacías. por ejemplo, el siguiente código divide una serie de números separados por comas y guiones, eliminando cualquier entrada que esté vacía:

 

Char[] delimitadores = { ',', '-' };

String valores = "14-63,,27-87,565";

String[]campos = valores.Split(delimitadores,

StringSplitOptions.RemoveEmptyEntries);

StartsWith

Devuelve verdadero si la cadena comienza con una subcadena especificada. Versiones sobrecargadas  permiten especificar el tipo de comparación, si ignorar el caso o el tipo.

Substring

Devuelve una nueva cadena que contiene una subcadena de esta cadena especificada por un inicio de posición y su longitud.

ToCharArray

Devuelve una matriz de caracteres que representa algunos o todos los caracteres de la cadena.

ToLower

Devuelve una copia de la cadena convertida a minúsculas.

ToString

Devuelve la cadena. Normalmente, no necesitamos hacer esto, pero si estamos tratando String como un objeto, por ejemplo, si está en una lista o matriz de objetos, es útil saber que este objeto tiene un método ToString.

ToUpper

Devuelve una copia de la cadena convertida a mayúsculas.

Trim

Devuelve una copia de la cadena a la que se le han eliminado espacios en blanco iniciales y finales. Una versión sobrecargada permite especificar qué caracteres deben ser eliminados.

TrimEnd

Devuelve una copia de la cadena con los espacios en blanco finales eliminados

TrimStart

Devuelve una copia de la cadena con los espacios en blanco iniciales eliminados.

Los métodos de la clase String permiten que un programa realice todo tipo de manipulaciones de cadenas, como analizar la entrada del usuario para obtener las partes de una dirección, un número de teléfono u otras partes de información formateada. 

Ejemplo práctico

Modificaremos el formulario de pedidos que creamos en esta entrada  para que que nos permita manejar el porcentaje de IVA especificado. Ahora si el valor introducido por el usuario contiene un carácter %, parseamos el valor y lo dividimos entre 100. 

El método decimal.TryParse no puede analizar (parsear)  una cadena que contenga el carácter %. Para analizar el valor, el programa debemos eliminar el carácter % si está presente, utilizaremos TryParse para convertir el resultado en un valor decimal y luego dividir entre 100 si el texto original contenía el carácter %. El siguiente código muestra como podemos hacer esto:

// Recogemos el IVA como cadena

String strIVA = txtIVA.Text;

// Eliminamos el caracter % si existe.

strIVA = strIVA.Replace("%", "");

// Parseamos el IVA.

Decimal decIVA;

If (!decimal.TryParse(strIVA, out decIVA))

{

     DisplayErrorMessage(

     "Formato no válido. El IVA debe ser un valor decimal.",

     "Formato no válido", txtIVA);

     Return;

}

// Si la cadena contiene el carácter %, dividimos entre 100.

If (txtIVA .Text.Contains("%")) decIVA /= 100;