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 :

Comment utilser le default comparer dans une liste ?


Sujet :

C#

  1. #1
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut Comment utilser le default comparer dans une liste ?
    Bonjour

    J'ai constitué une liste composée d'elements (classes) contenant 2 int et un string

    Je veux trier cette liste sur le premier int de la classe
    Dois-je absolument definir un comparer pour cela ou le default comparer peut etre utilisé d'une maniere ou une autre.

    Dans le cas contraire, a quoi sert le default comparer ?

    Merci pour votre aide
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  2. #2
    Rédacteur
    Avatar de Greybird
    Inscrit en
    Juin 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 673
    Points : 1 271
    Points
    1 271
    Par défaut
    Le "default comparer" obtenu via Comparer<T>.Default (utilisé par List quand tu ne lui en fournis pas un explicitement) nécessite que ta classe T implémente IComparable<T> ou IComparable à défaut.

    Donc si tu implémentes l'une de ces deux interfaces sur la classe contenue dans ta liste pour fournir une comparaison basée uniquement sur ton premier entier, tu n'auras pas à fournir de comparateur à ta liste.

    Cette implémentation fournira de fait le comparateur par défaut pour ta classe, ce qui n'empêchera pas d'en fournir un autre suivant tes besoins à l'occasion, mais de manière explicite.

    Par exemple, le comparateur par défaut du type Int32 doit les trier dans l'ordre croissant, mais rien n'empêcherai de fournir un comparateur qui les trierait dans l'ordre inverse, qu'il faudrait alors indiquer à la liste.

  3. #3
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Merci

    Donc si tu implémentes l'une de ces deux interfaces sur la classe contenue dans ta liste pour fournir une comparaison basée uniquement sur ton premier entier, tu n'auras pas à fournir de comparateur à ta liste.
    Pour ca je ne sais pas bien ce qu'il faut faire et je n'ai pas encore manipulé des types interface (je dois encore apprendre ca)


    Finalement un bon comparer fait maison c'est sans doute le plus simple et le plus explicite
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par olibara Voir le message
    Merci


    Pour ca je ne sais pas bien ce qu'il faut faire et je n'ai pas encore manipulé des types interface (je dois encore apprendre ca)


    Finalement un bon comparer fait maison c'est sans doute le plus simple et le plus explicite
    Justement, ce serait l'occasion d'apprendre à utiliser les interfaces. Ce n'est pas difficile à comprendre, et c'est un concept très puissant. En simplifiant un peu, implémenter une classe revient à hériter d'une classe abstraite, à 2 différences près :
    - tu peux implémenter plusieurs interfaces, alors que tu ne peux hériter que d'une seule classe
    - une interface ne contient aucun code, seulement les déclarations des méthodes et propriétés (alors qu'une classe abstraite peut avoir des méthodes non-abstraites)
    Pour les détails => voir les cours ou la doc...

    En fait, je pense qu'il faut implémenter IComparable pour définir l'ordre de tri "naturel" pour ce type (et c'est l'ordre qui sera utilisé par défaut). Pour trier d'une façon plus spécifique, tu utilises un Comparer.

  5. #5
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Merci je vais piocher un peu les interfaces !
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  6. #6
    Rédacteur
    Avatar de Greybird
    Inscrit en
    Juin 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 673
    Points : 1 271
    Points
    1 271
    Par défaut
    Citation Envoyé par olibara Voir le message
    Merci je vais piocher un peu les interfaces !
    Si tu comptes faire un développement un tantinet sérieux, c'est en effet quelque chose à investiguer d'urgence...

    Peut-être devrais-tu te familiariser avec les concepts de base du langage dans un premier temps, parce que les interfaces c'est plutôt au tout début . Une fois le langage appréhendé, tu pourras explorer l'API offerte par le framework beaucoup plus sereinement.

  7. #7
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Merci Greybird

    ???

    J'ai déja fait trois applications tres sérieuses et tres complete et pour aucunes de ces trois je n'ai eu besoin de cet animal "interface"

    C'est sans doute la face cachée de la lune que je ne connais pas encore et qui recelle des trésors conceptuels inexploités. Mais ca ne m'a pas empeché d'avancer jusqu'ici.

    Si tu connais un lien vers un tuto bien fait, j'achete
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  8. #8
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Salut Graybird

    Oui j'investigue un peu et si je comprends bien le concept d'interface, c'est pour ajouter une couche d'abstraction complémentaire entre l'intention d'une methode et son codage

    Mais il ne me semble pas que l'usage des interface soit particulierement répandu et populaire ... ?
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  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
    Tout ADO.Net est basé dessus, et dès qu'on bosse sur les collections, c'est quand même bien pratique d'avoir une fonction qui prend juste un IEnumerable<T> en paramètre parce qu'elle ne fait rien d'autre que parcourir un paramètre séquentiellement. Exemple bidon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int Somme(IEnumerable<int> source)
    {
    int result = 0;
    foreach(int i in source) // seul le fait que source soit énumérable nous intéresse
      result += i;
    return result;
    }
     
    int a = Somme(uneList);
    int b = Somme(unDico.Values);
    int c = Somme(unArraydEntiers);
    int d = Somme(uneMethodeAvecUnYieldReturnDedans());
    ಠ_ಠ

  10. #10
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 47
    Points : 24
    Points
    24
    Par défaut
    Bonjour,

    Cette discussion sur les interfaces m'a fait prendre conscience que je sais très bien ce qu'est une interface, mais que je ne sais pas du tout quand l'utiliser.

    Ma question, plus concrètement est:
    Partons du principe que je suis en phase de conception, le nez dans les diagrammes UML.
    Quand dois-je me dire: tiens là il faut que j'utilise une interface ?

    Actuellement, je pense être incapable d'intégrer les interfaces dans une conception.
    Je n'ai pas trouvé de réponse claire à ce sujet alors si vous pouviez avoir l'aimabilité de m'expliquer ou de m'indiquer un petit tutorial/article là dessus, je serais preneur

  11. #11
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Salut
    Merci pour ta réponse et cet exemple tres clair !

    Oui vu comme ca c'est effectivement fondamental et je comprends que c'est une base d'ADO.NET

    Ce que je voulais dire c'est qu'il me semble qu'en général peu de developpeurs ont le reflexe d'ajouter des interface dans leur application la ou ca pourrait etre utile
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  12. #12
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Bonjour

    Un lien intéressant que j'ai trouvé

    http://www.codeproject.com/KB/cs/abs...nterfaces.aspx


    La discussion et l'exemple portent surtout sur la distinction entre Abstact et Interfaces

    Mais ca aide a assimiler les concepts
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  13. #13
    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
    Je dirais qu'avant de créer ses interfaces, il est sain et instructif de regarder l'usage que le framework en fait déjà. Comme je disais tout à l'heure, l'ensemble des classes dans System.Collections(.Generics) implémente des tas d'interfaces, qui héritent les unes des autres, et qui permettent à l'image des iterators C++ de manipuler des "conteneurs" sans se soucier de savoir comment cela a été implémenté.
    Autre exemple : en remoting, on a besoin de spécifier un canal par le quel transitent les données entre deux applis. Il y a donc une interface IChannel ; après, le framework propose un TcpChannel, un HttpChannel, et des tiers peuvent en fournir d'autres (dans mon cas IiopChannel par exemple), dont l'utilisation est identique bien que l'implémentation soit complètement différente.

    Bref, mon conseil est le suivant : quand on crée une fonction prenant on objet bien connu en paramètre, il peut être intéressant de se dire "qu'est-ce que j'utilise vraiment de cet objet ?" afin de rendre très simplement cette méthode très générale. Dans mon exemple de tout à l'heure, on ne cherche qu'à itérer ; un ienumerable suffit. Si on avait besoin de la taille de la collection, un ICollection<T> conviendrait mieux.

    Pour ADO.Net, un article de SaumonAgile explique très bien cela. Plutôt que coller en dur que l'on bosse avec un OracleParameter, un OracleConnection, un OracleCommand, etc., on peut déclarer des variables comme des IDbParameter, des IDbCommand, etc., ce qui permet de passer d'une bibliothèque d'accès aux données à une autre très facilement si besoin.
    ಠ_ಠ

  14. #14
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Pour BigFoot69

    Un autre lien en anglais mais intéressant

    http://www.brainbell.com/tutors/C_Sh...erface_Use.htm
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  15. #15
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Merci Guulh

    Tres bel exposé et tres clair !
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  16. #16
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 47
    Points : 24
    Points
    24
    Par défaut
    Merci olibara, je vais jeter un coup d'oeil

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

Discussions similaires

  1. [Débutant] Comment rechercher des objets identiques dans une liste de vue?
    Par christs dans le forum C#
    Réponses: 9
    Dernier message: 14/06/2011, 14h23
  2. Réponses: 4
    Dernier message: 21/11/2010, 15h54
  3. Comment recupérer les cases selectionnés dans une liste à Checkbox
    Par Ange_1987 dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 14/03/2009, 00h57
  4. Réponses: 7
    Dernier message: 07/01/2008, 17h50
  5. Comment récupérer le texte sélectionné dans une liste déroulante ?
    Par Je-cherche-pfe dans le forum Windows Forms
    Réponses: 3
    Dernier message: 02/09/2007, 20h35

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