我有一个实体列表。该实体有两个整数变量。我正在尝试检查列表是否包含该标识,但它总是返回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
答案 0 :(得分:3)
这里的问题是,当您真正想要基于值的相等时,您正在使用基于引用的相等性。为了获得价值平等,您需要将IEqualityComparer<T>
传递给Contains
扩展方法,该方法执行相等或覆盖Equals
和GetHashCode
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;
}
}
注意:将Value1
和Value2
替换为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()
将能够正确比较您的对象。