Ahora que sabemos lo que es un un string vamos a ver cómo trabajar con ellos, con algunos de los métodos habituales.
Recordad que los string son inmutables. Es decir, ninguno de estos métodos modifica el string original, todos devuelven uno nuevo.
Acceso y longitud
Podemos acceder a cada carácter individualmente como si fuera un Array (solo lectura) usando corchetes [] y saber cuánto mide con .Length.
string nombre = "Luis";
char letra = nombre[0]; // 'L'
int longitud = nombre.Length; // 4
Extraer partes (Slicing)
La forma clásica: Substring
Durante años hemos usado Substring(inicio, cantidad).
string texto = "Hola Mundo";
string mundo = texto.Substring(5, 5); // Desde índice 5, coge 5 caracteres -> "Mundo"
La forma moderna: Rangos (..)
Desde C# 8, tenemos una sintaxis mucho más potente y expresiva con los índices y rangos.
^1significa “el primero empezando por el final”.[inicio..fin]define un rango.
string archivo = "documento.pdf";
string nombre = archivo[0..^4]; // Desde el 0 hasta el 4º por el final -> "documento"
string extension = archivo[^3..]; // Los últimos 3 -> "pdf"
Búsqueda de contenido
Para encontrar “agujas en el pajar”.
Contains("texto"): Devuelvetrue/false.- **
StartsWith("x")/EndsWith("x")**: Comprueba inicio o fin. IndexOf("x"): Devuelve la posición (índice) donde aparece por primera vez. Si no existe, devuelve-1.
string frase = "El perro de San Roque";
int pos = frase.IndexOf("San"); // Devuelve 12
Todos estos métodos tienen sobrecargas que aceptan StringComparison. Es buena práctica usar StringComparison.OrdinalIgnoreCase si queremos ignorar mayúsculas y minúsculas de forma eficiente.
Manipulación y limpieza
Limpiar espacios (Trim)
Fundamental cuando leemos input de usuario para quitar espacios sobrantes al inicio y final.
string sucio = " usuario ";
string limpio = sucio.Trim(); // "usuario"
Reemplazar
Cambia todas las ocurrencias de un texto por otro.
string texto = "Hola mundo, hola todos";
string nuevo = texto.Replace("Hola", "Adiós", StringComparison.OrdinalIgnoreCase);
// "Adiós mundo, Adiós todos"
Mayúsculas y minúsculas
ToUpper() y ToLower(). Cuidado, que en algunos idiomas (como el turco) esto tiene comportamientos especiales. Usad ToLowerInvariant() para lógica interna.
Dividir y unir (Split y Join)
Dos de los métodos más útiles para procesar datos (como CSVs).
// SPLIT: De String a Array
string csv = "Manzana,Pera,Plátano";
string[] frutas = csv.Split(',');
// JOIN: De Array a String
string[] palabras = { "Hola", "que", "tal" };
string frase = string.Join(" ", palabras); // "Hola que tal"
Formateo avanzado
Aunque la interpolación $ es la reina, el método clásico String.Format sigue siendo útil, especialmente cuando el formato viene de una base de datos o configuración externa.
decimal precio = 12.5m;
// Moneda (C)
Console.WriteLine($"{precio:C2}"); // 12,50 € (Según cultura local)
// Números con ceros a la izquierda (PadLeft/PadRight)
int numero = 5;
Console.WriteLine(numero.ToString("D3")); // "005"
