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).
谢谢你的帮助〜
默认的比较器是调用Object.GetHashCode和IEquatable<Office>.Equals.
这对您不起作用,因为您隐藏了该GetHashCode()成员,而不是覆盖它.
你Equals和GetHashCode方法应该改变:
public **override** bool Equals(object obj)
public **override** int GetHashCode()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1156 次 |
| 最近记录: |