Ordenación de una List por un campo

24/09/2007 - 12:20 por Alhambra Eidos Kiquenet | Informe spam
Hola a todos,
tengo una lista genérica, similar a esta:

List<Product> donde la entidad Product es:

class Product
{
public int ProductID { get; set; }
public string ProductName { get; set; }
public int ProductType { get; set; }
public decimal UnitPrice { get; set; }
}

Tengo una lista así List<Product> en memoria que luego asigno a una DataList
(y hago databind). Y quiero ordenar por un campo que puede elegir el usuario:
ProductName y ProductType.

Cómo podría hacer un Sort de la lista genérica, y que esa ordenación sea
por un campo de la entidad, por ejemplo, ProductType ?

Gracias de antemano. Saludos.
http://www.alhambra-eidos.es/web2005/index.html
www.kiquenet.net

Preguntas similare

Leer las respuestas

#1 Alberto Poblacion
24/09/2007 - 12:34 | Informe spam
"Alhambra Eidos Kiquenet"
wrote in message news:
Tengo una lista así List<Product> en memoria que luego asigno a una
DataList
(y hago databind). Y quiero ordenar por un campo que puede elegir el
usuario:
ProductName y ProductType.

Cómo podría hacer un Sort de la lista genérica, y que esa ordenación sea
por un campo de la entidad, por ejemplo, ProductType ?




List<T> tiene una funcion Sort con varias sobrecargas que puedes usar
según cómo quieras hacer la comparación. La más sencilla es Sort() que lo
que hace es llamar a la función de comparación que tengas dentro de tu clase
Product. Para eso tienes que hacer que Product implemente el interfaz
IComparable (o IComparable<Product>), lo cual supone añadir dentro una
función Compare que compare dos productos según el criterio que te interese.

Otra alternativa es usar una de las sobrecargas de Sort que recibe como
argumento el sistema de comparación, con lo que no tienes que tocar la clase
Product. Por ejemplo:

List<Product> productos = ...;
productos.Sort(ComparaPorTipo);
...
private static int ComparaPorTipo(Product x, Product y)
{
return x.ProductType.CompareTo(y.ProductType);
}
Respuesta Responder a este mensaje
#2 Alhambra Eidos Kiquenet
24/09/2007 - 13:46 | Informe spam
Gracias,

Lo de implementar IComparable en la entidad, no estoy seguro si habría
problemas en un entorno WCF (en el que las entidades se transmiten por un
canal de comunicación y por tanto hay serialización).

Finalmente he hecho algo así:

datos.Sort(
delegate(TareaWFAsignada t1, TareaWFAsignada t2)
{
// Failed to compare two elements in the array
// Este error se produce porque el valor de la
propiedad es nulo.
//This might fix it: text1 = (text1==null)? text1 :
String.Empty;
//In C# 2.0 (VS 2005), you can use: text1 = text1 ??
String.Empty

if (ordenacion.CampoOrdenacion ==
CamposTareasAsignadas.NumExped)
{
string v1 = t1.Nexpedval ?? string.Empty;
string v2 = t2.Nexpedval ?? string.Empty;

if (descendente)
return v1.CompareTo(v2) * -1;
else
return v1.CompareTo(v2);

}

return 0;
});


Lo que hay que tener cuidado es con los valores nulables, no?. Por ejemplo,
qué comparación habría que hacer para una propiedad de tipo int? .

Saludos.
Respuesta Responder a este mensaje
#3 Alberto Poblacion
24/09/2007 - 14:08 | Informe spam
"Alhambra Eidos Kiquenet"
wrote in message news:
Lo de implementar IComparable en la entidad, no estoy seguro si habría
problemas en un entorno WCF (en el que las entidades se transmiten por un
canal de comunicación y por tanto hay serialización).



No, las entidades no se transmiten por el canal de comunicación. Lo que
se transmite es el ESTADO de la entidad, y en el destino se construye una
nueva entidad y se le "mete" ese estado. En consecuencia, no se "transmite"
la rutina de comparación, que es solo código ejecutable y no guarda nada en
el estado. Si tu implementación tiene una copia del comparador en ambos
extremos, no hay problema en hacer un Sort en cualquiera de ellos.

Lo que hay que tener cuidado es con los valores nulables, no?. Por
ejemplo,
qué comparación habría que hacer para una propiedad de tipo int? .



Tienes que hacer una comparación un poco más complicada, preguntando por
el HasValue, y si tiene valor comparas el Value, y si no tiene valor
normalmente se considera que tiene el valor más pequeño posible (es decir,
en el caso del int? lo tratas como si fuera un int.MinValue).
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida