Procesamiento de Strings de manera eficiente con C#

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.

Procesamiento de Strings  de manera eficiente con C#

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#.

Artículo Anterior Artículo Siguiente