急!ArrayList的元素是类对象,Contains怎样判断元素是否已存在?

NewPlayer2010 2010-08-24 11:49:29
新人,没分,请见谅!

为了不让ArrayList中不包含同样的元素,

ArrayList中,已经包含了某个元素,但是Contains判断的时候,还是返回false
导致元素被重复加入List.

另做的例子里面,是没有问题的,但是这里就是不行,高手帮忙推测一下,出问题的地方。

调用AddTask函数,是在另一个线程中。


//============================================================
// 功 能 : 增加一个附件转换任务(public函数)
// 参 数 : TTaskInfo i_AttachInfo <- 任务信息
// 返回值 : 无
//============================================================
public static void AddTask(TTaskInfo i_AttachInfo)
{
try
{
//判断任务类型
if (i_AttachInfo.m_intPriority == CTASK.HIGH_TASK)
{
//将任务添加到列表
if (m_SocketTaskList.Contains(i_AttachInfo) == false)
{
lock (m_SocketTaskList)
{
m_SocketTaskList.Add(i_AttachInfo);
}
}
}
else if (i_AttachInfo.m_intPriority == CTASK.NORMAL_TASK)
{
//将任务添加到列表
if (m_DBTaskList.Contains(i_AttachInfo) == false)
{
lock (m_DBTaskList)
{
m_DBTaskList.Add(i_AttachInfo);

Console.WriteLine("m_DBTaskList.Count = " + m_DBTaskList.Count);
for (int i = 0; i < m_DBTaskList.Count; i++)
{
Console.WriteLine(((TTaskInfo)m_DBTaskList[i]).GetInfo());
}
}
}
}

...全文
722 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
a691662 2011-07-27
  • 打赏
  • 举报
回复
mark
Peter200694013 2010-08-24
  • 打赏
  • 举报
回复
元素对应类 重写GetHashCode()

使用List<T>
threenewbee 2010-08-24
  • 打赏
  • 举报
回复
用HashTable代替。

重写 GetHashCode() 方法。
threenewbee 2010-08-24
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 newplayer2010 的回复:]
reflector 是什么?
[/Quote]
反编译.NET程序为源代码的工具。
NewPlayer2010 2010-08-24
  • 打赏
  • 举报
回复
reflector 是什么?
边城的刀声 2010-08-24
  • 打赏
  • 举报
回复
用reflector,看ArrayList.Contains方法
NewPlayer2010 2010-08-24
  • 打赏
  • 举报
回复
我想问一下,8楼的朋友,你的代码从哪里看的,我怎么看不到?
NewPlayer2010 2010-08-24
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 xiao198766 的回复:]

Elem e1=null;
while (true)
{
e1 = new Elem(1, 2, "hello");
试一下
[/Quote]
朋友,你这样是可以的,但是,如果改成这样


Elem e1 = new Elem(1, 2, "hello");
int i = 0;
while (true)
{
e1.m_a = i++;


还是认为是,同一个元素,所以你的方法,治标不治本

NewPlayer2010 2010-08-24
  • 打赏
  • 举报
回复
如果 equals 比较多个 数值,是不是要像17楼那样写啊?

17楼代码 ^ 符号是什么意思啊?

honkerhero 2010-08-24
  • 打赏
  • 举报
回复
KEY是主键,字符串类型,一般来说,equals比较什么,就取哪个属性的hashcode就可以了,保持一致
public override bool Equals(object obj)
{
if (obj == null || obj.GetType() != typeof(T))
return false;
return ((IEntity)this).Key.Equals(((IEntity)obj).Key);
}

public override int GetHashCode()
{
return ((IEntity)this).Key.GetHashCode();
}
jointan 2010-08-24
  • 打赏
  • 举报
回复
根据字段的GetHashCode,组合一个返回就可以了


class Elem
{
int a;
int b;
string c;

public override int GetHashCode()
{
return a.GetHashCode()^b.GetHashCode()^c.GetHashCode();
}

}
NewPlayer2010 2010-08-24
  • 打赏
  • 举报
回复
前面 重写 equals 的方法,已经可以了。

现在有个警告,感觉不太好,小弟是完美主义者。

NewPlayer2010 2010-08-24
  • 打赏
  • 举报
回复
这里有个警告:
重写 Object.Equals(object o)但不重写 Object.GetHashCode()

好像是需要重写 GetHashCode,怎么写啊?

Peter200694013 2010-08-24
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 dancingbit 的回复:]
为什么我总是这么慢?
[/Quote]
dancingbit 2010-08-24
  • 打赏
  • 举报
回复
为什么我总是这么慢?
2009菜鸟 2010-08-24
  • 打赏
  • 举报
回复
Elem e1=null;
while (true)
{
e1 = new Elem(1, 2, "hello");
试一下
dancingbit 2010-08-24
  • 打赏
  • 举报
回复
这个需要自己重载Equals方法,不然.Net是无法知道你两个不同的对象相等的标准是什么的。
jointan 2010-08-24
  • 打赏
  • 举报
回复
楼上已经说了,重写Equals方法,自己比较{1, 2, "hello"},完全相同,返回true;

Peter200694013 2010-08-24
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 newplayer2010 的回复:]
就是因为 new 那里的问题,每次new 一个 Elem 对象,即使Elem的成员,值都一样,也被认为是不同的[/Quote]
Elem类中重写equals 方法
边城的刀声 2010-08-24
  • 打赏
  • 举报
回复

public virtual bool Contains(object item)
{
if (item == null)
{
for (int j = 0; j < this._size; j++)
{
if (this._items[j] == null)
{
return true;
}
}
return false;
}
for (int i = 0; i < this._size; i++)
{
if ((this._items[i] != null) && this._items[i].Equals(item))
{
return true;
}
}
return false;
}
contains的源码,所以重写下equals,以后这种问题,楼主可以直接看源码用refector

加载更多回复(5)

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