Linq -将GroupBy用于自己的类型与匿名类型

kninwzqo  于 2022-12-15  发布在  其他
关注(0)|答案(2)|浏览(123)

我有一个要用Linq分组的对象列表。对象类型是GroupRating。我想按它们的“Params”属性对它们分组。

public class GroupRating
{
    public long Id { get; set; }
    public Parameters Params { get; set; }
}

public class Parameters
{
    public int CarrierId { get; set; }
    public int CustomerId { get; set; }
}

事实上,这是可行的:(即,我只得到一个具有所有ID的组)

var myList = new List<GroupRating>();
        ... blahblah code...

        var groupedList = myList.GroupBy(i => new {
             CarrierId = i.Params.CarrierId,
             CustomerId = i.Params.CustomerId
         }, i => i.Id).ToArray();

但这行不通:(即,我得到尽可能多的组有身份证)

var myList = new List<GroupRating>();
        ... blahblah code...

        var groupedList = myList.GroupBy(i => new Params {
             CarrierId = i.Params.CarrierId,
             CustomerId = i.Params.CustomerId
         }, i => i.Id).ToArray();

知道为什么吗?
谢谢

nfs0ujit

nfs0ujit1#

您的class必须正确覆盖Equals(object)GetHashCode()。否则,两个new Params { ... }即使看起来相同也不会“相等”。
匿名类型自动重写这两个方法。
您也可以使用struct代替class,因为struct使用System.ValueType中存在的Equals(object)GetHashCode()的重写。如果您选择struct,请考虑将类型 * 设置为不可变 *,即将属性设置为只读(或使用private set;)。

7fhtutme

7fhtutme2#

必须使用类或匿名类型。参数不是类。可以使用它。
试试这个:

var groupedList = myList.GroupBy(i => new Parameters {
                 CarrierId = i.CarrierId,
                 CustomerId = i.CustomerId
             }, i => i.Id).ToArray();

相关问题