gpt4 book ai didi

c# - HashSet.Remove 不适用于 EqualityComparer

转载 作者:太空狗 更新时间:2023-10-29 23:48:31 26 4
gpt4 key购买 nike

我希望使用指定的 EqualityComparer 创建的 HashSet 在 Remove 操作中使用该比较器。特别是因为 Contains 操作返回 true!

这是我使用的代码:

public virtual IEnumerable<Allocation> Allocations { get { return _allocations; } }
private ICollection<Allocation> _allocations;

public Activity(IActivitySubject subject) { // constructor
....
_allocations = new HashSet<Allocation>(new DurationExcludedEqualityComparer());
}

public virtual void ClockIn(Allocation a)
{
...
if (_allocations.Contains(a))
_allocations.Remove(a);
_allocations.Add(a);
}

下面是一些快速而肮脏的 LINQ,它让我得到了我想要的逻辑,但我猜测基于 EqualityComparer 的 HashSet 删除会快得多。

public virtual void ClockIn(Allocation a)
{
...
var found = _allocations.Where(x => x.StartTime.Equals(a.StartTime) && x.Resource.Equals(a.Resource)).FirstOrDefault();
if (found != null)
{
if (!Equals(found.Duration, a.Duration))
{
found.UpdateDurationTo(a.Duration);
}
}
else
{
_allocations.Add(a);
}

谁能提出为什么当 Contains 成功时 Remove 会失败?

干杯,
贝瑞尔

=== 编辑 === 比较器

public class DurationExcludedEqualityComparer : EqualityComparer<Allocation>
{
public override bool Equals(Allocation lhs, Allocation rhs)
{
if (ReferenceEquals(null, rhs)) return false;
if (ReferenceEquals(lhs, null)) return false;
if (ReferenceEquals(lhs, rhs)) return true;

return
lhs.StartTime.Equals(rhs.StartTime) &&
lhs.Resource.Equals(rhs.Resource) &&
lhs.Activity.Equals(rhs.Activity);
}

public override int GetHashCode(Allocation obj) {
if (ReferenceEquals(obj, null)) return 0;
unchecked
{
var result = 17;
result = (result * 397) ^ obj.StartTime.GetHashCode();
result = (result * 397) ^ (obj.Resource != null ? obj.Resource.GetHashCode() : 0);
result = (result * 397) ^ (obj.Activity != null ? obj.Activity.GetHashCode() : 0);
return result;
}
}
}

=== 更新 - 已修复 ===

好吧,好消息是 HashSet 没有损坏并且可以正常工作。对我来说,坏消息是当我在检查树上的叶子时看不到森林时,我会变得多么愚蠢!

答案实际上在上面发布的代码中,如果您查看创建和拥有 HashSet 的类,然后再查看 Comparer 以找出它有什么问题。第一个发现它的人很容易得分。

感谢所有查看代码的人!

最佳答案

好吧,您的“有效”代码看起来是在查看 StartTimeResource同时忽略 Activity ,而你的 IEqualityComparer<Allocation>实现着眼于所有这三个方面。您的问题可能与此有关吗?

还有:你的StartTime是吗? , Resource , 和 Activity属性不变?否则,因为它们会影响您的 GetHashCode结果,我认为你冒着破坏 HashSet<Allocation> 的风险.

关于c# - HashSet.Remove 不适用于 EqualityComparer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3622409/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com