如何在我的对象上使用arrayList.contains

时间:2009-10-27 17:38:40

标签: c# .net

我一直试图检查我的arraylist以查看某个对象是否已经存在,但它总是返回false。有没有人对我在使用arrayList做错了什么感到厌烦。

ArrayList arr;

void Init()
{
   arr = new ArrayList();  

}

void Fred()
{   
   CauseAssignment ca = new CauseAssignment(Param1.Text, Param2.Text);
   if(!arr.Contains(ca))
       arr.Add(ca);

}



 public class CauseAssignment
{
    private string _Path;
    public string Path
    {
        get { return _Path; }
    }

    private string _DelimRootCause;
    public string DelimRootCause
    {
        get { return _DelimRootCause; }
    }

    public CauseAssignment(string path, string delimRootCause)
    {
        _Path = path;
        _DelimRootCause = delimRootCause;
    }
    public override string ToString()
    {
        return _Path;
    }
}

7 个答案:

答案 0 :(得分:8)

ArrayList的Contains()方法使用您存储的对象上可用的Equals()实现来确定相等性。

如果您希望将类的两个不同实例视为等效,则需要覆盖Equals()方法以在它们出现时返回true。然后,您还应该重载GetHashCode()以获得字典的一致性和可用性。这是一个例子:

public class CauseAssignment
{
    private string _Path;

    /* the rest of your code */

    public override bool Equals( object o )
    { 
        if( o == null || o.GetType() != typeof(CauseAssignment) )
            return false;
        CauseAssignment ca = (CauseAssignment)o;
        return ca._Path.Equals( this._Path );
    }

    public override int GetHashCode()
    {
        return _Path.GetHashCode();
    }
}

答案 1 :(得分:3)

您需要为Contains()重写Equals()和GetHashCode()以执行您期望的操作,否则它将使用object.Equals(),这只是一个参考比较。

在这种情况下,您可以通过将实现传递给String来轻松实现Equals()和GetHashCode()。

public override bool Equals(object other) {
    CauseAssignment otherCA = other as CauseAssignment;

    if(otherCA != null) {
        return _Path.Equals(otherCA._Path) && DelimRootCause.Equals(otherCA._DelimRootCause);
    }
    return false;
}

答案 2 :(得分:1)

ArrayList.Contains使用对象上的Equals方法来确定对象是否存在。您想根据参考或'CauseAssignment'的值检查存在吗?如果是后者,则需要覆盖Equals方法。

答案 3 :(得分:1)

如果这是你真正的代码,那么当在第三行调用Contains()时,它总是假的,因为arrayList总是空的,因为它刚刚被初始化了两行。

如果这不是问题,您可能需要为CauseAssignment类定义equals()。

答案 4 :(得分:1)

您需要覆盖Equals方法的GetHashcode(和Contains)方法,才能按预期进行比较。 Contains使用Equals方法进行元素比较。如果您的CauseAssignment未实现Equals,则会使用Object.Equals作为默认比较,而这可能不是您假装的内容。

答案 5 :(得分:1)

.Contains()在这种情况下比较对象引用,而不是该对象的属性值。你有几个选择:

  1. 寻找您知道存在的参考:
  2. Object o = myArrayList[i];
    
    if(myArrayList.Contains(o)) .... // returns true
    
    1. 如果您的类允许ArrayList根据您自己的条件确定两个对象是否相等,则覆盖.Equals()方法。
    2. 有关示例和更多信息,请参阅http://msdn.microsoft.com/en-us/library/ms173147.aspx

答案 6 :(得分:0)

arr.Contains(ca)将检查列表中是否存在对象 ca并始终返回false,因为它始终是新对象。

通过覆盖arr方法,你必须循环遍历Equals的内容,检查每个对象的值与新创建的对象的值。