如何测试_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))测试某个ActualDeviceDeviceClasss(HashSet<DeviceClass>)列表中是否存在的方法。那么,我如何更改上面的ObservableHashSet<T>.QuickContains(T obj)函数以允许它呢?所以我可以做这样的事情:

var classesList = new ObservableHashSet<DeviceClass>(someDataSource);
ActualDevice actualDevice = GetTheDevice();
MessageBox.Show(classesList.QuickContains(actualDevice) ? "Exists!" : "Missing...");

如何测试_set.Contains(obj),当_set是HashSet<;T1>;,obj-isT2和T1、T

我会让HashSet<T>的项类型成为一个只包含等式测试所基于的数据的类。目前,你正试图让DeviceClassActualDevice进行比较,这似乎很奇怪。

我的理解是,您想要测试一个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));

我可能错过了你的一些要求,但这项技术可能可以扩展到涵盖它。