2

私はこのオブジェクトを持っています:

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と機能しますが、変更するとグループ名を取得できません。

4

4 に答える 4

3

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;
    }
}
于 2013-01-21T13:12:45.110 に答える
3

はい、これは正しいです。デフォルトでは、クラスはすべて一意ですが、一意性をオーバーライドできます。

  1. Equals(object obj)グループ オブジェクトの&をオーバーライドGetHasCode()して、独自の等価性を実装します
  2. これを実装IEqualityComparer<Group>して、GroupBy メソッドの 3 番目の引数として渡します。
于 2013-01-21T13:12:59.883 に答える
1

ここにはいくつかの選択肢があります。

  • グループ オブジェクトのクラスが GetHashCode と Equals を実装していることを確認してください。これらの実装は、グループ内の ID を比較するのと同じくらい簡単です。
  • ID でグループ化し、グループ化の最初のユーザーのグループからグループ名を取得します。グループ化されたユーザーはすべて同じグループに属しているため、名前は同じになります。
  • グループ クラスのソースにアクセスできない場合は、ラップするグループの ID に基づいて GetHashCode と Equals を実装するラッパーでグループ化します。
于 2013-01-21T13:14:17.690 に答える
0

匿名クラスの比較を利用して、次のように記述します。

notes.GroupBy(n => new{n.User.Group.ID,n.User.Group.Name});
于 2013-01-21T13:16:50.153 に答える