【问题标题】:Check if List Contains() entity item检查列表是否包含()实体项
【发布时间】:2012-01-10 01:49:06
【问题描述】:

我有一个实体列表。该实体有两个整数变量。我正在尝试检查列表是否包含该身份,但它总是返回 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

【问题讨论】:

  • 您是否覆盖了Equals 和GetHashCode` 方法?

标签: c# asp.net list entity


【解决方案1】:

让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() 将能够正确比较您的对象。

【讨论】:

  • 作为进一步的练习,如果您覆盖 Equals,有些人会建议您覆盖 GetHashCode 方法。
【解决方案2】:

这里的问题是,当您真正想要基于值的相等时,您正在使用基于引用的相等。为了获得值相等,您需要将IEqualityComparer&lt;T&gt; 传递给执行相等的Contains 扩展方法,或者为Equality.Limit 类型覆盖Equals 和GetHashCode。

这是一个示例 IEqualityComparer&lt;Entity.Limit&gt; 实现

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());

【讨论】:

    猜你喜欢
    • 2021-05-09
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2012-08-26
    • 2020-05-09
    • 1970-01-01
    • 1970-01-01
    • 2019-04-04
    相关资源
    最近更新 更多