检查List Contains()实体项

时间:2012-01-10 01:49:06

标签: c# asp.net list entity

我有一个实体列表。该实体有两个整数变量。我正在尝试检查列表是否包含该标识,但它总是返回false。

基本上我正在尝试检查列表是否包含任何第二个索引中的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

2 个答案:

答案 0 :(得分:3)

这里的问题是,当您真正想要基于值的相等时,您正在使用基于引用的相等性。为了获得价值平等,您需要将IEqualityComparer<T>传递给Contains扩展方法,该方法执行相等或覆盖EqualsGetHashCode Equality.Limit类型。

以下是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;
  }
}

注意:将Value1Value2替换为2个值的相应属性名称。

using System.Linq;
...
bool contains = list.Contains(
  new Entity.Limit(1, 2),
  new EntityEqualityComparer());

答案 1 :(得分: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()将能够正确比较您的对象。