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 :

[LINQ] Groupby , count et orderby


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    849
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 849
    Par défaut [LINQ] Groupby , count et orderby
    Bonjour,


    J'ai un petit problème pour faire une requête LINQ.

    J'ai des joueurs qui ont fait des "Choix". Je souhaite retenir le "choix" que les joueurs ont le plus choisis. En cas d'égalité, on regarde le choix du joueurs ayant le plus petit score, parmis les joueurs qui ont fait le choix qui a une égalité.
    Or je n'arrive pas à faire ça. J'arrive juste à trier sur le choix le plus grand. Je n'arrive pas regarder sur une seconde propriété.

    Dans cet exemple:
    - 2 joueurs ont fait le choix 1 (joueur 1 score 30, joueur 2 score 20)
    - 2 joueurs ont fait le choix 2 (joueur 3 score 100, joueur 4 score 10)
    - 1 joueur a fait le choix 3 (joueur 5 score 0)

    Comme il y a une égalité entre le choix 1 et le choix 2.
    On départage en fonction du score des joueurs qui ont choisis le score 1 ou 2. C'est donc le choix du joueur 4 qui est pris. Soit le choix 2


    Code C# : 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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    using System;
    using System.Collections.Generic;
    using System.Linq;
     
    namespace ConsoleApplication1
    {
        public class PlayerChoice
        {
            public Player Player { get; set; }
            public Choice Choice { get; set; }
        }
     
        public class Player
        {
            public int Score { get; set; }
        }
     
        public class Choice
        {
        }
     
        class Program
        {
            static void Main(string[] args)
            {
     
                var list = new List<PlayerChoice>();
     
                var c1 = new Choice();
                var c2 = new Choice();
                var c3 = new Choice();
     
                var p1 = new Player { Score = 30 };
                var p2 = new Player { Score = 20 };
                var p3 = new Player { Score = 100 };
                var p4 = new Player { Score = 10 };
                var p5 = new Player { Score = 0 };
     
                list.Add(new PlayerChoice { Choice = c1, Player = p1 });
                list.Add(new PlayerChoice { Choice = c1, Player = p2 });
                list.Add(new PlayerChoice { Choice = c2, Player = p3 });
                list.Add(new PlayerChoice { Choice = c2, Player = p4 });
                list.Add(new PlayerChoice { Choice = c3, Player = p5 });
     
               //Il n'y a pas de tri si il y a égalité pour départager sur le score
                var elt = list.GroupBy(x => x.Choice).OrderByDescending(x => x.Count()).First().Key;
                Console.ReadLine();
            }
        }
    }

    Merci pour votre aider apporté

  2. #2
    Membre Expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Par défaut
    Il y a peut-etre plus simple mais ça devrait donner ce que tu veux :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    var elt = list.GroupBy(x => x.Choice).Select(d => new {Choice = d.Key, NumberOfChoice = d.Count(),Min = d.Min( x => x.Player.Score)}).OrderByDescending(d => d.NumberOfChoice).ThenBy(d => d.Min);

    Le 1er élément de la collection est le choix le plus choisi, avec le score minimum.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    849
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 849
    Par défaut
    Merci.

    Et pour trouver le choix du joueur qui a le score le plus petit ?
    Dois je faire un selectmany sur le player ?

  4. #4
    Membre Expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Par défaut
    J'ai modifié la query linq, comme ça tu as le joueur :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    var elt = list.GroupBy(x => x.Choice).Select(d => new {Choice = d.Key, NumberOfChoice = d.Count(),MinPlayer = d.OrderBy(x => x.Player.Score).First().Player}).OrderByDescending(d => d.NumberOfChoice).ThenBy(d => d.MinPlayer.Score);
     
    // Pour avoir le joueur
    var player = elt.First();

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    849
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 849
    Par défaut
    Merci

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

Discussions similaires

  1. Requete Linq GroupBy sur plusieurs colonnes
    Par jospinkapwa dans le forum VB.NET
    Réponses: 0
    Dernier message: 28/01/2011, 14h59
  2. [Linq Dynamic] orderby avec comparer
    Par anthyme dans le forum Linq
    Réponses: 0
    Dernier message: 04/02/2010, 17h20
  3. [Linq to sql] Exception sur Count
    Par Arnard dans le forum Accès aux données
    Réponses: 14
    Dernier message: 27/10/2008, 15h59
  4. [Linq to sql] Exception sur Count
    Par Arnard dans le forum Linq
    Réponses: 14
    Dernier message: 27/10/2008, 15h59
  5. Linq, OrderBy sur propriété hors base de donnée
    Par neptune dans le forum Framework .NET
    Réponses: 7
    Dernier message: 25/06/2008, 10h05

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