我一直试图检查我的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;
}
}
答案 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()在这种情况下比较对象引用,而不是该对象的属性值。你有几个选择:
Object o = myArrayList[i]; if(myArrayList.Contains(o)) .... // returns true
.Equals()
方法。 有关示例和更多信息,请参阅http://msdn.microsoft.com/en-us/library/ms173147.aspx。
答案 6 :(得分:0)
arr.Contains(ca)
将检查列表中是否存在对象 ca
并始终返回false,因为它始终是新对象。
通过覆盖arr
方法,你必须循环遍历Equals
的内容,检查每个对象的值与新创建的对象的值。