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

时间:2016-12-09 22:13:43

标签: 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; }
}

事情就是这样: (即,我只得到一个包含所有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();

但这不起作用: (即,我得到了与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();

知道为什么吗?

由于

2 个答案:

答案 0 :(得分:6)

您的Equals(object)必须正确覆盖GetHashCode()new Params { ... }。否则两个struct即使看起来相同也不会“相等”。

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

您也可以使用class代替struct,因为Equals(object)使用GetHashCode()中存在的System.ValueTypestruct覆盖}。如果您选择private set;,请考虑将类型设置为 immutable ,即将属性设置为只读(或使用#-*-coding:utf8;-*- #qpy:2 #qpy:kivy from kivy.app import App from kivy.uix.button import Button class TestApp(App): def build(self): # display a button with the text : Hello QPython return Button(text='Hello QPython') TestApp().run() )。

答案 1 :(得分:0)

你必须使用类或匿名类型.Params不是class.You可以使用它。

试试这个:

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