在C#中,数组、ArrayList、List都能够存储一组对象。
1 数组
1.1 特点
- 最早出现
- 在内存中连续存储,索引速度快
- 插入、删除元素效率低
- 声明时必须指定类型和大小
1.2 数组的声明
数组的声明方式:
方式一:在定义数组时即给出具体元素,数组的长度由大括号里面元素个数决定。
string[] str = {"str1","str2","str3","str4"}
方式二:在定义数组时即给出具体元素,数组的长度由大括号里面元素个数决定。C#还支持将new关键字作为声明语句的一部分使用。 使用new关键字是告诉“运行时”为数据类型分配内存。任何时候将new关键字作为数组赋值的一部分使用,都可以同时在方括号内指定数组的大小。
string[] str = new string[]{"str1","str2","str3","str4"}
或 string[] str = new string[4]{"str1","str2","str3","str4"}
方式三:先定义数组并给出长度,后赋值。
string[] str=new string[4],
str[0]="str1",
str[1]="str2",
str[2]="str3",
str[3]="str4",
特殊说明:分配一个数组但不指定初始值仍然会初始化每个元素。“运行时”会将每个元素初始化为它们的默认值,如下所示:
- 引用类型(比如string)初始化为null;
- 数值类型初始化为零;
- bool初始化为false;
- char初始化为\0。
1.3 例程
在 Main 方法中创建一个字符串类型的数组,并存入 5 个值,然后将数组中下标是偶数的元素输出。
class Program
{
static void Main(string[] args)
{
string[] strs = { "aaa", "bbb", "ccc", "ddd", "eee" };
for(int i = 0; i < strs.Length; i = i + 2)
{
Console.WriteLine(strs[i]);
}
}
}
2 ArrayList
ArrayList是.NET Framework提供的用于数据存储和检索的专用类。
优点:
- 可根据存储的数据来动态调整大小,无需指定数组的长度
- 插入、删除元素效率更高
- 可以插入不同类型的数据(统一转换成object类型)
- object是C#中所有类型的基类,如:
缺点:
- 由于不同类型都能添加进去,在调用时容易出错,类型不安全
- 赋值和提取都需要和object进行转换,损耗性能
3 泛型List
3.1 特点
- 在声明List集合时,我们同时需要为其声明List集合内数据的对象类型
- 避免了数据类型安全问题与装箱拆箱的性能问题
3.2 声明方式
//添加引用
Using System.Collections.Generic;
//声明,T为类型参数,例如bool,byte,int
List<T>list = new List<T>();
3.3 list常见的属性和方法
属性:
- Capacity: 获取容量的大小(容量大于含有元素的个数)
- Count: 获取元素个数
方法:
- Add: 添加元素
- Insert(): 插入元素
- Cotains: 判断某个元素是否在list中
- Clear: 清空
- Sort(): 对列表中的元素进行从小到大的
- Reverse(): 将List里面的元素顺序反转
- RemoveAt(): 移除指定位置的元素
- IndexOf(): 取得一个元素所在列表中的索引位置(从前往后搜索),没找到返回 -1
- LastIndexOf: 取得一个元素所在列表中的索引位置(从后往前搜索),没找到返回 -1
3.4 实例讲解
定义一个 int[ ]数组类型的List,添加3个随机数组:[1], [1,2], [1,2,3] 。在索引为0处插入一个新的数组[1,2,3,4], 将list排序反转后,找出[1,2,3,4]的索引值,并显示新添加数组中的最小值和最大值。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp3
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
int[] a = new int[1] { 1 };
int[] b = new int[2] { 1,2 };
int[] c = new int[3] { 1,2,3 };
//int[] d = new int[4];
//d[0] = 1;
//d[1] = 2;
//d[2] = 3;
//d[3] = 4;
//int[] d = { 1, 2, 3, 4 };
int[] d = new int[4] { 1,2,3,4 };
List<int[]> list = new List<int[]>();
list.Add(a);
list.Add(b);
list.Add(c);
list.Insert(0, d);
list.Reverse();
textBox1.Text = list.IndexOf(a).ToString();
//求解数组中的最大与最小值
List<int> list1 = new List<int>(d);
list1.Sort();
int min = Convert.ToInt32(list1[0]);
textBox2.Text = min.ToString();
int max = Convert.ToInt32(list1[list.Count - 1]);
textBox3.Text = max.ToString();
}
}
}