TRIER UNE ILIST D'OBJET EN FONCTION D'UNE PROPRIÉTÉ DES OBJETS DE LA LISTE

cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 - 31 mai 2007 à 17:00
romagny13 Messages postés 687 Date d'inscription lundi 10 janvier 2005 Statut Membre Dernière intervention 27 août 2014 - 1 juin 2007 à 13:10
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/42917-trier-une-ilist-d-objet-en-fonction-d-une-propriete-des-objets-de-la-liste

romagny13 Messages postés 687 Date d'inscription lundi 10 janvier 2005 Statut Membre Dernière intervention 27 août 2014 3
1 juin 2007 à 13:10
n'y aurait il pas une solution qui permettrait d'eviter de passer par la reflection selon vous ?
+
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
1 juin 2007 à 11:51
Cette source ne sera pas conservée, je propose donc à l'auteur de partager ce code via un snippet que j'ai reformé avec la modif de Warny.
cs_Warny Messages postés 473 Date d'inscription mercredi 7 août 2002 Statut Membre Dernière intervention 10 juin 2015
1 juin 2007 à 11:25
Si, c'est sa source... avec la modif que j'ai proposé et avec la reflexion
romagny13 Messages postés 687 Date d'inscription lundi 10 janvier 2005 Statut Membre Dernière intervention 27 août 2014 3
1 juin 2007 à 11:24
ah quoique il n'y a pas de clause where j'ai parlé trop vite,
mais ca aurait été pas mal si Bidou avait mis le code dont il parle avec une clause where :p
romagny13 Messages postés 687 Date d'inscription lundi 10 janvier 2005 Statut Membre Dernière intervention 27 août 2014 3
1 juin 2007 à 11:19
c'est vrai que c'est beaucoup mieux de pouvoir eviter d'utiliser la reflection ..
waa c'est quoi ce code Bidou .. 10/10 lol
à non c'est pas sa source
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
1 juin 2007 à 09:55
L'auteur peut alors mettre un snippet sur www.codyx.org (même login et user):

public class EntityComparer<T> : IComparer<T>
{
private string propertyName;
private TriDirection sortDirection;

/// <summary>
/// Constructeur par défaut
/// </summary>
/// Nom de la propriété qui va servir pour le tri


/// Sens de tri


public EntityComparer(string propertyName, TriDirection direction): base()
{
this.propertyName = propertyName;
sortDirection = direction;
}

/// <summary>
/// Permet de faire la comparaison en fonction de la propertName définit
/// Type supporté : string, int, decimal, DateTime, double


/// </summary>
///


///


/// <returns></returns>
public int Compare(T entity1, T entity2)
{
IComparable value1 = entity1.GetType().GetProperty(propertyName).GetValue(entity1, null) as IComparable;
IComparable value2 = entity2.GetType().GetProperty(propertyName).GetValue(entity2, null) as IComparable;

if (value1 != null && value2 != null)
{
return (this.sortDirection == TriDirection.Ascendant) ?
value1.CompareTo(value2) : value2.CompareTo(value1);
}
... <= gérer ce cas
}
}

public enum TriDirection
{
Ascendant,
Descendant
}

Sera largement suffisant.
cs_Warny Messages postés 473 Date d'inscription mercredi 7 août 2002 Statut Membre Dernière intervention 10 juin 2015
1 juin 2007 à 09:19
Bidou -> ceci dit, ça ce teste si une propriété dérive de IComparable, quitte à lever une exception si ce n'est pas le cas.
La source ne me parait pas ininterressante, vu qu'elle montre comment utiliser la reflexion. Pour ma part, c'est une source que je suis susceptible de reprendre pour mon explorateur de fichiers.
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
1 juin 2007 à 08:36
Warny> Oui, mais ta property doit dériver de IComparable sinon pas de comparaison possible (on a pas forcément affaire à un object qui implémente cette interface). Dans ce cas, je préfère passer par une clause where en précisant l'interface : pas besoin de Reflexion, de cast et autre bricolerie comme ça :-)

Dans l'état, cette source ne sera pas conservée étant donnée ces limitations et son utilité très relative...
romagny13 Messages postés 687 Date d'inscription lundi 10 janvier 2005 Statut Membre Dernière intervention 27 août 2014 3
31 mai 2007 à 18:45
éé c'est peut etre pas une mauvaise idée
le pire c'est que je n'y avais même pas penser, vu que je me fais générer la moitié de mon code par des utilitaires
cs_Warny Messages postés 473 Date d'inscription mercredi 7 août 2002 Statut Membre Dernière intervention 10 juin 2015
31 mai 2007 à 18:36
tu t'embêtes beaucoup avec les types supportés !
il suffit de faire :

IComparable value1 = entity1.GetType().GetProperty(propertyName).GetValue(entity1, null) as IComparable;
IComparable value2 = entity2.GetType().GetProperty(propertyName).GetValue(entity2, null) as IComparable;

if (value1 != null && value2 != null)
{
return (this.sortDirection == TriDirection.Ascendant) ?
value1.CompareTo(value2) : value2.CompareTo(value1);

}
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
31 mai 2007 à 17:00
Mouais.......
C'est beaucoup mieux de mettre une clause where qui force l'héritage d'une interface et de travailler avec objet typé par la suite, et sans reflection.
Non?