IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

IComparer, IComparable et tri sur List<T>


Sujet :

C#

  1. #1
    Membre régulier Avatar de TheCaribouX
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2008
    Messages
    255
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2008
    Messages : 255
    Points : 122
    Points
    122
    Par défaut IComparer, IComparable et tri sur List<T>
    Bonjour,

    ca fait un ptit moment que je peine sur ce problème alors je me permets dde demander...

    j'ai deux classes (pour simplifier..). L'une contient une List<T> de l'autre. J'aimerais non seulement pouvoir appeler:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    List<classeB> l = new List<classeB>();
    l.Sort();
    et pouvoir personnaliser la méthode de tri, mais aussi pouvoir "passer un paramètre" à la méthode sort pour spécifier sur quel champ trier.

    J'ai trouvé deux trois éléments de réponse sur le net dont ce post et j'ai donc fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    classe A:IComparer<classeB>
    {
    List<classeB>;
    private int indiceDeComparaison ;
     
    	public int Compare( object lhs, object rhs )
    	{
    		if((lhs is classeB)&&(rhs is classeB))
    		{
    			return lhs.CompareTo( rhs, IndiceDeComparaison ) ;
    		}
    		throw new ArgumentException("object is not an classseB");
    	}
    	public int IndiceDeComparaison
    	{
    		get{ return indiceDeComparaison ; }
    		set{ indiceDeComparaison = value ; }
    	}
            [...]
    main{
                    this.indiceDeComparaison = 1;
                    this.classeB.Sort();
     
    }
     
     
     
    classseB: IComparable{
    	public int CompareTo( classeB element )
    	{
    		return ...qqch...;
    	}
     
    	public int CompareTo(classeB element, int indexCritereDeComparaison ) 
    	{
    	  ... la comparaison souhaitee
    	}
    }
    mais je m'apercois que la méthode sort ne "passe pas" par la méthode Compare et va directement donc à la méthde CompareTo(classeB x).

    Ca doit paraitre evident a la plupart d'entre vous, mais je tourne en rond.. serait-il possible de me mettre sur la voie?

    merci d'avance!

  2. #2
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class A
    {
      public int i;
      public string s;
    }
    List<A> l = new List<A>();
    l.Sort(delegate (A a1, A a2) { return a1.i - a2.i; } ); // tri par le champ i
    l.Sort(delegate (A a1, A a2) { return string.Compare(a1.s, a2.s); } ); // tri par le champ s
    par contre, il n'existe pas à ma connaissance de moyen standard de comparer des instances d'une même classe selon une propriété donnée. Il n'y a pas de
    l.Sort("i") (mais bon ça se code).
    ಠ_ಠ

  3. #3
    Membre expert
    Avatar de hed62
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2007
    Messages
    2 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 029
    Points : 3 134
    Points
    3 134
    Par défaut
    (mais bon ça se code).
    Tout à fait, il suffit de passer un troisième paramètre au délégué par exemple, et "switcher" dessus.
    Hervé Delannoy, Ingénieur études&développement.

    Je n'accepte pas les demandes de mise en relation MSN/yahoo sans motif.
    ------------------------------------------------------------------------
    Si , ni , ne peuvent vous aider, mais nous oui, pensez à un pti et au !
    Merci de vous relire
    ____________________________________________________________________________________
    Recherche joueurs de "Magic" sur Lille et environs.
    Donner plutôt que jeter.

  4. #4
    Membre régulier Avatar de TheCaribouX
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2008
    Messages
    255
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2008
    Messages : 255
    Points : 122
    Points
    122
    Par défaut
    merci pour les réponses!

    donc en imaginant que le code du dlegate fasse plus qu'une ligne, je vais devoir replacer ce code a chaque endroit ou cela est necessaire? De plus la méthode de comparaison d'objets de classe A se fait ddans une autre classe, ca serait pas plus correct de le faire de la meme facon que dans le post que j'ai mentionné?

    je vais tenter votre méthode, ca me suffit peut etre mais si quelqu'un a d'autres infos par rapport a l'autre méthode, c'est avec plaisir

  5. #5
    Membre expert
    Avatar de hed62
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2007
    Messages
    2 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 029
    Points : 3 134
    Points
    3 134
    Par défaut
    je vais devoir replacer ce code a chaque endroit ou cela est necessaire?
    Surtout pas ! C'est aussi un interêt des delegues.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public Action monTrieur()
    {
      return delegate(...)...
    }
     
    liste.Sort(monTrieur);
    Hervé Delannoy, Ingénieur études&développement.

    Je n'accepte pas les demandes de mise en relation MSN/yahoo sans motif.
    ------------------------------------------------------------------------
    Si , ni , ne peuvent vous aider, mais nous oui, pensez à un pti et au !
    Merci de vous relire
    ____________________________________________________________________________________
    Recherche joueurs de "Magic" sur Lille et environs.
    Donner plutôt que jeter.

  6. #6
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Citation Envoyé par TheCaribouX Voir le message
    merci pour les réponses!

    donc en imaginant que le code du dlegate fasse plus qu'une ligne, je vais devoir replacer ce code a chaque endroit ou cela est necessaire? De plus la méthode de comparaison d'objets de classe A se fait ddans une autre classe, ca serait pas plus correct de le faire de la meme facon que dans le post que j'ai mentionné?

    je vais tenter votre méthode, ca me suffit peut etre mais si quelqu'un a d'autres infos par rapport a l'autre méthode, c'est avec plaisir
    L'exemple que je t'ai donné utilise des fonctions anonymes, mais tu peux aussi utiliser des fonctions nommées.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    private int CompareI(A a1, A a2)
    {
      return a1 - a2;
    }
     
    l.Sort(this.CompareInt);
    // qui est équivalent à...
    l.Sort(new Comparer<int>(this.CompareInt);
    ಠ_ಠ

  7. #7
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Je me permets de rajouter encore une autre équivalence
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    private int CompareI(A a1, A a2)
    {
      return a1 - a2;
    }
     
    l.Sort(this.CompareInt);
    // qui est équivalent à...
    l.Sort(new Comparer<int>(this.CompareInt);
    // qui est équivalent à...
    l.Sort((a1, a2) => a1 - a2);
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  8. #8
    Membre expert
    Avatar de hed62
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2007
    Messages
    2 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 029
    Points : 3 134
    Points
    3 134
    Par défaut
    l.Sort((a1, a2) => a1 - a2);
    Cette syntaxe fonctionne ?

    Avec des objets plus complexes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class truc
    {
      public int a;
    }
     
    List<truc> list = // init
    list.Sort((t1,t2) => t1.a-t2.a);
    Marcherait (hormis le fait que le bout de code soit mis n'importe où :p) ?
    Hervé Delannoy, Ingénieur études&développement.

    Je n'accepte pas les demandes de mise en relation MSN/yahoo sans motif.
    ------------------------------------------------------------------------
    Si , ni , ne peuvent vous aider, mais nous oui, pensez à un pti et au !
    Merci de vous relire
    ____________________________________________________________________________________
    Recherche joueurs de "Magic" sur Lille et environs.
    Donner plutôt que jeter.

  9. #9
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Citation Envoyé par SaumonAgile Voir le message
    // qui est équivalent à...
    l.Sort((a1, a2) => a1 - a2);
    Faut vraiment que je me mette à C# 3
    ಠ_ಠ

  10. #10
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    hed62 : oui
    Guulh : oui aussi
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  11. #11
    Membre expert
    Avatar de hed62
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2007
    Messages
    2 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 029
    Points : 3 134
    Points
    3 134
    Par défaut
    ah, en C#3
    Hervé Delannoy, Ingénieur études&développement.

    Je n'accepte pas les demandes de mise en relation MSN/yahoo sans motif.
    ------------------------------------------------------------------------
    Si , ni , ne peuvent vous aider, mais nous oui, pensez à un pti et au !
    Merci de vous relire
    ____________________________________________________________________________________
    Recherche joueurs de "Magic" sur Lille et environs.
    Donner plutôt que jeter.

  12. #12
    Membre régulier Avatar de TheCaribouX
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2008
    Messages
    255
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2008
    Messages : 255
    Points : 122
    Points
    122
    Par défaut
    Ca fonctionne nickel!

    Décidemment j'apprends beaucoup a trainer sur ce forum

    merci a tous!

    [Edit] Si d'aventure vous vous connaissez, je vous propose que vous vous offriez mutuellement une biere de ma part pour vous remercier de votre aide

  13. #13
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Citation Envoyé par TheCaribouX Voir le message
    Décidemment j'apprends beaucoup a trainer sur ce forum
    Et nous on apprend à beaucoup trainer sur ce forum
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Tri sur liste d'objet
    Par topolino dans le forum ASP.NET
    Réponses: 5
    Dernier message: 23/01/2009, 10h59
  2. Tri sur liste modifiable
    Par JeanMikael dans le forum VBA Access
    Réponses: 9
    Dernier message: 27/09/2007, 11h46
  3. Tri sur liste chainée
    Par SevSof dans le forum C
    Réponses: 16
    Dernier message: 27/05/2007, 00h45
  4. [Fonction]tri sur liste déroulante
    Par maxeur dans le forum IHM
    Réponses: 8
    Dernier message: 16/04/2007, 10h00
  5. Requête, tri sur liste de choix
    Par seb.kepka dans le forum Access
    Réponses: 1
    Dernier message: 15/05/2006, 14h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo