这里就是我想做的事。我查询一个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();
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top