当我使用哈希集时,这是 O(1) 吗?

Álv*_*cía -1 c#

我有一个HashSet类型:

public Class Person
{
    int? _requestedHashCode;
    long Id;
    Name string;
    DateTime BirthDate;
    // Other properties


    public bool IsTransient()
    {
        return this.Id == default(long);
    }


    public override int GetHashCode()
    {
        if (!IsTransient())
        {
            if (!_requestedHashCode.HasValue)
                _requestedHashCode = this.Id.GetHashCode() ^ 31;

            return _requestedHashCode.Value;
        }
        else
            return base.GetHashCode();
    }


    public override bool Equals(object obj)
    {
        if (obj == null || !(obj is Person))
            return false;

        if (Object.ReferenceEquals(this, obj))
            return true;

        if (this.GetType() != obj.GetType())
            return false;

        Entity item = (Entity)obj;

        if (item.IsTransient() || this.IsTransient())
            return false;
        else
            return item.Id == this.Id;
    }
}
Run Code Online (Sandbox Code Playgroud)

我有一个方法,接收该人的 ID 作为参数,并且我希望以 O(1) 性能获取该人:

public Person GetPerson(long paramIdPersonToDelete)
{
    return _myHashset.FirstOrDefault(x => x.Id == paramIdPersonToDelete);
}
Run Code Online (Sandbox Code Playgroud)

我的实现正确吗?我不确定我需要修改什么;需要 的比较HashSet,如果HashSet使用GetHashCode()Equals()两者。

谢谢。

Tim*_*ter 5

First或是需要枚举序列来查找项目的FirstOrDefaultLINQ 方法(因此未针对 进行优化)。HashSet<T>这意味着它们具有O(n)复杂性。

如果您愿意,O(1)可以使用这种方法:

public Person GetPerson(long paramIdPersonToDelete)
{
    return _myHashset.TryGetValue(new Person{ Id = paramIdPersonToDelete }, out Person actualPerson)
        ? actualPerson
        : null;
}
Run Code Online (Sandbox Code Playgroud)

当然,您需要公开Id或者更好地提供一个构造函数并创建它readonly

在这种情况下,最好使用Dictionary<long, Person>.