C#独特的类型<T> 与定义IEqualityComparer
-
10-07-2019 - |
题
这里就是我想做的事。我查询一个XML文件的使用皇宫XML,这给了我一个类型<T
>对象,T是我的"乡村"类,充满了这样的结果查询。一些结果是重复的,所以我想来执行不同的()上述类型的对象,就像这样:
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);
}
}
作为默认的比较器不会的工作对于村庄的目的,我实现了一个定义,因为在这里看到在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
}
不同的()方法不起作用,因为我已经完全相同数量的结果与或没有它。另一件事,我不知道,如果它通常可能的,但我不能踏入AllianceComparer.等()以看到可能是什么的问题。
我已经找到这种例子在互联网上,但是我不能让我的执行工作。
我们希望,这里有人可能会看到什么可能是错误在这里!在此先感谢!
解决方案
问题是你的 GetHashCode
.你应该改变它的返回列码的 AllianceName
代替。
int IEqualityComparer<Village>.GetHashCode(Village obj)
{
return obj.AllianceName.GetHashCode();
}
事实是,如果 Equals
返回 true
, 的对象应该具有相同的散列的代码不是这种情况对于不同的 Village
对象相同的 AllianceName
.由于 Distinct
工作通过建立一个散列表内,则将平等的对象不匹配所有由于不同的散列码。
同样,为比较两个文件,如果散列两个文件都是不一样的,你不需要检查的文件本身在所有。他们 将 是不同的。否则,你将继续进行检查,看如果他们真的相同或没有。这正是散列表, Distinct
使用行为。
其他提示
return alliances.Select(v => v.AllianceName).Distinct();
这将返回一个IEnumerable<string>
代替IEnumerable<Village>
。
或改变线
return alliances.Distinct(new AllianceComparer());
到
return alliances.Select(v => v.AllianceName).Distinct();
不隶属于 StackOverflow