集合

看如下问题,想下输出的结果:

为什么输出的结果不是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();
View Code

输出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();
View Code

结果:4
5
6
False
99.9
ArrayList集合.Person。  为何p没删掉?

根据值来删除的时候,只有两个元素的值相同才能被删除。判断两个元素是否相同是调用元素的equals()方法来判断的,而equals判断的是元素的值。因为person没有重写object的equals方法,所以无法删除 。如果想删除p,让person类重新equals方法即可,这个前面的博客已经讲过,不再赘述。

集合的contains方法也是通过equals来判断的。

原文地址:https://www.cnblogs.com/wesley168/p/6511275.html