viernes 9 de octubre de 2009

Tratando de recorrer menos las listas

personalmente estoy casi empeñado en tratar de cada dia recorrer menos las listas, estas son muy costosas de recorrer, cuando es una tarea muy comun como en zeusnet.

En zues estamos medios fritos por el tema de hibernate, que trae una lista muy grande y hay que filtrarla, cuando no hay un hql que se adapte a lo que necesitamos.

Hay una forma de recorrer menos las listas, usando Delegate

para buscar en mi blog puse un post. aqui lo dejo.

Ahora necesita eliminar datos de una lista, que cumpleran con x condiciones, tenia que recorrer dos listas, lo cual es bastante costoso aqui el codigo.

List<int> positions = new List<int>();int pos = 0;foreach (var portitem in laytimeCalculation.PortItems){    pos = 0;    positions.Clear();    foreach (var item in portitem.DetailItems.Items){        if (item.DeductActivity != null && item.DeductActivity.ToUpper().Trim() == "Vessel on  Demurrage".ToUpper().ToUpper())             positions.Add(pos);        pos++;        }    foreach (var i in positions){        portitem.DetailItems.Items.RemoveAt(i);    }}

Usando un delegate y el metodo deleteAll de las listas, asi solo recorremos solo una vez las listas.
var array = portitem.DetailItems.Items as List<LaytimeCalculationItem>;if (array != null)        array.RemoveAll(            delegate(LaytimeCalculationItem item){                return (item.DeductActivity != null &&                    item.DeductActivity.ToUpper().Trim().Equals("Vessel on  Demurrage".ToUpper()));                }        );

Es mas podriamos dejarla en una sola linea aunque sea mas dificil de leer
array.RemoveAll(delegate(LaytimeCalculationItem item){return (item.DeductActivity != null && item.DeductActivity.ToUpper().Trim().Equals("Vessel on  Demurrage".ToUpper()));});


Otra cosa importante es que podemos usar lambda, pero lamentamente no es proyecto, ya que compilamos en el framework 2, y lambda es del 3.