gpt4 book ai didi

c# - HashSet.CreateSetComparer() 无法指定 IEqualityComparer,是否有替代方案?

转载 作者:行者123 更新时间:2023-11-30 14:46:31 24 4
gpt4 key购买 nike

internal source有这样一个构造函数 public HashSetEqualityComparer(IEqualityComparer<T> comparer)但它是内部的,所以我不能使用它。

默认情况下,HashSet<T>.CreateSetComparer()只使用将应用 EqualityComparer<T>.Default 的无参数构造函数.

有没有办法得到 HashSetEqualityComparer<T>IEqualityComparer<T>选择,无需从源代码中复制代码?

最佳答案

我认为最好的解决方案是使用 SetEquals .它以与 HashSetEqualityComparer 完全相同的方式完成您需要的工作。会,但它说明在其比较集中定义的任何自定义比较器。

因此,在您想要使用 HashSet<T> 的特定场景中作为字典的键,你需要实现一个 IEqualityComparer<HashSet<T>>利用 SetEquals并“借用”了HashSetEqualityComparer.GetHashCode()的引用来源:

public class CustomHashSetEqualityComparer<T>
: IEqualityComparer<HashSet<T>>
{
public bool Equals(HashSet<T> x, HashSet<T> y)
{
if (ReferenceEquals(x, null))
return false;

return x.SetEquals(y);
}

public int GetHashCode(HashSet<T> set)
{
int hashCode = 0;

if (set != null)
{
foreach (T t in set)
{
hashCode = hashCode ^
(set.Comparer.GetHashCode(t) & 0x7FFFFFFF);
}
}

return hashCode;
}
}

但是,是的,没有办法直接创建 SetEqualityComparer 是一个小小的痛苦。它利用自定义比较器,但恕我直言,这种不幸的行为更多是由于现有实现的错误,而不是缺少所需的重载;没有理由 CreateSetComparer()无法返回 IEqualityComparer正如上面的代码所演示的那样,它实际上使用了集合的比较器。

如果我有发言权,CreateSetComparer()根本不是静态方法。然后很明显,或者至少可以预测,返回的任何比较器都将使用当前集合的比较器创建。

关于c# - HashSet<T>.CreateSetComparer() 无法指定 IEqualityComparer<T>,是否有替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48842499/

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