2012-01-10 4 views
0

エンティティリストがあります。エンティティには2つの整数変数があります。リストにそのアイデンティティが含まれているかどうかをチェックしようとしていますが、常にfalseを返します。List Contains()エンティティアイテムのチェック

基本的には、リストにXが含まれているかどうかを確認しようとしています。

List<Entity.Limit> list = new List<Entity.Limit>(); 

list.Add(new Entity.Limit(1, 2)); 
list.Add(new Entity.Limit(1, 3)); 
list.Add(new Entity.Limit(1, 4)); 

Response.Write(list.Contains(new Entity.Limit(1, 2))); //Returns False 
+1

'Equals'メソッドとGetHashCode'メソッドをオーバーライドしましたか? – Eranga

+0

いいえ、どうすればいいですか? –

答えて

3

Entity.LimitオーバーライドObject.Equalsを持っています。今、参照を比較しているので、それらのいずれにもマッチしません。したがって:

class Limit { 
    // ... 
    public override bool Equals(object obj) { 
     Limit l = obj as Limit; 

     if(l != null) { 
      // Compare the two and return true if they are equal 
     } 

     return false; 
    } 
} 

Contains()は、あなたのオブジェクトを適切に比較することができます。

+0

これは私が必要なものです、ありがとうございます。 –

+0

さらに実習として、Equalsをオーバーライドする場合は、GetHashCodeメソッドをオーバーライドすることをお勧めします。 – ken

3

ここでの問題は、値ベースの等価性が本当に必要な場合に、参照ベースの等価性を使用していることです。価値の平等を得るためには、IEqualityComparer<T>Contains拡張メソッドに渡すか、Equality.LimitタイプのEqualsGetHashCodeを上書きする必要があります。ここ

サンプルIEqualityComparer<Entity.Limit>実装

public sealed class EntityEqualityComparer : IEqualityComparer<Entity.Limit> { 
    public bool Equals(Entity.Limit left, Entity.Limit right) { 
    return 
     left.Value1 == right.Value1 && 
     left.Value2 == right.Value2; 
    } 
    public int GetHashCode(Entity.Limit left) { 
    return left.Value1^left.Value2; 
    } 
} 

。注:2つの値のための適切なプロパティ名とValue1Value2を交換します。

using System.Linq; 
... 
bool contains = list.Contains(
    new Entity.Limit(1, 2), 
    new EntityEqualityComparer()); 
関連する問題