Il y a quelques temps (avant l'arrivée de Linq) j'avais implémenté pour un client un GenericSorter, classe héritant de List<T> et IComparer<T> afin de gérer les problématiques de tri dans des collections.
En utilisant Linq chez un client hier, voici une possibilité d'implémenter un tri générique sur n'importe quelle colonne d'un objet.
1) Cas simple : J'ai une collection de Client que je veux pouvoir trier sur n'importe quelle colonne passée en paramètre en tant que chaîne :
public List<Client> OrdonneClient(List<Client> lesAdherents, string colonneOrder, bool ascendant)
{
IEnumerable<Client> lesClients;
if (ascendant)
{
lesClients = from c in lesAdherents
orderby c.GetType().GetProperty(colonneOrder).GetValue(c, null) ascending
select c;
}
else
{
lesClients = from c in lesAdherents
orderby c.GetType().GetProperty(colonneOrder).GetValue(c, null) descending
select c;
}
return lesObjetsEnumerables.ToList();
}
2) Poussons le bouchon un peu plus loin pour atteindre une généricité au niveau de la collection d'objet:
public List<T> OrdonneCollection<T>(List<T> lesObjets, string colonneOrder, bool ascendant)
{
try
{
IEnumerable<T> lesObjetsEnumerables;
if (ascendant)
{
lesObjetsEnumerables = from c in lesObjets
orderby c.GetType().GetProperty(colonneOrder).GetValue(c, null) ascending
select c;
}
else
{
lesObjetsEnumerables = from c in lesObjets
orderby c.GetType().GetProperty(colonneOrder).GetValue(c, null) descending
select c;
}
return lesObjetsEnumerables.ToList();
}
catch { throw new NotImplementedException("Colonne non implémentée");}
}
Tout ceci n'a de sens que dans le cas où l'on vous passe une colonne en chaîne de caractère comme les SortExpression des gridView d'ASP.NET.
Si vous connaissez la colonne sur laquelle trier, il suffit de faire :
maCollection.OrderBy(element=>element.Property);
3) Tiens puisqu'on parle de lambda, simplifions la dernière méthode :
public static List<T> OrdonneCollectionLambda<T>(List<T> lesObjets, string colonneOrder, bool ascendant)
{
try
{
if (ascendant)
return lesObjets.OrderBy(element => element.GetType().GetProperty(colonneOrder).GetValue(element, null)).ToList();
else
return lesObjets.OrderByDescending(element => element.GetType().GetProperty(colonneOrder).GetValue(element, null)).ToList();
}
catch { throw new NotImplementedException("Colonne non implémentée"); }
}
Alexandre Equoy