C#集合之ArrayList

C#中之所以有集合这个东东,是因为数组的长度是固定的,而实际需求是,不确定未来这个“数组”的个数,故出现集合这个概念,因为集合的容量会随元素的增加曾倍数增长。C#中有2类常用集合:ArrayList,泛型版本是List<T>(类似数组集合)和Hashtable,泛型版本是Dictionary<K,V>(键值对集合),现在讨论下ArrayList集合

刚才说集合的容量会随元素的增加曾倍数增长,请看代码:

1             ArrayList aList = new ArrayList();
2             aList.Add(9);
3             aList.Add(new Person() { ID = 1, Name = "yzk", Age = 18 });
4             aList.Add("80");
5             aList.AddRange(new int[] { 4, 5, 6, 7, 8 });
6             aList.AddRange(new string[] { "张三", "李四", "王五" });
7             Console.WriteLine("容量:" + aList.Capacity);
8             Console.WriteLine("含元素个数:" + aList.Count);
9             Console.ReadKey();

运行结果如下:

需要注意的是,集合中的Add方法只能添加一个元素,哪怕里面是数组也只认为是一个元素,而AddRange则认为添加“一些”元素,里面每个元素都是集合中的单个元素。

当容量为8,元素<=8时不增长,>8后,增加至16.

调用ArrayList的Remove()和RemoveAt(),可以删除集合中的元素。

 1 ArrayList aList = new ArrayList();
 2             aList.Add(9);
 3             aList.Add(new Person() { ID = 1, Name = "yzk", Age = 18 });
 4             aList.Add("80");
 5             aList.AddRange(new int[] { 4, 5, 6, 7, 8 });
 6             aList.AddRange(new string[] { "张三", "李四", "王五" });
 7             aList.Add(new string(new char[]{‘a‘,‘b‘,‘c‘}));
 8             aList.Remove("80");
 9             aList.Remove("abc");
10             Console.WriteLine("容量:" + aList.Capacity);
11             Console.WriteLine("含元素个数:" + aList.Count);

运行结果如下:

Count为集合中实际包含元素的个数,而Capacity代表容量。

这里有一个疑问,Remove()是根据对象来删除元素,但是可以看到new string(new char[]{‘a‘,‘b‘,‘c‘})和"abc"不是一个东西,前者是new出来的,那么在堆内存中肯定创建了对象,而后者是字符串常量。为何Remove()还能删掉呢?编译得知,Remove删除的时候,是调用对象的Equal()方法在判断2个对象是否相同,即只要值相同就认为是一个对象。

需要注意的是,如果要清空集合中的元素,不能在foreach中遍历删除,因为foreach在遍历时要求对象个数不能变。也不能调用for循环删除,请看下面的代码:

 1 ArrayList aList = new ArrayList();
 2             aList.Add(9);
 3             aList.Add(new Person() { ID = 1, Name = "yzk", Age = 18 });
 4             aList.Add("80");
 5             aList.AddRange(new int[] { 4, 5, 6, 7, 8 });
 6             aList.AddRange(new string[] { "张三", "李四", "王五" });
 7             aList.Add(new string(new char[]{‘a‘,‘b‘,‘c‘}));
 8             for (int i = 0; i < aList.Count; i++)
 9             {
10                 aList.Remove(aList[i]);
11             }
12             Console.WriteLine("容量:" + aList.Capacity);
13             Console.WriteLine("含元素个数:" + aList.Count);

我们的设想是,集合中的元素清空了,即Count为0,但实际结果如下:

为什么会出现这种情况呢?调试可以看到,在这样删除元素的时候,集合的Count总在变,当删除第0个时,集合中的Count-1,原来的第1个元素变成第0个,而再删除第1个元素时,实际删除的是原来元素+1个元素,就造成了漏删除的问题,所以要清空ArrayList集合中的元素,只能调用其Clear()方法。

下面说一下,ArrayList集合排序的问题:

调用ArrayList集合的Sort()方法可实现排序:

1 ArrayList alist = new ArrayList();
2             alist.AddRange(new int[] { 3, 8, 4, 22, 59, 20, 55, 74, 33 });
3             alist.Sort();       //如果集合中的对象都是数值,默认是可以根据升序排序的
4             foreach (var item in alist)
5             {
6                 Console.WriteLine(item);
7             }

但是更多的时候是, ArrayList中是几个对象,那如何实现排序呢?有2种方法,下面分别写出:

1.让对象实现IComparable接口:

 1 class Person : IComparable
 2     {
 3         public int Id { get; set; }
 4         public string Name { get; set; }
 5         public int Age { get; set; }
 6
 7         //定义排序规则(依据年龄来排序)
 8         public int CompareTo(object obj)
 9         {
10             Person p = obj as Person;
11             return this.Age-p.Age;
12         }
13     }

这样,一个排序规则就定义好了,是按照年龄升序排列(如果要实现倒序,将CompareTo中换成p.Age-this.Age即可)

ArrayList aList = new ArrayList();
            Person p1 = new Person() { Id = 1, Name = "yzk", Age = 18 };
            Person p2 = new Person() { Id = 2, Name = "jk", Age = 22 };
            Person p3 = new Person() { Id = 3, Name = "sk", Age = 20 };
            aList.AddRange(new Person[] { p1, p2, p3 });
            aList.Sort();
            foreach (var item in aList)
            {
                Person p = item as Person;
                Console.WriteLine(p.Name + "  " + p.Age);
            }

2.在Person类外面定义排序方法的类,实现IComparer接口,代码如下:

class SortByName : IComparer
    {
        public int Compare(object x, object y)
        {
            Person px = x as Person;
            Person py = y as Person;
            return px.Name.Length - py.Name.Length;
        }
    }

    class SortByAge : IComparer
    {
        public int Compare(object x, object y)
        {
            Person px = x as Person;
            Person py = y as Person;
            return px.Age - py.Age;
        }
    }

