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 :

connaitre les elements de difference de deux tableaux


Sujet :

C#

  1. #1
    Membre habitué
    Inscrit en
    Août 2008
    Messages
    1 596
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 1 596
    Points : 175
    Points
    175
    Par défaut connaitre les elements de difference de deux tableaux
    Bonjour, je veux connaitre les elements de difference de deux tableaux

    Pour mon premier tableau :
    Int16 mois[] = new {1, ...,12}
    Mon deuxieme tableau je dois me remplir a travers un collection, mais je ne trouve pas la methode add pour ajouter un element a un tableau

    for (int i=0; i< oMesObjets.count; i++)
    ajouter Element a mon 2 eme tableau

    puis dans une 3eme etape, je dois connaitre les mois qui n'existe pas au niveau du 2eme tableau en faisant la difference entre les deux

  2. #2
    Membre éprouvé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2011
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2011
    Messages : 487
    Points : 945
    Points
    945
    Par défaut
    Bonjour,

    C'est simple, tu as juste à faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Enumerable.Except(array1, array2);
    Linq ça sauve des vies
    Mon blog sur les technos .NET et Agile -> http://blog.developpez.com/maximepalmisano/

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 282
    Points : 327
    Points
    327
    Par défaut
    Pour les tableaux, il n'existe pas de méthode Add comme sur les collections. Il te faut utiliser l'index pour associer un élément à ton tableau, comme par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    short[] myTab = new short[10];
    for (int i = 0; i < myTab.Length; i++)
    {
        myTab[i] = (short)(10 + i);
    }
    A ta place, je profiterais de la richesse du Framework .NET, et j'utiliserais Linq (System.Linq) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
                var array1 = new short[] {1, 2, 3, 4, 5, 6, 7};
                var array2 = new short[7];
     
                for (short i = 0; i < 7; i++)
                {
                    array2[i] = (short)(i + 5);
                }
     
                // Liste des short (=Int16) qui sont dans array1 mais pas dans array2
                foreach (short mois in array1.Except(array2))
                {
                    Console.WriteLine(mois);
                }
    Edit : j'aurais pas du boire mon café, je suis trop lent ^^

  4. #4
    Membre habitué
    Inscrit en
    Août 2008
    Messages
    1 596
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 1 596
    Points : 175
    Points
    175
    Par défaut
    Mais comment puis je svp remplir mon 2eme tableau a partir de ma collection.

    foreach(elem in elems)
    tab[?] = elem.id

  5. #5
    Membre éprouvé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2011
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2011
    Messages : 487
    Points : 945
    Points
    945
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    blabla[] tab2 = list.ToArray();
    Mon blog sur les technos .NET et Agile -> http://blog.developpez.com/maximepalmisano/

  6. #6
    Membre habitué
    Inscrit en
    Août 2008
    Messages
    1 596
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 1 596
    Points : 175
    Points
    175
    Par défaut
    C'est bon maintenant,sauf que Visual studio ne me donne pas le Except

    j'ai mis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IEnumerable<short> MoisNonDeclare = Mois.Except 
    Je ne trouve pas le system.Linq ??

  7. #7
    Membre éprouvé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2011
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2011
    Messages : 487
    Points : 945
    Points
    945
    Par défaut
    Quelle version du framework ? As tu bien using System.Linq; la dll référencée, etc ?

    Sinon si tu veux savoir les mois qui sont uniques dans les deux listes, il faut utiliser Enumerable.Except();
    Mon blog sur les technos .NET et Agile -> http://blog.developpez.com/maximepalmisano/

  8. #8
    Membre habitué
    Inscrit en
    Août 2008
    Messages
    1 596
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 1 596
    Points : 175
    Points
    175
    Par défaut
    mais pour utiliser le except je dois ajouter le system.linq que je ne trouve pas, que dois je faire pour l'avoir ?

    quand j'essai d'ajouter une reference je trouve le system.core desactivé ???

  9. #9
    Membre éprouvé Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Points : 1 108
    Points
    1 108
    Par défaut
    Tu vois, je t'avais dit MaximePalmisano que LinQ n'était pas toujours la bonne sollution.

    Que faire quand on est dans une version trop ancienne du framework ? Réponse faire le code qui se trouve derrière LinQ. Accessoirement le connaître ne fait pas de mal et permet de comprendre ce qu'il se passe en vrai. On n'ira pas jusqu'à pousser à l'IL (quoique).

    Quel est le besoin exact ? Connaitre les éléments de a qui ne sont pas dans b (ou réciprequement) ? Comparer case à case les tableaux a et b ? L'implémentation de code à l'ancienne peut varier selon le besoin.
    Ensuite, tu as effectivement les shortcut de LinQ qui te font le travail à ta place si tu as une version du FW qui va bien.

    Humour : Avec .Net et Linq, l'avenir du développeur c'est le pôle emploi A force que le travail soit fait à la place du développeur L'autre avenir possible, c'est l'Orang Outan : moins besoin de réfléchir (ça existe déjà : le Ook Ook !)
    En informatique, le problème se situe toujours entre le clavier et l'écran !
    Il y a deux chemins entre le clavier et l'écran : Par l'UC et par l'utilisateur.

  10. #10
    Membre éprouvé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2011
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2011
    Messages : 487
    Points : 945
    Points
    945
    Par défaut
    J'suis d'accord avec toi, c'est triste que les gens sachent plus faire ce genre d'algo ... Seulement LinQ a un bon point :

    Quand on fait un algo compliqué, y'a toujours des relous qui comprennent rien ("omg y'a des lignes de code §!!§") et qui viennent te tenir la jambe pendant 1 plombe pour que tu leur mache la compréhension de l'algo, même s'il est super clair et tout.

    Au moins avec Linq, le mec fait un F1 et te fout la paix
    Mon blog sur les technos .NET et Agile -> http://blog.developpez.com/maximepalmisano/

  11. #11
    Membre éprouvé Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Points : 1 108
    Points
    1 108
    Par défaut
    @ Maxime : c'est quoi cette touche ?

    Pour revenir à notre question : regarde ici

    Le using c'est System.Linq qui se trouve dans la dll System.Core.
    En informatique, le problème se situe toujours entre le clavier et l'écran !
    Il y a deux chemins entre le clavier et l'écran : Par l'UC et par l'utilisateur.

  12. #12
    Membre habitué
    Inscrit en
    Août 2008
    Messages
    1 596
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 1 596
    Points : 175
    Points
    175
    Par défaut
    voila ce que j'ai mis, j'espere que ca donne le meme resultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      for (int k = 0; k < Mois.Length; k++)
                    for (int i = 0; i < Mois.Length; i++){
                        for (int j = 0; j < MoisDeclare.Length; j++){
                            if (Mois[i] == MoisDeclare[j]) i++;
                            else j++
                        }
                    MoisNonDeclare[k] = Mois[i];
     
                    }

    Mois c'est de 1 à 12
    MoisDeclare c'est les mois declarés par le client
    Mois non déclaré c'est la difference entre les deux

  13. #13
    Membre éprouvé Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Points : 1 108
    Points
    1 108
    Par défaut
    Je ne comprends pas pourquoi tu as deux boucles (k) et (i). Tu itères 2 fois sur le même tableau. A part plomber les perfs, je n'en vois pas l'intérêt.

    Pour moi, c'est un algo mal compris (ou je en le comprends vraiment pas).
    Pose toi des questions simples pour faire un algo simple.
    En informatique, le problème se situe toujours entre le clavier et l'écran !
    Il y a deux chemins entre le clavier et l'écran : Par l'UC et par l'utilisateur.

  14. #14
    Membre habitué
    Inscrit en
    Août 2008
    Messages
    1 596
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 1 596
    Points : 175
    Points
    175
    Par défaut
    le k c'est pour le remplissage du tableau difference
    le i c'est pour le parcourt du tableau mois
    le j pour le parcourt du tableau mois declaré

  15. #15
    Membre éprouvé Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Points : 1 108
    Points
    1 108
    Par défaut
    J'ai le sentiment que ce n'est pas la meilleure façon de faire, du moins pas la plus "lazy". Malheureusement, je n'ai pas le temps de chercher comment faire mieux.
    Cette triple boucle me parait un peu lourde.
    En informatique, le problème se situe toujours entre le clavier et l'écran !
    Il y a deux chemins entre le clavier et l'écran : Par l'UC et par l'utilisateur.

  16. #16
    Membre habitué
    Inscrit en
    Août 2008
    Messages
    1 596
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 1 596
    Points : 175
    Points
    175
    Par défaut
    SVp y a pas un autre moyen pour la deduction de mon tableau

  17. #17
    Membre éprouvé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2011
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2011
    Messages : 487
    Points : 945
    Points
    945
    Par défaut
    Je t'ai posé des questions sur ton framework, tant que tu n'y réponds pas je ne peux pas t'aider plus ... (Et te pondre l'algo encore moins)
    Mon blog sur les technos .NET et Agile -> http://blog.developpez.com/maximepalmisano/

  18. #18
    Membre habitué
    Inscrit en
    Août 2008
    Messages
    1 596
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 1 596
    Points : 175
    Points
    175
    Par défaut
    j'ai Visual studio 2008
    framwork : je viens d'installer la version 4 mais ca marche toujours pas

  19. #19
    Membre expérimenté Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Morbihan (Bretagne)

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Points : 1 732
    Points
    1 732
    Par défaut
    Salut,
    Déjà tu aurais moins de problème si tu utilisais des listes ou des collections plutôt que des tableaux.
    Ensuite, l'implémentation à l'ancienne n'a rien de compliqué :
    Code : 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
    List<int> MoisNonDeclares = new List<int>();
    foreach(int m in Mois) // Parcours des mois
    {
        bool found = false;
        foreach(int md in MoisDeclare) // Parcours des mois déclarés
        {
            if(m == md)
            {
                found = true; // Ce mois est déclaré
                break; // Utile uniquement pour gagner en perf, sur un tableau de mois tu gagneras rien
            }
        }
        if(!found) MoisNonDeclares.Add(m); // Mois non trouvé parmis ceux déclarés
    }
     
    int[] MoisNonDeclareSousFormeDeTableauPuisqueTuSemblePreferer = MoisNonDeclares.ToArray();
    Tu peux remplacer tous les int par le type réel des éléments de tes tableaux si ce ne sont pas des int.

  20. #20
    Membre éprouvé Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Points : 1 108
    Points
    1 108
    Par défaut
    Un +1, ce code me plait et ressemble à ce que j'aurais fait avec le temps (et visual studio)
    En informatique, le problème se situe toujours entre le clavier et l'écran !
    Il y a deux chemins entre le clavier et l'écran : Par l'UC et par l'utilisateur.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Tableaux] Connaitre les doublons d'un tableau
    Par yobogs dans le forum Langage
    Réponses: 3
    Dernier message: 12/09/2007, 11h38
  2. [Tableaux] Comment enlever les elements vide d'un array
    Par BernardT dans le forum Langage
    Réponses: 9
    Dernier message: 07/07/2006, 12h12
  3. [Tableaux] regrouper les elements d'un tableau
    Par ericmart dans le forum Langage
    Réponses: 3
    Dernier message: 23/06/2006, 09h35
  4. Permuttez les éléments de deux zones de liste
    Par flo64 dans le forum Access
    Réponses: 4
    Dernier message: 01/06/2006, 09h15
  5. Connaitre les deux premier chiffres d'un input
    Par PrinceMaster77 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 03/01/2005, 16h50

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