none
Contains sur List<UInt32[]>

    Question

  • Bonjour

    Je faisais jusque là une recherche sur un List<UInt32> ainsi

    List<UInt32> maList = new List<UInt32>() ;

    if (malist.Contains(U32toto) == false)  

    malist.Add(U32toto);


    maintenant j'ai besoin de faire la même recherche sur une List<UInt32[]> où la seconde position dnas le tableau est initialisé à 0 au moment de la recherche et pas moyen de réussir ce test !

    pour le moment je fais ça

    List<UInt32[]> maListTab = new List<UInt32[]>() ;

    if (maListTab .Contains(new UInt32[2] {U32toto, 0 }) == false)   

    maListTab .Add(new UInt32[2] {U32toto, 0 });


    Merci par avance pour votre aide


    • Modifié DavidIDE vendredi 26 août 2016 07:48
    vendredi 26 août 2016 07:47

Réponses

  • Bonjour,

    Dans la première list, vous ajoutez des UInt32 donc quand vous utilisez la méthode Contains, il voit que c'est une structure de type UInt32 et donc si 2 variables ont le même chiffre, il détecte l'égalité.

    En revanche, dans un 2ème cas, vous ajoutez des tableaux dans la liste, donc un Array, donc un objet de type référence. Le contains à ce moment va juste vérifier que les références sont les mêmes (donc si deux array, même s'il contiennent les mêmes données ont des références mémoires différentes).

    Je ne sais pas exactement ce que vous voulez faire, mais :

    1/ si vous avez bcp de comparaison suivant une clé, utilisez un Dictionary<TKey, UValue>.

    2/ Plutôt que d'utiliser des tableaux, utilisez des classes (avec une prop de type UInt32 + int) et regardez alors du côté des IComparer


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    • Marqué comme réponse DavidIDE vendredi 26 août 2016 10:05
    vendredi 26 août 2016 09:43

Toutes les réponses

  • Bonjour,

    Dans la première list, vous ajoutez des UInt32 donc quand vous utilisez la méthode Contains, il voit que c'est une structure de type UInt32 et donc si 2 variables ont le même chiffre, il détecte l'égalité.

    En revanche, dans un 2ème cas, vous ajoutez des tableaux dans la liste, donc un Array, donc un objet de type référence. Le contains à ce moment va juste vérifier que les références sont les mêmes (donc si deux array, même s'il contiennent les mêmes données ont des références mémoires différentes).

    Je ne sais pas exactement ce que vous voulez faire, mais :

    1/ si vous avez bcp de comparaison suivant une clé, utilisez un Dictionary<TKey, UValue>.

    2/ Plutôt que d'utiliser des tableaux, utilisez des classes (avec une prop de type UInt32 + int) et regardez alors du côté des IComparer


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    • Marqué comme réponse DavidIDE vendredi 26 août 2016 10:05
    vendredi 26 août 2016 09:43
  • Bonjour

    quand on a pigé le problème la solution devient bien plus évidente, merci

    Je vais faire une classe, je gagnerai en plus en lisibilité.

    Merci

    vendredi 26 août 2016 10:05
  • Bonjour

    Au delà de la classe qui m'a apporté plus de lisibilité j'ai découvert un moyen de faire avec Any et une fonction lambda

    List<LocalisationSousPeriode> LstMesSSperiodes = new List<LocalisationSousPeriode>(); //List de ma classe plutot que liste de tableaux
    
    	LocalisationSousPeriode SousPeriode = new LocalisationSousPeriode();
    	SousPeriode.SsPeriode = (UInt16)ValeursCheckedDuCapteur[y]["SsPeriode"];
    	SousPeriode.PositionDansFichier = 0;
    	if (LstMesSSperiodes.Any(v => v.SsPeriode == SousPeriode.SsPeriode) == false)
    	   LstMesSSperiodes.Add(SousPeriode);

    samedi 27 août 2016 08:24
  • if (!LstMesSSperiodes.Any(v => v.SsPeriode == SousPeriode.SsPeriode))

    C'est mieux ;-)


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    samedi 27 août 2016 20:30
  • Merci pour la suggestion que je me suis empressé de mettre en place.

    mais à re-regarder mon code, j'arrive à me demander si finalement avec le false tout beau tout bleu e ne serait pas plus visuel que ce petit ! coincé entre sa parenthèse et son L...

    samedi 27 août 2016 20:55