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 :

Distinct Elements dans List<T>


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    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
    Par défaut Distinct Elements dans List<T>
    Bonjour

    J'ai une List<T> contenant des elements de type Machin

    Cette liste est chargée triée par nom

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class Machin
    {
      int  Id;
      string nom;
    }
    Un Id peut avoir plusieurs noms, donc plusieurs element dans la liste

    Je voudrais compter le nombre d'ID distinct
    Une methode est evidemment de trier par id et de parcourir la liste

    Question 1
    Si je ne veux pas casser la sequence originale, je dois travailler sur une copie de la liste, comment faire une copie de List<T> a part dans une boucle : je n'ai pas vu de methode clone ou copy ?
    Je sais on va me dire tu n'a qu'a retrier par nom apres : ca ne peut pas convenir car je ne dispose plus de la clef ayant produit le tri original !

    Question 2
    J'ai vu une methode distinct dans la la List<T> mais aucun exemple pratique peut elle servir dans ce cas ?

  2. #2
    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
    Par défaut
    Tu peux utiliser LINQ to Objects pour faire ça, c'est tout simple (si tu es en .NET 3.5)
    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

  3. #3
    Expert confirmé

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2004
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 3 029
    Par défaut
    dans la serie brutasse:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    List<int> ids = new List<int>();
    foreach (Machin tmp in maListeOuJeVeuxCompterLesIds){
       if (!ids.Contains(tmp.Id)){
          ids.Add(tmp.Id);
        }
    }
    et dans id.Count, tu as ton nombre d'ids


    mais y'a surement plus propre

    Mon Blog

    The Cake is still a lie !!!



    Vous voulez contribuer à la rubrique .NET ? Contactez-moi par MP.
    Vous voulez rédiger des articles pour la rubrique .NET ? Voici la procédure à suivre.

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Avec .Net 3.5, un HashSet auquel tu files une fonction d'égalité qui va bien ferait l'affaire.

    En C#2, je simule les Set avec des dico dont j'ignore les valeurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dictionary<int, int> dico = new Dictionary<int, int>(); // un Dico<int, Choucroute> serait identique
    foreach(Machin m in listeMachins)
      dico[m.Id] = 0;
    Là, t'as le compte avec dico.Count et les ids avec dico.Keys (non trié ceci dit, pour que ce soit trié il aurait fallu un SortedDictionary).

    J'ai bouleversifié les perfs d'un projet dont j'ai hérité en remplaçant les codes style if (!contains) then add en utilisant des dicos. Une insertion et un accès en O(1), ça se sent.
    Les dicos, c'est bien.

  5. #5
    Membre expérimenté
    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
    Par défaut
    Merci Merci

    3 reponses .... 3 solutions

    La solution de pvialatte ca effectivement j'evite comme la peste !
    La solution de SaumonAgile : oui je suis en 3.5, mais j'ai jamais utilisé Linq et ta reponse ne me permet pas vraiment de voir si ce serait simple ou pas
    La solution de Guulh : me semble séduisante, je n'ai jamais utilisé de dictionnaire non plus et je ne sais pas vraiment ou cet abnimal s'inscrit entre les listes, les collections, les array etc..

    De mon expérience en C, je faisait toutes ces choses avec des tableaux de structures ou des tableaux de pointeurs, les pointeurs et les structure, c'etait mon quotidien favori

    Je vais essayer de voir ce que c'est qu'un dictionnaire

    Reste toujours deux interrogation

    1- Peut on faire facilement une copie de liste
    2- Que permet en pratique la methode distinct dans une Liste ?

  6. #6
    Membre expérimenté
    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
    Par défaut
    Oups j'avais pas bien vu

    4 Solutions !!
    2 pour Guulh : je n'avais pas vu la suggestion du Hashset

    J'ai jamais essayé non plus mais ca me semble moins pertinent car tant qu'a faire c'est bien aussi de recuperer d'une maniere ou d'une autre la liste unique des Id triée !

Discussions similaires

  1. [langage] Supprimer un élément dans une liste
    Par myjuna dans le forum Langage
    Réponses: 15
    Dernier message: 06/08/2014, 11h49
  2. Random element dans liste sharepoint
    Par spantemonium dans le forum SharePoint
    Réponses: 0
    Dernier message: 10/06/2008, 11h14
  3. Pb d'ajout d'element dans un liste
    Par profx dans le forum Général JavaScript
    Réponses: 17
    Dernier message: 27/02/2007, 17h49
  4. occurences d'un element dans une liste (algorithme)
    Par kespy13 dans le forum Algorithmes et structures de données
    Réponses: 25
    Dernier message: 16/02/2006, 00h18
  5. Recherche Element dans une liste
    Par hellodelu dans le forum ASP
    Réponses: 7
    Dernier message: 19/08/2005, 10h56

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