c# - HashSet<T> 性能(与 ObservableCollection<T> 相比)?

标签 c# performance observablecollection hashset

我目前正在从事一个项目,我必须管理大量独特的元素。每个元素都有大约 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 .最后一个集合类型通常较慢,因为在每次集合更改(添加、删除、清除、插入等)时 PropertyChangedCollectionChanged事件被触发。

关于c# - HashSet<T> 性能(与 ObservableCollection<T> 相比)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10639012/

相关文章:

c# - 如何从 Windows 应用程序调用 SQL Server 代理中的作业

c# - 将键/值添加到现有 URL 字符串的最佳方法?

performance - Cloudflare 和 Incapsula 等服务是否真的可以提高 Windows Azure 上托管的网站的性能?

c# - ArrayList C# 包含方法查询

c# - 替代 ObservableCollection?

wpf - Observable Collection 不更新 UI

c# - Azure Linux ASP 上运行的 .net core 与 Azure SQL 数据库之间的连接池问题

c# - .NET Framework 如何分配线程 ID?

mysql查询以有效地删除重复项