我目前正在从事一个项目,我必须管理大量独特的元素。每个元素都有大约 20 个属性,每个元素都有一个公共(public)属性 DateTime。
属性 DateTime 不是唯一的,所以我不能使用通用字典来存储我的数据。
目前我将这些元素放入一个 ObservableCollection 中,但是从集合中删除元素的速度非常慢,我最终等待了大约 20 秒才能从大约 25.000 个元素的集合中删除大约 7000 个元素。
(搜索操作似乎非常有效,从 300.000 个元素的未排序集合中找到 80 个随机选择的元素只需要大约 30 毫秒)。
每个元素通过简单地返回 DateTime.GetHashCode() 来实现 GetHashCode() 方法。
我认为使用 HashSet 而不是 ObservableCollection 会大大提高我的性能,但它似乎根本没有效果......
使用通用字典更糟糕...
如果元素具有“良好”的哈希函数(很少有元素具有相同的哈希码),HashSet 是不是比 ObservableCollection 更强大?
最佳答案
您必须覆盖 Equals对象的方法。
因为 HashSet使用内部 IEqualityComparer通常首先检查 (null) 然后使用覆盖的 Equals 方法将“非 null”项与另一个项进行比较的实例:
class MyObject
{
public Guid Id { get; set; }
public override bool Equals(object other)
{
if (other is MyObject)
{
// use the 'Id' property as identifier
MyObject myObj = (MyObject)obj;
return myObj.Id == this.Id;
}
// is not a 'MyObject' based object
return base.Equals(other);
}
}
您还可以使用字符串或与您的对象相当的任何其他类型的对象。
编辑:
因此您可以使用 HashSet 而不是 OberservableCollection .最后一个集合类型通常较慢,因为在每次集合更改(添加、删除、清除、插入等)时 PropertyChanged和 CollectionChanged事件被触发。
关于c# - HashSet<T> 性能(与 ObservableCollection<T> 相比)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10639012/