Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq-将GroupBy与我自己的类型和匿名类型一起使用_C#_Linq - Fatal编程技术网

C# Linq-将GroupBy与我自己的类型和匿名类型一起使用

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

我有一个要与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();
... 布拉布拉赫代码。。。
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
的实现在结构只有两个非静态字段且都具有type
int
?)的特殊情况下会有多低效。)在不完全疯狂的情况下,它可能会有多低效:)它反映了,而且反映得很好,我完全赞成进行有趣和有益的反映,但我仍然建议在任何结构栏私有类型上覆盖相等,因为你知道你永远不会比较相等。谢谢,这很有意义!
        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();