簡體   English   中英

使用Linq使用預定義類型的GroupBy

[英]GroupBy with predefined type using Linq

我正在追蹤數據

 Id1      Id2        Days
 ------------------------
  1        1          10
  1        1          20
  1        2          30
  1        3          40

我想使用Linq按Id1Id2對數據進行分組當按以下方式進行分組時,它給我正確的結果

List<data>.GroupBy(p => new {p.Id1, p.Id2});

但是,當我使用預定義類型時,它給我的結果是四個不同的行組。 它不會將前兩行合並到一個組中。

List<data>.GroupBy(p => new GroupKey(p.Id1, p.Id2));

    class GroupKey
    {
        public GroupKey(decimal _id1,decimal _id2)
        {
            Id1= _id1;
            Id2= _id2;
        }
        public decimal Id1{ get; set; }
        public decimal Id2{ get; set; }
    }    

如何使用預定義類型獲得相同的結果?

為類型實現EqualsGetHashCode

就像是:

public override bool Equals(object other)
{
    var otherKey = other as GroupKey;

    if (otherKey == null)
    {
        return false;
    }

    return otherKey.Id1 == this.Id1 && otherKey.Id2 == this.Id2;
}

public override int GetHashCode()
{
    return this.Id1.GetHashCode() ^ this.Id2.GetHashCode();
}

之所以適用於匿名類型(例如您在第一個示例中創建的類型),是因為匿名類型會自動獲得EqualsGetHashCode的實現,這些實現是根據匿名類型上定義的屬性定義的(請參見“備注”部分)在MSDN上的“ 匿名類型 ”文章中)。

使用struct而不是class並使其不可變。

struct GroupKey
{
    public GroupKey(decimal _id1,decimal _id2):this()
    {
        Id1= _id1;
        Id2= _id2;
    }
    public decimal Id1{ get; private set; }
    public decimal Id2{ get; private set; }
} 

首先,它將比類占用更少的內存。 第二,默認的結構相等行為比較結構的內容而不是引用。 這就是為什么它不能正確分組的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM