gpt4 book ai didi

c# - Linq to Sql 按类分组

转载 作者:行者123 更新时间:2023-12-04 23:21:00 24 4
gpt4 key购买 nike

我想将 groupedList 传递给几个函数,但是在尝试使用类而不是匿名类型进行分组时,我得到了奇怪的结果。在下面的示例中,匿名类型按预期返回 2 个结果,但具体类返回 5,就好像它甚至没有分组一样。

问题:是否可以使用具体类进行 Linq to 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
}

最佳答案

GroupBy方法使用 EqualityComparer<T>.Default自定义时比较有问题的项目 IEqualityComparer未提供(您未提供)。这将基于 IEquatable<T> 的实现类型 T有问题,如果有,如果没有,那么它将简单地使用 object.Equalsobject.GetHashCode那种类型的。

您的自定义类型不提供任何实现,它完全依赖于 object 中定义的实现。 ,对于引用类型,它基于对象的引用。每个personGroup您创建的对象具有不同的引用,因此也不同。

匿名类型不使用默认的相等行为;它们覆盖了 Equals 的定义和 GetHashCode依赖于它们所代表的每个属性的身份。

如果您想使用自己的自定义类型进行分组,并且默认的相等语义不是您想要的,则您需要提供自定义 IEqualityComparer实现或覆盖 EqualsGetHashCode对于有问题的类型。

关于c# - Linq to Sql 按类分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26789649/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com