Оператор == всегда предназначен для сравнения ссылок на объекты, тогда как метод сравнения строк .equals () переопределяется для сравнения содержимого:
String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1 == s2); // It prints false (reference comparison)
System.out.println(s1.equals(s2)); // It prints true (content comparison)
Когда вы создаете новую коллекцию ObservableCollection с другой коллекцией, вы не обертываете эту коллекцию, вы создаете новую, в которой все элементы переданной коллекции копируются в ObservableCollection. Если вы хотите использовать ObservableCollection для единственной цели DataBinding, не смотрите дальше, вы можете привязаться к любому IEnumerable в WPF. Это, к сожалению, имеет недостаток, заключающийся в том, что WPF не всегда правильно принимает изменения в связанной коллекции. Если это проблема, вам, вероятно, придется создать свой собственный наблюдаемый хэш-набор:
public class ObservableHashSet<T> : ObservableCollection<T>
{
protected override void InsertItem(int index, T item)
{
if (Contains(item))
{
throw new ItemExistsException(item);
}
base.InsertItem(index, item);
}
protected override void SetItem(int index, T item)
{
int i = IndexOf(item);
if (i >= 0 && i != index)
{
throw new ItemExistsException(item);
}
base.SetItem(index, item);
}
}
РЕДАКТИРОВАТЬ: Как уже было указано, вы не можете наследовать от HashSet для реализации INotifyCollectionChanged. Однако если вы посмотрите на код (с использованием Reflector) для класса HashSet, он довольно прост, и вам будет слишком сложно имитировать эту функциональность самостоятельно.
Как сказал bitbonk, ObservableCollection не оборачивает Hashset, а вместо этого копирует его элементы.
Если вы хотите получить Observable Hashset, проверьте Как я могу сделать Observable Hashset на C # ?