c# – IEnumerable.GroupBy没有分组
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – IEnumerable.GroupBy没有分组,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2591字,纯文字阅读大概需要4分钟。
内容图文
我在.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; }
}
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
您可以看到每个公司都有不同的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()
内容总结
以上是互联网集市为您收集整理的c# – IEnumerable.GroupBy没有分组全部内容,希望文章能够帮你解决c# – IEnumerable.GroupBy没有分组所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。