domingo, 26 de septiembre de 2010

Linq: Usar operadores de Linq en lugar de un foreach

Éste es un caso en el que quería llenar un DropDownList utilizando el CascadingDropDown. En el método del WebService, quise usar el método AddRange, y así evitar tener que implementar un foreach para iterar por la colección de filas de un DataTable.

Por ejemplo, tengo un método que se llama Clientes.Listar(), el cual devuelve la lista de filas en un objeto DataTable, entonces para llenar al DropDownList tengo que usar un foreach para recuperar el valor que se va a mostrar en el DropDown y el valor llave que se utilizaría para saber cuál item se seleccionó. Utilizando el método AddRange del tipo List y las técnicas de Linq, tenemos el siguiente código de ejemplo:

--------------------
List valores = new List();
Clientes clientes = new Clientes();

valores.AddRange
(
    from fila in clientes.Listar().AsEnumerable()
    select new CascadingDropDownNameValue(fila["NOMBRE"].ToString(), fila["CODIGO"].ToString())
);
return values.ToArray();

--------------------
Otra alternativa de Linq pero expresada en secuencia de operadores de Linq sería de la siguiente forma:

--------------------
values.AddRange(clientes.Listar().AsEnumerable().Select(
fila => new CascadingDropDownNameValue
(
    fila["NOMBRE"].ToString(),
    fila["CODIGO"].ToString()
)));
--------------------

Cualquiera de los dos casos anteriores sirven para reemplazar el siguiente código:

foreach (DataRow fila in clientes.Listar().Rows)
{
     values.Add(new CascadingDropDownNameValue(fila["NOMBRE"].ToString(),   
     fila["CODIGO"].ToString()));
}

La diferencia, entre éste foreach y el uso de Linq es que Linq me permite hacer muchas cosas en una sola línea de código, en el peor de los casos tengo que agregar otras líneas, pero con las técnicas tradicionales, en lo personal, el código se vuelve para mí muy tedioso y en ocasiones dificil de entender.

Algunos dicen que Linq es más rápido, otros dicen que no siempre es el más rápido, independientemente de la eficiencia con que resuelva Linq el problema, prefiero Linq porque me permite codificar mejor casos difíciles donde tengo que dar tratamiento a por ejemplo muchos campos de una tabla o muchos datos de un arreglo, etc.

No hay comentarios: