gpt4 book ai didi

C# Distinct on IEnumerable 与自定义 IEqualityComparer

转载 作者:IT王子 更新时间:2023-10-29 03:48:58 26 4
gpt4 key购买 nike

这就是我想要做的。我正在使用 LINQ to XML 查询一个 XML 文件,这给了我一个 IEnumerable <T > 对象,其中 T 是我的“Village”类,填充了此查询的结果。有些结果是重复的,所以我想对 IEnumerable 对象执行 Distinct(),如下所示:

public IEnumerable<Village> GetAllAlliances()
{
try
{
IEnumerable<Village> alliances =
from alliance in xmlDoc.Elements("Village")
where alliance.Element("AllianceName").Value != String.Empty
orderby alliance.Element("AllianceName").Value
select new Village
{
AllianceName = alliance.Element("AllianceName").Value
};

// TODO: make it work...
return alliances.Distinct(new AllianceComparer());
}
catch (Exception ex)
{
throw new Exception("GetAllAlliances", ex);
}
}

由于默认比较器不适用于 Village 对象,我实现了一个自定义比较器,如 AllianceComparer 类中所示:

public class AllianceComparer : IEqualityComparer<Village>
{
#region IEqualityComparer<Village> Members
bool IEqualityComparer<Village>.Equals(Village x, Village y)
{
// Check whether the compared objects reference the same data.
if (Object.ReferenceEquals(x, y))
return true;

// Check whether any of the compared objects is null.
if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
return false;

return x.AllianceName == y.AllianceName;
}

int IEqualityComparer<Village>.GetHashCode(Village obj)
{
return obj.GetHashCode();
}
#endregion
}

Distinct() 方法不起作用,因为使用或不使用它得到的结果数量完全相同。另一件事,我不知道这通常是否可行,但我无法进入 AllianceComparer.Equals() 以查看可能是什么问题。
我已经在 Internet 上找到了这方面的示例,但我似乎无法实现我的实现。

希望这里有人能看到这里可能出了什么问题!提前致谢!

最佳答案

问题出在您的 GetHashCode 上。您应该更改它以返回 AllianceName 的哈希码。

int IEqualityComparer<Village>.GetHashCode(Village obj)
{
return obj.AllianceName.GetHashCode();
}

问题是,如果 Equals 返回 true,则对象应该具有相同的哈希码,而不同的 Village 对象则不同使用相同的 AllianceName。由于 Distinct 通过在内部构建哈希表来工作,因此您最终会得到相同的对象,但由于不同的哈希码,这些对象根本不会匹配。

同样,比较两个文件,如果两个文件的哈希值不一样,根本不需要检查文件本身。它们不同。否则,您将继续检查它们是否真的相同。这正是 Distinct 使用的哈希表的行为。

关于C# Distinct on IEnumerable<T> 与自定义 IEqualityComparer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/432829/

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