C#如何查找ArrayList 中的某个数据?(附解决方案及源码)

来源:互联网 发布:矩阵的三种范数怎么求 编辑:程序博客网 时间:2024/05/21 15:00

 请问,如何查找ArrayList 中的某个数据???
我下面的代码为何总是返回false?
难道一定要用循环吗?


 private void button1_Click(object sender, EventArgs e)
 {

            ArrayList SenderAddressAL= new ArrayList();

            SenderAddressAL.Add(new SenderAddress("[Use system default]", ""));
            SenderAddressAL.Add(new SenderAddress("
abc@ebay.com", "abc@ebay.com"));


          

            if (SenderAddressAL.Contains(new SenderAddress("abc@ebay.com", "abc@ebay.com")))
                    MessageBox.Show("Have");
            else
                    MessageBox.Show("NOT Have");


        }

public class SenderAddress
    {
        //-----Description-----

        protected string description;


        public string Description
        {
            get { return description; }

            set { description = value; }
        }


        //-----eMailAddress-----

        protected string emailaddress;


        public string eMailAddress
        {
            get { return emailaddress.ToLower(); }

            set { emailaddress = value; }
        }

 

        public SenderAddress(string descr, string emailaddr)
        {
            description = descr;
            emailaddress = emailaddr;
        }
    }

Solution:

SenderAddress override Equals

参考这个代码,把类改一下就可以了:

//可以比较的类
class A
{
 private int m_i;
 public A(int i)
 {
  this.m_i = i;
 }
 public override bool Equals(object obj)
 {
  A _a = obj as A;
  if (_a != null && _a.m_i == this.m_i)
  {
   return true;
  }
  return base.Equals(obj);
 }
 public override int GetHashCode()
 {
  return base.GetHashCode();
 }
}

//测试
private void button1_Click(object sender, EventArgs e)
{
 ArrayList al = new ArrayList();
 al.Add(new A(1));
 al.Add(new A(2));
 al.Add(new A(3));

 if (al.Contains(new A(2)))
 {
  MessageBox.Show("have");
 }
 else
 {
  MessageBox.Show("no");
 }
}

public override bool Equals(object obj)
 {
  A _a = obj as A;
  if (_a != null && _a.m_i == this.m_i)
  {
   return true;
  }
  return base.Equals(obj);
 }
 public override int GetHashCode()
 {
  return base.GetHashCode();
 }

这种方法是最标准的方法。
这两段代码是关键,其中GetHashcode不写也行,但会有编译警告。

 

override SenderAddress的Equals方法,否则它做的是对象地址的比较,即比较是否为同一对象,所以你的代码总是返回false