这里我定义了2个排序规则,都实现IComparer接口.使用排序的代码如下:

 1 ArrayList aList = new ArrayList();
 2             Person p1 = new Person() { Id = 1, Name = "yzk", Age = 18 };
 3             Person p2 = new Person() { Id = 2, Name = "jk", Age = 22 };
 4             Person p3 = new Person() { Id = 3, Name = "sk", Age = 20 };
 5             aList.AddRange(new Person[] { p1, p2, p3 });
 6             aList.Sort(new SortByName());
 7             foreach (var item in aList)
 8             {
 9                 Person p = item as Person;
10                 Console.WriteLine(p.Name + "  " + p.Age);
11             }

这样,如果需求变化了,我只需在声明一个类,实现IComparer接口即可。然后调用集合的Sort方法时,将类new出来的对象放进去就好了。

好了,关于ArrayList就说这么多,如果有大神要补充的,请直接回复哈。共同进步!

C#集合之ArrayList

时间: 2024-08-28 04:26:30

C#集合之ArrayList的相关文章

java集合之ArrayList

ArrayList<E>类:位于java.util包下,是List集合中的一种. 特点:有序,可重复,实现不同步,底层数据结构是数组,查询快增删慢. 常用构造: ArrayList()   :   空参构造,默认容量是10 ArrayList(int capacity)   :   带参构造,指定初始容量. 方法: 1)添加功能 boolean  add(E e)  : 将指定的元素添加到此列表的尾部. void   add(int index,E e): 将指定的元素插入此列表中的指定位置.

C#语言基础——集合(ArrayList集合)

集合及特殊集合 集合的基本信息: System.Collections 命名空间包含接口和类,这些接口和类定义各种对象(如列表.队列.位数组.哈希表和字典)的集合.System.Collections.Generic 命名空间包含定义泛型集合的接口和类,泛型集合允许用户创建强类型集合,它能提供比非泛型强类型集合更好的类型安全性和性能.ystem.Collections.Specialized 命名空间包含专用的和强类型的集合,例如,链接的列表词典.位向量以及只包含字符串的集合. 常用的集合为Ar

集合框架(ArrayList存储自定义对象并遍历泛型版)

//集合框架(ArrayList存储自定义对象并遍历泛型版) package cn.itcast_02; import java.util.ArrayList; import java.util.Iterator; /* * 需求:存储自定义对象并遍历. * * A:创建学生类 * B:创建集合对象 * C:创建元素对象 * D:把元素添加到集合 * E:遍历集合 */ public class ArrayListDemo2 { public static void main(String[]

Java 集合(ArrayList)应用

JAVA集合 对象数组 集合类之ArrayList 学生管理系统 NO.one 对象数组 1.1 对象数组描述 A:基本类型的数组:存储的元素为基本类型 int[] arr={1,2,3,4} B:对象数组:存储的元素为引用类型 Student[] stus=new Student[3]; Student代表一个自定义类 Stus数组中stus[0],stus[1],stus[2]的元素数据类型为Student, 都可以指向一个Student对象 1.2 对象数组案例: 创建一个学生数组,存储三

泛型集合之ArrayList

泛型集合就是用<>形参和实参规定好的集合,就是在原来的基础上加了一对括号和限制了参数类型,便于在编译时不会报错,在运行时也不会报错.看一下下面的代码. package jihe; import java.util.ArrayList; public class ArrayListTest { public static void main(String[] args) { // TODO Auto-generated method stub //实例化集合对象 ArrayList list=n

C#中数组、集合(ArrayList)、泛型集合List&lt;T&gt;、字典(dictionary&lt;TKey,TValue&gt;)全面对比

为什么把这4个东西放在一起来说,因为c#中的这4个对象都是用来存储数据的集合--. 首先咱们把这4个对象都声明并实例化一下: //数组 string[] m_Str = new string[5]; //集合 ArrayList m_AList = new ArrayList(); //泛型集合 List<int> m_List = new List<int>(); //字典 Dictionary<int, string> m_Dt = new Dictionary&l

C#重的数组、集合(ArrayList)、泛型集合(list&lt;T&gt;)三者比较及扩展延伸……

本来我只想总结下数组.集合(ArrayList).泛型集合(list<T>)三者的比较的,可以一写下来要扩展的知识点有点多了,只能写一个小的知识点列表了如下: 1.数组.集合(ArrayList).泛型集合(list<T>)三者的比较 2.接口 3.值类型和引用类型解析 4.泛型 5.接口和类的区别 6.重载和重写 7.虚方法和抽象方法 8.继承和多态 9.还有很多-- 由于小达刚开始写博客,还挺新鲜,所以进度应该不慢.留给大家一点东西,也不枉白敲一场代码.

C#常用的集合类型(ArrayList类、Stack类、Queue类、Hashtable类、SortedList类)

1.ArrayList类 ArrayList类主要用于对一个数组中的元素进行各种处理.在ArrayList中主要使用Add.Remove.RemoveAt.Insert四个方法对栈进行操作.Add方法用于将对象添加到 ArrayList 的结尾处:Remove方法用于从 ArrayList 中移除特定对象的第一个匹配项:RemoveAt方法用于移除 ArrayList 的指定索引处的元素:Insert方法用于将元素插入 ArrayList 的指定索引处. 示例 ArrayList的使用 示例将介

从源码看Java集合之ArrayList

Java集合之ArrayList - 吃透增删查改 从源码看初始化以及增删查改,学习ArrayList. 先来看下ArrayList定义的几个属性: private static final int DEFAULT_CAPACITY = 10; private static final Object[] EMPTY_ELEMENTDATA = {}; private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; tra