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 :

Classer des nombres en ordre décroissant


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 18
    Points : 21
    Points
    21
    Par défaut Classer des nombres en ordre décroissant
    Bonjour,

    je dispose d'un fichier dont la structure globale est la suivante :

    nom1,score1
    nom2,score2
    nomN,scoreN

    Je cherche à savoir comment je pourrais trier les scores par ordre décroissant, en gardant l'association avec le nom.
    Exemple du fichier :
    roger,42
    bertrand, 87
    marion,10

    qui donnerait :
    bertrand, 87
    roger,42
    marion,10

    Voilà, je souhaite si possible une méthode simple car j'ai essayé des tas de trucs compliqués mais sans parvenir à un résultat.
    Merci d'avance.

  2. #2
    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
    En supposant que tu charges ton fichier dans une liste d'objets comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class ScoreEntry
    {
        public string Name { get; set; }
        public int Score { get; set; }
    }
    Tu peux trier comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    List<ScoreEntry> scores = ...
    List<ScoreEntry> sortedScores = scores.OrderByDescending(e => e.Score).ToList();
    La technique ci-dessus crée une nouvelle liste, si tu veux trier la liste sans en créer une nouvelle, tu peux faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    scores.Sort((a, b) => a.Score.CompareTo(b.Score));

  3. #3
    Membre du Club Avatar de MigsFR
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2008
    Messages : 54
    Points : 46
    Points
    46
    Par défaut
    Sinon, si tu veux éviter d'ajouter une nouvelle classe tu as aussi la possiblité d'utiliser la classe Dictionary.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Dictionary<string, int> scores = new Dictionary<string, int>();
    scores.Add("roger", 42);
    scores.Add("bertrand", 87);
    scores.Add("marion", 10);
     
    var sortedScores = scores.OrderByDescending(x => x.Value);
     
    foreach (var score in sortedScores)
    {
         Console.WriteLine("Score: " + score.Value);
    }
    Migs - Quand vient l'orgueil, vient aussi le mépris, mais la sagesse est avec les humbles.

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 206
    Points : 196
    Points
    196
    Par défaut
    Il existe même directement une classe SortedDictionary.

  5. #5
    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 kineton Voir le message
    Il existe même directement une classe SortedDictionary.
    Oui mais ça trie sur la clé, pas sur la valeur...

  6. #6
    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
    Et pour rafiner tu peux ecrire ton propre compareur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     public class ScoreEntryComparer : IComparer<ScoreEntry>
        {
          public int Compare(ScoreEntry a, ScoreEntry b)
          {
            int dif;
            dif = a.Score - b.Score;
            if (dif != 0) return dif;
            dif = a.Name.CompareTo(b.Name);
            return dif;
          }
        };
    Dans ce cas tu peux faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaListe.Sort(new ScoreEntryComparer());
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 206
    Points : 196
    Points
    196
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Oui mais ça trie sur la clé, pas sur la valeur...
    certes,mais il est également possible de trier les valeurs de la même manière qu'un dictionnary...

    http://msdn.microsoft.com/fr-fr/library/yy2kxzhx.aspx

  8. #8
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    Citation Envoyé par MigsFR Voir le message
    Sinon, si tu veux éviter d'ajouter une nouvelle classe tu as aussi la possiblité d'utiliser la classe Dictionary.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Dictionary<string, int> scores = new Dictionary<string, int>();
    scores.Add("roger", 42);
    scores.Add("bertrand", 87);
    scores.Add("marion", 10);
     
    var sortedScores = scores.OrderByDescending(x => x.Value);
     
    foreach (var score in sortedScores)
    {
         Console.WriteLine("Score: " + score.Value);
    }
    Le type anonyme marche très bien aussi

  9. #9
    Membre du Club Avatar de MigsFR
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2008
    Messages : 54
    Points : 46
    Points
    46
    Par défaut
    Citation Envoyé par PitMaverick78 Voir le message
    Le type anonyme marche très bien aussi
    C'est vrai tant qu'à mettre de l'anonyme autant y aller jusqu'au bout...

    Cela dit, j'ai pas mis les vrais types ici par flème mais de manière général il vaut mieux éviter les types anonymes, ne serait-ce que pour la libilisité du code.
    Migs - Quand vient l'orgueil, vient aussi le mépris, mais la sagesse est avec les humbles.

  10. #10
    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 MigsFR Voir le message
    Cela dit, j'ai pas mis les vrais types ici par flème mais de manière général il vaut mieux éviter les types anonymes, ne serait-ce que pour la libilisité du code.
    Ah ? Je trouve pas que ça nuise à la lisibilité du code... au contraire, c'est souvent plus clair, parce que le type ne contient que ce dont tu as vraiment besoin.

    D'ailleurs je ne vois pas non plus d'autres raisons de pas les utiliser... C'est comme des types normaux, le compilateur génère une vraie classe sous le capot, c'est juste qu'elle n'a pas de nom dans le code.

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

Discussions similaires

  1. Quel algorithme pour classer des opérations par ordre de priorité
    Par verbose dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 16/06/2014, 11h11
  2. boxplot axe des abscisse par ordre décroissant
    Par nostress dans le forum SAS STAT
    Réponses: 2
    Dernier message: 23/09/2009, 09h44
  3. [MySQL] Affichage des dates par ordre décroissant
    Par ash_rmy dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 25/03/2007, 13h01
  4. envoyer des nombres en ordre
    Par Micheal1221 dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 07/08/2006, 03h37
  5. [MySQL] Classer des résultats par ordre alphabétique
    Par Him dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 13/07/2006, 14h59

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