IEnumerable.GroupBy没有分组

Jan*_*cka 3 .net c# vb.net equality

我在.NET中使用GroupBy扩展时遇到问题(4.5,无论是VB.NET还是C#.Exaples都在C#中).情况如下:

2个示例类:

public class Office : IEquatable<Office>
{
    public String Name { get; set; }
    public int Id { get; set; }
    public String Stuff { get; set; }

    // Compare by values
    public bool Equals(object obj)
    {
        if (obj is Office)
        {
            Office cmp = (Office) obj;
            bool result = true;
            result &= cmp.Id == this.Id;
            result &= cmp.Name == this.Name;
            result &= cmp.Stuff == this.Stuff;
            return result;
        }
        else return false;
    }

    // Hashcode by values
    public int GetHashCode()
    {
        var obj = new { Id = this.Id, Name = this.Name, Stuff = this.Stuff };
        return obj.GetHashCode();
    }

    // IEquatable uses overriden Equals implementation
    bool IEquatable<Office>.Equals(Office other)
    {
        return this.Equals(other);
    }
}

public class Company
{
    public Office Office { get; set; }
    public String Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

Class Office具有覆盖等式比较函数并实现IEquatable接口,在这种情况下(据我所知),Default EqualityComparer使用我的Equals实现.

现在我想根据他们占据的办公室对公司列表进行分组,如下所示:

        List<Company> companies = new List<Company>();
        Office office1 = new Office();
        office1.Id = 1;
        office1.Name = "Office";
        office1.Stuff = "Stuff";

        Office office2 = new Office();
        office2.Id = 1;
        office2.Name = "Office";
        office2.Stuff = "Stuff";

        Company date1 = new Company();
        date1.Office = office1;
        date1.Name = "Date 1";

        Company date2 = new Company();
        date2.Office = office2;
        date2.Name = "Date 2";

        companies.Add(date1);
        companies.Add(date2);

        IEnumerable<IGrouping<Office, Company>> grouping = companies.GroupBy(x => x.Office);

        Console.WriteLine("Groups: " + grouping.Count()); // returns 2!!!
        Console.WriteLine("Equals: " + office1.Equals(office2)); // returns true
        Console.WriteLine("Hash 1: " + office1.GetHashCode()); // returns 2067935290
        Console.WriteLine("Hash 2: " + office2.GetHashCode()); // returns 2067935290

        IEqualityComparer cmp = EqualityComparer<Office>.Default;
        Console.WriteLine("Comparer: " + cmp.Equals(office1, office2)); // returns true
Run Code Online (Sandbox Code Playgroud)

您可以看到每个公司都有不同的Office对象,但在我的应用程序的逻辑中,这些对象被认为是相同的.因此,调用office1.Equals(office2)返回true,对象哈希码相等,使用EqualityComparer<Office>.Default的函数Equals也返回true.

现在神秘的是为什么呼叫GroupBy办公室返回两个组,即使办公室"平等".文档说明使用密钥的Default EqualityComparer(http://msdn.microsoft.com/en-us/library/vstudio/bb534501 ( v=vs.100 ) .aspx).

谢谢你的帮助〜

Cor*_*son 8

默认的比较器是调用Object.GetHashCodeIEquatable<Office>.Equals.

这对您不起作用,因为您隐藏了该GetHashCode()成员,而不是覆盖它.

EqualsGetHashCode方法应该改变:

public **override** bool Equals(object obj)
public **override** int GetHashCode()
Run Code Online (Sandbox Code Playgroud)