【发布时间】:2014-04-08 19:02:01
【问题描述】:
我必须实现一个ObservableHashSet<T>,它可以快速(O(1))测试对象是否存在:
public class ObservableHashSet<T> : ObservableCollection<T>{
readonly ISet<T> _set = new HashSet<T>();
protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e){
base.OnCollectionChanged(e);
if (e.Action == NotifyCollectionChangedAction.Move) return;
if (e.OldItems != null)
foreach (var old in e.OldItems.Cast<T>())
_set.Remove(old.GetHashable());
if (e.NewItems == null) return;
foreach (var nu in e.NewItems.Cast<T>()) _set.Add(nu.GetHashable());
}
public bool QuickContains(T obj){ return _set.Contains(obj); }
}
现在说我们有两种类型,都实现相同的接口:
IDevice
├── ActualDevice
└── DeviceClass
界面是:
public interface IDevice {
string Vendor { get; set; }
string Name { get; set; }
}
我需要一种方法来快速 (O(1)) 测试 ActualDevice 是否存在于 DeviceClasss (HashSet<DeviceClass>) 的列表中。那么如何更改上面的ObservableHashSet<T>.QuickContains(T obj) 函数以允许它呢?所以我可以做这样的事情:
var classesList = new ObservableHashSet<DeviceClass>(someDataSource);
ActualDevice actualDevice = GetTheDevice();
MessageBox.Show(classesList.QuickContains(actualDevice) ? "Exists!" : "Missing...");
【问题讨论】:
-
如果
ActualDevice等于DeviceClass,这听起来很奇怪... -
public class ObservableHashSet<T> : ObservableCollection<T>已经错了。哈希集不是IList。 -
@Jon,当然不是,但我需要一个可以快速测试的可观察集合(
O(1)),即HashSet。你会如何解决它? -
为什么需要测试为
O(1)?您的收藏中有多少件物品? -
@Tal:可能是通过聚合一个
HashSet并在其上直接实现ISet<T>和INotifyCollectionChanged。
标签: c# polymorphism c#-5.0