一、集合
集合重要且常用
孤立的数据是没有意义的,集合可以作为大量数据的处理,可进行数据的搜索、迭代、添加、删除。
C#中,所有集合都必须实现ICollection接口(数组Array除外)
集合 | 说明 |
---|---|
Array |
数组,固定长度、固定类型 |
ArrayList |
列表,可变长度、任意类型 |
List<T> |
列表,可变长度、固定类型 |
Dictionary<T> |
字典,键值对结构 |
Queue<T> |
队列,先进先出(FIFO)集合 |
Stack<T> |
栈,后进先出(LIFO)集合 |
IEnumerable<T> |
可迭代集合 |
C#集合的特点
- [ 可以储存无限个元素(除了数组) ]
- [ 任何一个集合都支持搜索、排序、复制、添加 、删除等操作 ]
二、数组
特点
1.固定长度
2.有明确顺序
使用数组是十分安全的,不会返回任何不存在的数据
例如:
class Program
{
static void Main(string[] args)
{
string[] daysOfWeek =
{
"Monday",
"Tuesday",
"Wednesday",
"Thuresday",
"Friday",
"Saturday",
"Sunday"
};
foreach (string day in daysOfWeek)
{
Console.WriteLine(day);
}
//零索引 0-indexed
Console.WriteLine(daysOfWeek[0]);//周一
Console.WriteLine(daysOfWeek[1]);//周二
//固定长度
string[] monthsOfYear = new string[12];
monthsOfYear[0] = "January";
monthsOfYear[1] = "February";
monthsOfYear[2] = "March";
monthsOfYear[3] = "April";
monthsOfYear[4] = "May";
monthsOfYear[5] = "June";
monthsOfYear[6] = "July";
monthsOfYear[7] = "August";
monthsOfYear[8] = "September";
monthsOfYear[9] = "October";
monthsOfYear[10] = "November";
monthsOfYear[11] = "December";
Console.Read();
}
}
三、列表与数组列表
1.List
在底层实现中,list依然使用数组承载数据,不过在数组装满数据以后,list会立刻创建新的数组来代替旧的数组,并且把所有数据复制装载到新的数组中,因此列表又可以成为动态数组。列表的容量不仅可以动态调整,也可以手动调整,对系统的动态调优取得很大帮助。
数组的访问速度略高于列表,但是列表对于空间的利用优于数组。
//List 列表
List<string> daysOfWeek2 = new List<string>();
daysOfWeek2.Add("Monday");
daysOfWeek2.Add("Tuesday");
daysOfWeek2.Add("Wednesday");
daysOfWeek2.Add("Thuresday");
daysOfWeek2.Add("Friday");
daysOfWeek2.Add("Saturday");
daysOfWeek2.Add("Sunday");
//只需要在前面加上I就可以声明接口的列表
IList<string> daysOfWeek3 = new List<string>();
2.ArrayList
List支持泛型,ArrayList不支持泛型,仅能保存对象
ArrayList装载数据很方便,但是提取数据较为麻烦,需要进行拆箱,影响性能
//ArrayList
var array = new ArrayList();
array.Add(daysOfWeek);
array.Add("123");
array.Add(1);
3.List的基本操作
List的有参数构造器
//List的有参数构造器
var daysOfWeek4 = new List<string>(daysOfWeek);//数组
var daysOfWeek5 = new List<string>(daysOfWeek2);//列表
var daysOfWeek6 = new List<string>(7);
List<string> daysOfWeek7 = new List<string>
{
"Monday",
"Tuesday",
"Wednesday",
"Thuresday",
"Friday",
"Saturday",
"Sunday"
};
列表的插入数据,可以使用Insert或者InsertRange
//列表插入,Insert,InsertRange
daysOfWeek7.InsertRange(2, daysOfWeek);//将daysOfWeek插入到第二个位置后
如果要将列表7插入到列表6的最前面
daysOfWeek6.InsertRange(0, daysOfWeek7);
但是更推荐
daysOfWeek7.AddRange(daysOfWeek6);
因为使用Insert操作,会自动将原来的列表分成两个列表,在进行插入操作,影响性能。
删除数据
//删除数据,RemoveAt, RemoveRange
daysOfWeek7.RemoveAt(0);
daysOfWeek7.RemoveRange(2, 6);
daysOfWeek7.Remove("Monday"); //只删除遍历到的第一个数据
daysOfWeek7.RemoveAll(i => i == "Monday");//删除遍历到的所有的Monday
daysOfWeek7.RemoveAll(i => i.Contains("day"));//删除所有包含day的数据
四、迭代器Enumerator与循环遍历ForEach
读取列表
//读取列表
var a = daysOfWeek6.Count;//读取数据个数
var b = daysOfWeek6.Capacity;//读取列表容量
索引器,方括号就是索引器,准确查找位置
//索引器,方括号就是索引器,准确查找位置
var c = daysOfWeek6[3];
迭代器,将集合按照一定规律全部访问一遍
var enumerator = daysOfWeek6