我有一个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()两者。
谢谢。
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>.
| 归档时间: |
|
| 查看次数: |
99 次 |
| 最近记录: |