我有一个我想要与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)
知道为什么吗?
谢谢
你class必须覆盖Equals(object)并GetHashCode()正确.否则两个new Params { ... }即使看起来一样也不会"平等".
匿名类型会自动覆盖这两种方法.
您也可以使用a struct而不是a,class因为a struct使用了覆盖Equals(object)和GetHashCode()存在的覆盖System.ValueType.如果选择a struct,请考虑使类型为immutable,即将属性设置为只读(或使用private set;).