locked
Supprimer doublon List<> RRS feed

  • Question

  • Bonjour !

    Je cherche à supprimer les doublons d'une List d'objets :

    public class Segment
        {
            public string Lettres { get; set; }
            public string Valeur { get; set; }
        } 

    Le bonheur aurait été d'avoir  ça : = lstSegment.Distinct(); mais y'a pas dans le framework de windows phone...

    Je pense que j'ai pas à réinventer la roue... et je me demande si quelqu'un n'a pas une bonne astuce ?

    merci ! Christophe


    Toss.net

    mercredi 8 août 2012 07:47

Réponses

  • Salut Tossnet :)

    En fait, ton Distinct ne fonctionne pas puisque tu es sur une classe custom qui ne satisfait pas les conditions d'utilisation de cette méthode : elle doit implémenter l'interface IEquatable<T>.
    Si tu as la main sur la classe, c'est tout bon, sinon tu dois passer par un Equality Comparer (IEqualityComparer).

    Un bon article sur ça => http://blogs.msdn.com/b/csharpfaq/archive/2009/03/25/how-to-use-linq-methods-to-compare-objects-of-custom-types.aspx

    Attention cependant je ne suis pas sûr que l'implémentation de IEquatable soit compatible avec la sérialisation (si tes classes sont fournies par un service WCF par exemple), et pour ce cas de figure je n'ai pas de réponse !


    Blog => http://ashworks.fr | Twitter => http://twitter.com/ashura95

    mercredi 8 août 2012 09:14

Toutes les réponses

  • J'ai essayé une autre approche ; c'est à dire n'ajouter la valeur dans ma list que si elle n'existe pas grace à Contains :

    double a = ....
    if (lstSegment.Contains(new Segment() { Lettres = "a", Valeur = a.ToString() }) == false)
    {
              lstSegment.Add(new Segment() { Lettres = "a", Valeur = a.ToString() });
    }
    Seulement, la condition est toujours à False !


    Toss.net


    mercredi 8 août 2012 08:33
  • Hello Toss!

    On peut très bien utiliser Linq dans les projets WP7.
    Ajoute le using "System.Linq".
    Ensuite:

    List<Segment> l = new List<Segment>
                                      {
                                          new Segment {Lettres = "A", Valeur = "1"},
                                          new Segment {Lettres = "B", Valeur = "1"},
                                          new Segment {Lettres = "A", Valeur = "1"}
                                      };
    l = l.Distinct().ToList();

    Marchera sans problème!

    mercredi 8 août 2012 08:33
  • Rhooo oui merci , j'ai pas pensé à l'ajout de using System.Linq; j'ai la tête ailleurs ! 

    Cependant l = l.Distinct().ToList(); change rien ! C'est très étrange l reste avec les 3 valeurs


    Toss.net

    mercredi 8 août 2012 08:48
  • Salut Tossnet :)

    En fait, ton Distinct ne fonctionne pas puisque tu es sur une classe custom qui ne satisfait pas les conditions d'utilisation de cette méthode : elle doit implémenter l'interface IEquatable<T>.
    Si tu as la main sur la classe, c'est tout bon, sinon tu dois passer par un Equality Comparer (IEqualityComparer).

    Un bon article sur ça => http://blogs.msdn.com/b/csharpfaq/archive/2009/03/25/how-to-use-linq-methods-to-compare-objects-of-custom-types.aspx

    Attention cependant je ne suis pas sûr que l'implémentation de IEquatable soit compatible avec la sérialisation (si tes classes sont fournies par un service WCF par exemple), et pour ce cas de figure je n'ai pas de réponse !


    Blog => http://ashworks.fr | Twitter => http://twitter.com/ashura95

    mercredi 8 août 2012 09:14
  • Super Merci Alexis ! Exactement ce qu'il me fallait !


    Toss.net

    mercredi 8 août 2012 09:45