En el post Procesamiento de Strings de manera eficiente con C# se explica como realizar procesamiento de cadenas con CSharp de manera más eficiente.
Un generador de perfiles indica un problema en parte de su código que genera una cadena grande en C# de forma iterativa y necesita mejorar el rendimiento para ser usado en aplicaciones a futuro.
He aquí la clases con las cual vamos a trabajar.
public class InvoiceItem
{
public decimal Cost { get; set; }
public string Description { get; set; }
}
Ahora vamos a agregar un poco de información la clase de ejemplo declarada anteriormente. En el siguiente código vamos a crear una lista con 100 items.
static List<InvoiceItem> GetInvoiceItems()
{
var items = new List<InvoiceItem>();
var rand = new Random();
for (int i = 0; i < 100; i++)
items.Add(
new InvoiceItem
{
Cost = rand.Next(i),
Description = "Invoice Item #" + (i+1)
});
return items;
}
Ahora vamos a utilizar 2 métodos diferentes para procesar los Strings, mostrando la manera más eficiente y deficiente.
En nuestro primer ejemplo estamos pidiendo concatenar el precio del item más su precio haciendo un recorrido por cada elemento de la Lista. Este es el método ineficiente.
static string DoStringConcatenation(List<InvoiceItem> lineItems)
{
string report = "";
foreach (var item in lineItems)
report += $"{item.Cost:C} - {item.Description}\n";
return report;
}
La lógica del método DoStringConcatenation extrae el costo y la descripción de cada artículo de factura y los concatena en una cadena creciente. La concatenación de unas pocas cadenas puede pasar desapercibida. Sin embargo, imagina si fueran 15, 40 o 1000 líneas o más.Se muestra cómo la concatenación de cadenas es un proceso exponencialmente intensivo en tiempo y por ello debemos usar los métodos más eficientes.
Ahora se presenta el código mas eficiente para procesar las cadenas con C# .
static string DoStringBuilderConcatenation(List<InvoiceItem> lineItems)
{
var reportBuilder = new StringBuilder();
foreach (var item in lineItems)
reportBuilder.Append($"{item.Cost:C} - {item.Description}\n");
return reportBuilder.ToString();
}
El método DoStringBuilderConcatenation soluciona el problema. Utiliza la clase StringBuilder, que se encuentra en el espacio de nombres System.Text. Utiliza el patrón de construcción, donde cada AppendText agrega la nueva cadena a la instancia de StringBuilder, reportsBuilder. Antes de regresar, el método llama a ToString para convertir todo el contenido de StringBuilder en un String.
Y finalmente todo junto en el método principal.
static void Main(string[] args)
{
List<InvoiceItem> lineItems = GetInvoiceItems();
DoStringConcatenation(lineItems);
DoStringBuilderConcatenation(lineItems);
}
Espero que los ejemplos mostrados sean de ayuda para procesar strings de una manera más eficiente con C#.