加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – Linq to Sql Group By Class

发布时间:2020-12-16 02:03:44 所属栏目:百科 来源:网络整理
导读:我想将一个groupsList传递给几个函数,但是当我尝试使用类而不是匿名类型进行分组时,我会得到奇怪的结果.在下面的示例中,匿名类型按预期返回2个结果,但具体类返回5,就好像它甚至没有分组一样. 问题:是否可以使用具体类来执行Linq to Sql Group By? public c
我想将一个groupsList传递给几个函数,但是当我尝试使用类而不是匿名类型进行分组时,我会得到奇怪的结果.在下面的示例中,匿名类型按预期返回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
}

解决方法

当没有提供自定义IEqualityComparer时,GroupBy方法使用EqualityComparer< T> .Default来比较有问题的项目(您没有提供).这将基于IEquatable< T>的实现.有问题的类型T,如果有,那么它将只使用该类型的object.Equals和object.GetHashCode.

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

匿名类型不使用默认的相等behvaior;它们覆盖Equals和GetHashCode的定义,以取决于它们所代表的每个属性的标识.

如果要使用自己的自定义类型进行分组,并且默认的等同语义不是您想要的,则需要提供自定义IEqualityComparer实现,或者覆盖相关类型的Equals和GetHashCode.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读