TRIER UNE ILIST D'OBJET EN FONCTION D'UNE PROPRIÉTÉ DES OBJETS DE LA LISTE
cs_Bidou
Messages postés5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 2013
-
31 mai 2007 à 17:00
romagny13
Messages postés687Date d'inscriptionlundi 10 janvier 2005StatutMembreDernière intervention27 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.
romagny13
Messages postés687Date d'inscriptionlundi 10 janvier 2005StatutMembreDernière intervention27 août 20143 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és5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 201361 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és473Date d'inscriptionmercredi 7 août 2002StatutMembreDernière intervention10 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és687Date d'inscriptionlundi 10 janvier 2005StatutMembreDernière intervention27 août 20143 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és687Date d'inscriptionlundi 10 janvier 2005StatutMembreDernière intervention27 août 20143 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és5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 201361 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
/// <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és473Date d'inscriptionmercredi 7 août 2002StatutMembreDernière intervention10 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és5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 201361 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és687Date d'inscriptionlundi 10 janvier 2005StatutMembreDernière intervention27 août 20143 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és473Date d'inscriptionmercredi 7 août 2002StatutMembreDernière intervention10 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;
cs_Bidou
Messages postés5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 201361 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?
1 juin 2007 à 13:10
+
1 juin 2007 à 11:51
1 juin 2007 à 11:25
1 juin 2007 à 11:24
mais ca aurait été pas mal si Bidou avait mis le code dont il parle avec une clause where :p
1 juin 2007 à 11:19
waa c'est quoi ce code Bidou .. 10/10 lol
à non c'est pas sa source
1 juin 2007 à 09:55
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.
1 juin 2007 à 09:19
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.
1 juin 2007 à 08:36
Dans l'état, cette source ne sera pas conservée étant donnée ces limitations et son utilité très relative...
31 mai 2007 à 18:45
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
31 mai 2007 à 18:36
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);
}
31 mai 2007 à 17:00
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?