这是我想要做的事情。我正在使用LINQ to XML查询一个XML文件,它给了我一个IEnumerable
Distinct() 方法不起作用,因为我使用该方法与未使用该方法的结果数量完全相同。另外一件事,我不知道是否通常可能,但是我无法进入 AllianceComparer.Equals() 来查看可能的问题。
我在互联网上找到了这方面的例子,但似乎无法使我的实现工作。
希望这里的某个人能看出哪里可能有错! 提前致谢!
<T
>对象,其中T是我的“村庄”类,填充了此查询的结果。一些结果是重复的,所以我想在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() 来查看可能的问题。
我在互联网上找到了这方面的例子,但似乎无法使我的实现工作。
希望这里的某个人能看出哪里可能有错! 提前致谢!