Sum*_*Guy 3 c# group-by linq-to-sql
我想将groupedList传递给几个函数,但是当尝试使用类而不是匿名类型进行分组时,却得到了奇怪的结果。在下面的示例中,匿名类型按预期返回2个结果,但是具体类返回5,就好像没有分组一样。
问题:是否可以使用具体的类对Linq进行Sql Group By?
public class person
{
public string Name;
public string State;
}
public class personGroup
{
public string State;
public personGroup(string personState)
{
State = personState;
}
}
void Main()
{
var people = new List<person>();
people.Add(new person {Name = "Bob", State = "Tx"});
people.Add(new person {Name = "Bill", State = "Tx"});
people.Add(new person {Name = "Tracy", State = "Tx"});
people.Add(new person {Name = "Steve", State = "Md"});
people.Add(new person {Name = "Kelly", State = "Md"});
var groupedPeople = people.GroupBy (p => p.State );
groupedPeople.Count().Dump();//Returns 2
var morePeople = people.GroupBy (p => new personGroup(p.State) );
morePeople.Count().Dump();//Returns 5
}
Run Code Online (Sandbox Code Playgroud)
该GroupBy方法用于EqualityComparer<T>.Default比较IEqualityComparer未提供定制(您未提供定制)的项目。这将基于所讨论IEquatable<T>类型的实现T,如果存在,则不存在,那么它将简单地使用object.Equalsand object.GetHashCode该类型。
您的自定义类型不提供任何实现,它完全依赖于中定义的实现object,对于引用类型,该实现基于对象的引用。personGroup您创建的每个对象都有不同的引用,因此也有所不同。
匿名类型不使用默认的相等行为。它们会覆盖它们所定义的每个属性的定义,Equals并GetHashCode取决于它们所代表的每个属性的身份。
如果你想使用自己定制的类型进行分组,并默认平等的语义是不是你想要的,你要么需要提供自定义IEqualityComparer的实现,或覆盖Equals和GetHashCode有问题的类型。