2017-07-20 8 views
-2

私はGroupByを匿名型ではなく、具象クラスをキーとして使用しようとしました。私はEqualsメソッドをオーバーライドしました。それは助けになりませんでした。私は具体的な型をキーとして使うことに問題があるのを見ましたが、それを使用する際のトラブルについては言及していませんでした。 デバッグセッションの結果はあなたがあまりにもクラス2にGetHashCodeメソッドをオーバーライドする必要がpicture具体的なクラスキーを持つGroupBy

class Program 
{ 
    static void Main(string[] args) 
    { 
     DateTime val = DateTime.Now; 
     bool testEquality = new Class2(val) == new Class2(val); 
     bool testEquality2 = new Class2(val).Equals(new Class2(val)); 
     bool testEquality3 = new Class2(val).Equals(new Class2(val.AddDays(1))); 
     List<Class1> list = new List<Class1> 
     { 
      new Class1(1, val), 
      new Class1(2, val.AddHours(1)), 
      new Class1(2, val.AddHours(2)), 
      new Class1(2, val.AddHours(1)), 
      new Class1(2, val.AddHours(1)), 
     }; 
     var grouped = list.GroupBy(x => new Class2(x.prop2)); 

    } 
} 
internal class Class1 
{ 
    public int prop1; 
    public DateTime prop2; 
    public Class1(int v1, DateTime v2) 
    { 
     prop1 = v1; 
     prop2 = v2; 
    } 
} 
internal class Class2 
{ 
    public DateTime prop2; 
    public Class2(DateTime v) 
    { 
     prop2 = v; 
    } 
    public override bool Equals(object obj) 
    { 
     return this.prop2 == ((Class2)obj).prop2; 
    } 
} 
+3

正確にはどのような問題がありますか?あなたは直面しているエラーは何ですか? –

+0

@Evgあなたは 'testEquality'に対してどのような価値を期待していますか?また、 'new Class2(val).Equals(" ")'の結果はどうなると思いますか?あるいは '新しいClass2(val).Equals(null)'? – mjwills

答えて

0

添付された画像です。

internal class Class2 
{ 
    public DateTime prop2; 
    public Class2(DateTime v) 
    { 
     prop2 = v; 
    } 
    public override bool Equals(object obj) 
    { 
     return this.prop2 == ((Class2)obj).prop2; 
    } 

    public override int GetHashCode() 
    { 
     return this.prop2.GetHashCode(); 
    } 
} 

Debugger

ベストプラクティスオーバーライド等しい:

Why is it important to override GetHashCode when Equals method is overridden?

+0

サンプルコードを投稿してテストし、グループ分けが5から3に変更されました(スクリーンショット参照)。私はこれがOPが克服しようとしている問題だと思いますか? –

+0

あなたのコードで 'testEquality'の値は何でしたか? – mjwills

1

あなたはEquals方法の全てGetHashCodeは「適切な取得するには、==!=演算子を実装する必要があります'C#の平等チェック。以下は例です。

public class Class2 
{ 
    public DateTime prop2; 
    public Class2(DateTime v) 
    { 
     prop2 = v; 
    } 

    public static bool operator ==(Class2 a, Class2 b) 
    { 
     if (ReferenceEquals(a, b)) 
     { 
      return true; 
     } 

     return (object)a != null && a.Equals(b); 
    } 

    public static bool operator !=(Class2 a, Class2 b) 
    { 
     return !(a == b); 
    } 

    public override bool Equals(object obj) 
    { 
     return Equals(obj as Class2); 
    } 

    protected bool Equals(Class2 other) 
    { 
     return other != null && prop2.Equals(other.prop2); 
    } 

    public override int GetHashCode() 
    { 
     return prop2.GetHashCode(); 
    } 
} 
関連する問題