8
votes

Observablecollection.Contains () ne fonctionne pas correctement

Considérez les points suivants:

class Bind
{
    public string x { get; set; }
    public string y { get; set; }
}
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        ObservableCollection<Bind> cX = new ObservableCollection<Bind>();
        ObservableCollection<Bind> cY = new ObservableCollection<Bind>();
        cX.Add(new Bind { x = "a", y = "1" });
        cX.Add(new Bind { x = "b", y = "2" });
        cY.Add(new Bind { x = "a", y = "1" });
        foreach (var i in cX)
        {
            if (!cY.Contains(i)) { lv.Items.Add(i); } //lv is a ListView control
        }
    }
}


0 commentaires

4 Réponses :


2
votes

parce que "a"! = "A" . Au moins, pas toujours.

contient () vérifiera les adresses de mémoire, pas le contenu réel. Vous ne pouvez pas insérer le même objet deux fois, et "A" n'est pas le même objet que "A" (au moins, pas ici).


1 commentaires

Je voudrais probablement itération à travers toutes les valeurs et vérifier si elles sont égales. Mais je ne suis pas un programmeur C #, il pourrait donc y avoir un moyen plus facile.




3
votes

Parce que vous avez ajouté cette valeur définie sur CX:

cY.Add(new Bind { x = "a", y = "1" });


0 commentaires

20
votes

La méthode 'contient' utilise les égaux sur l'objet, ce qui vérifie simplement que les adresses de mémoire sont différentes.

envisagez de changer votre classe sur cette ... p>

 class Bind : IEquatable<Bind> {
     public string x { get; set; }
     public string y { get; set; }
     public bool Equals(Bind other)
     {
         return x == other.x && y == other.y; 
     } 
}


0 commentaires