Linq - 使用我自己的类型与匿名类型的GroupBy

Dam*_*owa 3 c# linq

我有一个我想要与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; }
}
Run Code Online (Sandbox Code Playgroud)

问题在于它的工作原理:(即我只获得一个包含所有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();
Run Code Online (Sandbox Code Playgroud)

但是这不起作用:(即我得到的数量与Ids一样多)

        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();
Run Code Online (Sandbox Code Playgroud)

知道为什么吗?

谢谢

Jep*_*sen 6

class必须覆盖Equals(object)GetHashCode()正确.否则两个new Params { ... }即使看起来一样也不会"平等".

匿名类型会自动覆盖这两种方法.

您也可以使用a struct而不是a,class因为a struct使用了覆盖Equals(object)GetHashCode()存在的覆盖System.ValueType.如果选择a struct,请考虑使类型为immutable,即将属性设置为只读(或使用private set;).