C# Linq-将GroupBy与我自己的类型和匿名类型一起使用
我有一个要与Linq分组的对象列表。对象类型为GroupRating。我想按它们的“Params”属性对它们进行分组C# Linq-将GroupBy与我自己的类型和匿名类型一起使用,c#,linq,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 Custo
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();
... 布拉布拉赫代码。。。
var groupedList=myList.GroupBy(i=>new{
CarrierId=i.Params.CarrierId,
CustomerId=i.Params.CustomerId
},i=>i.Id);
但这不起作用:
(即,我得到的组数与ID数相同)
var myList=new List();
... 布拉布拉赫代码。。。
var groupedList=myList.GroupBy(i=>new参数{
CarrierId=i.Params.CarrierId,
CustomerId=i.Params.CustomerId
},i=>i.Id);
知道为什么吗
谢谢您的
类
必须正确重写等于(对象)
和GetHashCode()
。否则,两个新参数{…}
将不“相等”,即使它们看起来相同
匿名类型会自动覆盖这两个方法
您还可以使用
struct
而不是类
,因为struct
使用Equals(object)
和GetHashCode()
的重写,这些重写存在于System.ValueType
中。如果选择<代码>结构> <代码>,请考虑使类型不可变,即使属性只读(或者使用<代码>私有集合;)。必须使用类或匿名类型。PARAMS不是类。您可以使用它。
试试这个:
var groupedList = myList.GroupBy(i => new Parameters {
CarrierId = i.CarrierId,
CustomerId = i.CustomerId
}, i => i.Id).ToArray();
+1,但是…A.结构中默认的
等于
和GetHashCode
远远不是最优的,所以我建议即使使用结构也重写它们,B.在可能的情况下,总是值得考虑不可变性,即使在类中也是如此。@JonHanna我同意这一点(虽然,ValueType
的实现在结构只有两个非静态字段且都具有typeint
?)的特殊情况下会有多低效。)在不完全疯狂的情况下,它可能会有多低效:)它反映了,而且反映得很好,我完全赞成进行有趣和有益的反映,但我仍然建议在任何结构栏私有类型上覆盖相等,因为你知道你永远不会比较相等。谢谢,这很有意义!
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();
var groupedList = myList.GroupBy(i => new Parameters {
CarrierId = i.CarrierId,
CustomerId = i.CustomerId
}, i => i.Id).ToArray();