看如下问题,想下输出的结果:
为什么输出的结果不是28,"abc",'c',23呢?
每次移除某个元素后,集合的元素个数会变,下标也会变。
改成下面的代码呢?

1 ArrayList lis = new ArrayList() 2 { 3 1,2,4,28,"abc",'c',23 4 }; 5 6 //lis.RemoveAt(0); 7 //lis.RemoveAt(1); 8 //lis.RemoveAt(2); 9 10 //for (int i = 0; i < lis.Count; i++) 11 //{ 12 // Console.WriteLine(lis[i]); 13 //} 14 15 for (int i = 0; i < lis.Count; i++) 16 { 17 lis.RemoveAt(i); 18 } 19 20 for (int i = 0; i < lis.Count; i++) 21 { 22 Console.WriteLine(lis[i]); 23 } 24 Console.ReadKey();
输出2,28,c。
//第一次循环:lis.count=7;移除掉第一个:1;i=0 集合中的元素剩下:2,4,28,"abc",'c',23
//第二次循环:lis.count=6;i=1;移除4;集合中的元素剩下:2,28,"abc",'c',23
//第三次循环:lis.count=5;i=2;集合中的元素剩下:2,28,'c',23
//第四次循环:lis.count=4;i=3;集合中的元素剩下:2,28,'c'
//第五次循环:lis.count=3;i=4;不符合循环条件,跳出循环
既然根据索引删除,会有问题,那根据值来删除呢?

1 ArrayList list = new ArrayList() {1,2,3,4,5,6,"aaa",false,99.9,new Person() { Name="张三"} }; 2 3 list.Remove(1); 4 list.Remove(2); 5 list.Remove(3); 6 string s = new string(new char[] { 'a','a','a'}); 7 Person p = new Person() { Name="张三"}; 8 9 list.Remove(s); 10 list.Remove(p);//为什么删不掉? 11 12 for (int i = 0; i < list.Count; i++) 13 { 14 Console.WriteLine(list[i]); 15 } 16 17 Console.ReadKey();
结果:4
5
6
False
99.9
ArrayList集合.Person。 为何p没删掉?
根据值来删除的时候,只有两个元素的值相同才能被删除。判断两个元素是否相同是调用元素的equals()方法来判断的,而equals判断的是元素的值。因为person没有重写object的equals方法,所以无法删除 。如果想删除p,让person类重新equals方法即可,这个前面的博客已经讲过,不再赘述。
集合的contains方法也是通过equals来判断的。