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 } } }
4 Réponses :
parce que "a"! = "A" code>. Au moins, pas toujours. P>
contient () code> 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" code> n'est pas le même objet que
"A" code> (au moins, pas ici). P>
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.
Vous devez informer sur le comparateur: p>
in EqualitComParrer.Default Property Vous pouvez voir un exemple. < / p>
Parce que vous avez ajouté cette valeur définie sur CX:
cY.Add(new Bind { x = "a", y = "1" });
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; } }