如何测试_set.Contains(obj),当_set是HashSet<;T1>;,obj-isT2和T1、T
本文关键字:set T1 lt gt obj-isT2 测试 何测试 Contains obj HashSet | 更新日期: 2023-09-27 17:57:33
我必须实现一个能够快速(O(1)
)测试对象存在性的ObservableHashSet<T>
:
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
在DeviceClass
s(HashSet<DeviceClass>
)列表中是否存在的方法。那么,我如何更改上面的ObservableHashSet<T>.QuickContains(T obj)
函数以允许它呢?所以我可以做这样的事情:
var classesList = new ObservableHashSet<DeviceClass>(someDataSource);
ActualDevice actualDevice = GetTheDevice();
MessageBox.Show(classesList.QuickContains(actualDevice) ? "Exists!" : "Missing...");
我会让HashSet<T>
的项类型成为一个只包含等式测试所基于的数据的类。目前,你正试图让DeviceClass
与ActualDevice
进行比较,这似乎很奇怪。
我的理解是,您想要测试一个ActualDevice
是否与许多DeviceClass
之一相关联。你可以这样做:
class DeviceClassKey : IEquatable<DeviceClassKey> {
//Data members here
int DeviceClassID; /* just an example */
public static DeviceClassKey FromDeviceClass(DeviceClass dc) { return ...; }
public static DeviceClassKey FromActualDevice(ActualDevice ad) { return ...; }
//add equality members here
}
现在,您将成员添加到集合中,如下所示:
HashSet<DeviceClassKey> items = ...;
DeviceClass dc = ...;
items.Add(DeviceClassKey.FromDeviceClass(dc));
你这样测试会员资格:
HashSet<DeviceClassKey> items = ...;
ActualDevice ad = ...;
var isMember = items.Contains(DeviceClassKey.ActualDevice(ad));
我可能错过了你的一些要求,但这项技术可能可以扩展到涵盖它。