簡體   English   中英

按值分組復雜類型

[英]Group a complex type by value

我有這個對象:

notes:[ 
     { user: {
           name: "A",
           group:{
                id:1,
                name:"Group 1"
           }
     }, 
     { user: {
           name: "B",
           group:{
                id:1,
                name:"Group 1"
           }
    }]

我需要按組對其進行分組。所以我嘗試了以下操作:

foreach (IGrouping<Group, Note> item in notes.GroupBy(n => n.User.Group))
{
    var groupName = item.Key.Name;

    foreach (var note in item)
    {
        //
    }
}

但是我遇到了一個問題,因為分組不起作用(我認為這是因為它使用引用來對復雜類型進行分組)。 如果我改變n.User.Group通過n.User.GroupId它的工作原理,但如果我這樣做,我不能獲得組名稱。

您需要在Group類中重寫Equals和GetHashCode。 R#為其生成這種代碼:

public class Group
{
    public int GroupId { get; set; }
    public string Name { get; set; }

    protected bool Equals(Group other)
    {
        return GroupId == other.GroupId;
    }

    public override bool Equals(object obj)
    {
        if (ReferenceEquals(null, obj)) return false;
        if (ReferenceEquals(this, obj)) return true;
        if (obj.GetType() != this.GetType()) return false;
        return Equals((Group) obj);
    }

    public override int GetHashCode()
    {
        return GroupId;
    }
}

是的,這是正確的。 默認情況下,類都是唯一的,但是您可以覆蓋唯一性。

  1. 在組對象上重寫Equals(object obj)GetHasCode()以實現自己的相等性
  2. 實現IEqualityComparer<Group>並將其作為GroupBy方法的第3個參數傳遞。

你有幾個選擇:

  • 確保組對象的類實現GetHashCode和Equals。 實現這些可以像比較組內的ID一樣簡單
  • 按ID分組,然后從分組中的第一個用戶的組中獲取組名。 所有分組的用戶都屬於同一組,因此名稱將相同
  • 如果您無法訪問組類的源,請按包裝器分組,該包裝器根據其包裝的組的ID實現GetHashCode和Equals。

您可以利用比較匿名類的優勢,並編寫為

notes.GroupBy(n => new{n.User.Group.ID,n.User.Group.Name});

暫無
暫無

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

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