2011-11-29 5 views
10

を働いていない.....結果は、任意の手掛かりなぜ空交差は、私は二つのリストは以下を参照している

List<Pay>olist = new List<Pay>(); 
List<Pay> nlist = new List<Pay>(); 
Pay oldpay = new Pay() 
{ 
    EventId = 1, 
    Number = 123,       
    Amount = 1 
}; 

olist.Add(oldpay); 
Pay newpay = new Pay() 
{ 
    EventId = 1, 
    Number = 123,       
    Amount = 100 
}; 
nlist.Add(newpay); 
var Result = nlist.Intersect(olist); 

として戻って来ていますか?

+0

Pay EqualityがEventID、Number、およびAmountであるとすると、これらの2つのリストには共通点がないため、何も交差しません。つまり、ここでは平等を定義していません。 –

+0

ここで平等を定義していないということを意味しますか?異なる要素のみがAmount = 100 – user570715

+0

状態に_why_ 'oldpay'が' newpay'と等しくなければならないということは何もありません。 –

答えて

21

あなたは、2つのインスタンスが等しいと見なされたときにそうIntersectは知りませんが、あなたのPayクラスのEqualsGetHashCodeメソッドをオーバーライドする必要があります。どのように平等を決定するのがEventIdだと思いますか? oldPaynewPayは異なるインスタンスなので、デフォルトではそれらは等しいと見なされません。

あなたはこのようPayでメソッドをオーバーライドすることができます

public class PayComparer : IEqualityComparer<Pay> 
{ 
    public bool Equals(Pay x, Pay y) 
    { 
     if (x == y) // same instance or both null 
      return true; 
     if (x == null || y == null) // either one is null but not both 
      return false; 

     return x.EventId == y.EventId; 
    } 


    public int GetHashCode(Pay pay) 
    { 
     return pay != null ? pay.EventId : 0; 
    } 
} 

... 

var Result = nlist.Intersect(olist, new PayComparer()); 
+2

またはあなた自身の比較者を書くことができます:http://msdn.microsoft.com/en-us/library/234b841s.aspx – mydogisbox

+0

@mydogisbox、はい、私は実際にあなたがコメントしたときに私の答えを編集していた;) –

+0

または'Pay'型を' struct'にしておけば、デフォルトの実装はリフレクションを使っているので遅くなります。 – Gebb

0

Intersectはおそらく唯一の追加オブジェクトです:

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

public override bool Equals(object other) 
{ 
    if (other is Pay) 
     return ((Pay)other).EventId == this.EventId; 
    return false; 
} 

別のオプションは、IEqualityComparer<Pay>を実装し、Intersectにパラメータとして渡すことですPayの同じインスタンスが両方ともListにあるとき。 oldPaynewPayはインスタンス化されているため、等しくないとみなされます。

Intersectは、Equalsメソッドを使用してオブジェクトを比較します。それをオーバーライドしない場合は、trueを返すのは、オブジェクトの同じインスタンスである場合にのみ、クラスの同じ動作を維持します。

メソッドをPayに上書きする必要があります。

//in the Pay class 
    public override bool Equals(Object o) { 
     Pay pay = o as Pay; 
     if (pay == null) return false; 
     // you haven't said if Number should be included in the comparation 
     return EventId == pay.EventId; // && Number == pay.Number; (if applies) 
    } 
0

オブジェクトは参照型です。 2つのオブジェクトを作成すると、2つの固有の参照があります。あなたがした場合、彼らはこれまでに等しいと考え唯一の方法は次のとおりです。

この場合
object a = new object(); 
object b = a; 

、(== b)は真です。 referencevalue対タイプをよく読んで、そしてobjects

そして、あなたの問題を解決するために、トーマス・レベスクが指摘したように、等しく、GetHashCodeメソッドをオーバーライドします。