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 :

Rechercher l'id qui a le moins d'occurences [Débutant]


Sujet :

C#

  1. #1
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 153
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut Rechercher l'id qui a le moins d'occurences
    Bonjour,

    J'ai une petite question d’algorithmie.
    Je dois avoir le cerveau gazé par ce lundi nuageux, mais il n'y a que des usines à gaz qui me viennent en tête, pour une problématique pourtant simple...

    J'ai un objet :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class MonObjet
    {
       public int id;
       public string nom;
     
       public MonObject(int ID, string NOM)
       {
            id = ID;
            nom = NOM;
       }
    }

    J'ai ensuite un List<MonObjet> initialisé de la sorte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    List<MonObjet> maliste = new List<MonObjet>();
    List.Add(new MonObjet(1, "Obj1"));
    List.Add(new MonObjet(2, "Obj2"));
    List.Add(new MonObjet(3, "Obj3"));
    List.Add(new MonObjet(3, "Obj3"));
    List.Add(new MonObjet(1, "Obj1"));
    List.Add(new MonObjet(1, "Obj1"));
    Je souhaite trouver l'ID de MonObjet qui a le moins d'occurences dans ma liste.

    J'ai pensé à faire une struct "Occurence" avec deux propriétés "id" et "nb", en faire un List, et pour chaque ligne de "maliste", alimenter une liste de "List<Occurence>", en incrémentant "nb" quand "id" existe déjà, ou en rajoutant une ligne...

    Puis enfin parcourir mon "List<Occurence>" pour retrouver le "id" qui a le plus petit "nb".

    Mais j'ai l'impression que je fais du grand n'importe quoi... Y'a pas plus simple ?

    Ici, je voudrais donc retrouver "2".

    Puisqu'il y a 3 occurences de l'id "1", 1 occurence de l'id "2" et 2 occurence de l'id "3".
    On ne jouit bien que de ce qu’on partage.

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 177
    Points : 4 489
    Points
    4 489
    Par défaut
    Tu as le droit a faire du linq?
    Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes

  3. #3
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 153
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Oui, sans problème.

    C'est un petit projet perso.

    Le seul truc c'est que je connais pas spécialement Linq, et que j'ai jamais pris le courage de m'y mettre pour de bon
    On ne jouit bien que de ce qu’on partage.

  4. #4
    Membre éprouvé Avatar de yonpo
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2010
    Messages
    617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2010
    Messages : 617
    Points : 947
    Points
    947
    Par défaut
    Salut,

    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
     
    int last = 0;
    int idFound = 0;
    foreach (var id in maliste.Select(o => o.id).Distinct())
    {
           i = maliste.Count(o => o.id == id);
           if (last == 0) last = i; // Init
     
           if (i <= last)
           {
               last = i;
               idFound = id;
            }
    }

    Par contre, seul le dernier id qui a le moins d'occurence est retenu.

  5. #5
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 177
    Points : 4 489
    Points
    4 489
    Par défaut
    En SQL ca aurait donner

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT id, count(*)
    FROM maListe 
    GROUP BY id
    HAVING count(*) >= ALL (SELECT count(*)
                        FROM maListe 
                        GROUP BY id)
    Il y a des conversiteurs de sql en linq sur le net mais je sais pas ce qu'il donne
    Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes

  6. #6
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 065
    Points : 4 229
    Points
    4 229
    Par défaut
    peut être en passant par un dictionnaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // on regroupe par id, on compte chaque occurence d'id et on trie par nombre d'occurence en sélectionnant la première
                int nb = maListe.GroupBy(l => l.id).ToDictionary(l => l.Key, l => l.Count()).OrderBy(v => v.Value).First().Key;

  7. #7
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 153
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Merci pour toutes ces réponses.

    La dernière me semble répondre exactement, et effectivement, c'est bien moins long que ma méthode

    Encore merci !
    On ne jouit bien que de ce qu’on partage.

  8. #8
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 065
    Points : 4 229
    Points
    4 229
    Par défaut
    De rien et il y a encore plus simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                // on regroupe par id, on trie par occurence d'id et on sélectionne le premier id (donc celui ayant le moins d'occurence)
                int nb = maListe.GroupBy(l => l.id).OrderBy(l => l.Count()).Select(l => l.Key).First();

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 19/03/2006, 18h29
  2. Recherche un livre qui traiterait ce sujet
    Par xVINCEx dans le forum Contribuez
    Réponses: 16
    Dernier message: 21/02/2006, 08h25
  3. [ODBC] Recherche du champ qui est Primary Key
    Par XtofRoland dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 07/02/2006, 11h43
  4. Réponses: 4
    Dernier message: 17/10/2005, 14h23
  5. Réponses: 7
    Dernier message: 26/10/2004, 11h02

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