命名空间:System.Collections.Generic
1-1 Array
◇数组特点:是最简单的数据结构。创建一个新的数组时将在 CLR 托管堆中分配一块连续的内存空间,来盛放数量为size,类型为所声明类型的数组元素。如果类型为值类型,则将会有size个未装箱的该类型的值被创建。如果类型为引用类型,则将会有size个相应类型的引用被创建。
1、数组存储在连续的内存上。
2、数组的内容都是相同类型。
3、数组可以直接通过下标访问
//创建数组:
int test= new int[x]; // x为任意正整数,表示数组的容量;
//赋值数组:
test[0] = "chen";
test[1] = "j";
test[2] = "d";
//修改数组:
test[0] = "chenjd"; ◇数组优点:由于是在连续内存上存储的,所以它的索引速度非常快,访问一个元素的时间是恒定的也就是说与数组的元素数量无关,而且赋值与修改元素也很简单。
◇数组缺点:由于是连续存储,所以在两个元素之间插入新的元素就变得不方便。而且就像上面的代码所显示的那样,声明一个新的数组时,必须指定其长度,这就会存在一个潜在的问题,那就是当我们声明的长度过长时,显然会浪费内存,当我们声明长度过短的时候,则面临这溢出的风险。
1-2 ArrayList
为了解决数组创建时必须指定长度以及只能存放相同类型的缺点而推出的数据结构。ArrayList是System.Collections命名空间下的一部分,所以若要使用则必须引入System.Collections。正如上文所说,ArrayList解决了数组的一些缺点。
◇不必在声明ArrayList时指定它的长度,这是由于ArrayList对象的长度是按照其中存储的数据来动态增长与缩减的。
◇ArrayList可以存储不同类型的元素。这是由于ArrayList会把它的元素都当做Object来处理。因而,加入不同类型的元素是允许的。
ArrayList的操作:
1 //实例化
2 ArrayList test = new ArrayList();
3 //添加元素
4 test.Add("hehe");
5 test.Add(23);
6 //修改数据
7 test[1]=26
8 //删除数据
9 test.RemoveAt(1);说了那么一堆”优点“,也该说说缺点了吧。为什么要给”优点”打上引号呢?那是因为ArrayList可以存储不同类型数据的原因是由于把所有的类型都当做Object来做处理,也就是说ArrayList的元素其实都是Object类型的,辣么问题就来了。
◇ArrayList不是类型安全的。因为把不同的类型都当做Object来做处理,很有可能会在使用ArrayList时发生类型不匹配的情况。
◇如上文所诉,数组存储值类型时并未发生装箱,但是ArrayList由于把所有类型都当做了Object,所以不可避免的当插入值类型时会发生装箱操作,在索引取值时会发生拆箱操作。这能忍吗?
注:为何说频繁的没有必要的装箱和拆箱不能忍呢?且听小匹夫慢慢道来:所谓装箱 (boxing):就是值类型实例到对象的转换(百度百科)。那么拆箱:就是将引用类型转换为值类型咯(还是来自百度百科)。
1-3 List<T>泛型List
1-3-1 优势:
◇在决定使用IList<T> 还是使用ArrayList类(两者具有类似的功能)时,记住IList<T> 类在大多数情况下执行得更好并且是类型安全的。
◇如果对IList<T> 类的类型 T 使用引用类型,则两个类的行为是完全相同的。但是,如果对类型 T 使用值类型,则需要考虑实现和装箱问题。
1-3-2 操作:
//T为列表中元素类型
List<T> List = new List<T>();
//当T为string时,举例:
string[] nameArr = { "Ha", "Hunter", "Tom", "Lily", "Jay", "Jim", "Kuku", "Locu" };
List<string> list = new List<string>(nameArr);
//添加一个元素
list. Add("lucy");
//添加一组元素
string[] temArr = { "Ha","Hunter", "Tom", "Lily", "Jay", "Jim", "Kuku", "Locu" };
list.AddRange(temArr);
//插入元素
list.Insert(1, "Hei");
//遍历元素(foreach)
foreach (string name in list)
{
Console.WriteLine(name);
}
//删除、清空元素
//删除一个值
list.Remove("Hunter");
//删除下标为index的元素
list.RemoveAt(0);
//从下标3开始,删除2个元素
list.RemoveRange(3, 2);
//清空元素
list.Clear();
//Contains(是否包含某个元素)
bool blog = list.Contains("Hunter");
//排序Sort,倒序Reverse
复制代码
//默认是元素第一个字母按升序
list.Sort();
//将List里面元素顺序反转
list.Reverse();
//从第二个元素开始,反转4个元素
//结果list里最后的顺序变成"Ha", "Jay", "Lily", "Tom", "Hunter", "Jim", "Kuku", "Locu"
list.Reverse(1,4);
1-4 LinkedList<T>
概念:是一个可以存放不同类型且长度可以变的数据集合。在内存中元素不连续分配,每个元素都有记录前后节点位置信息。

优点:链表式存放,增删数据快。
操作:
LinkedList<int> linkedList = new LinkedList<int>();
//linkedList[3]//会报错
linkedList.AddFirst(123);//在链表头部添加节点
linkedList.AddLast(456);//在链表尾部添加节点
bool isContain = linkedList.Contains(123);//查找123是否存在
LinkedListNode<int> node123 = linkedList.Find(123); //查找指定的节点元素,元素123的位置 从头查找
linkedList.AddBefore(node123, 123);
linkedList.AddBefore(node123, 123);//在指定的节点前添加元素
linkedList.AddAfter(node123, 9);//在指定的节点后添加元素
linkedList.Remove(456);//移除指定元素(如果有重复移除第一个)
linkedList.Remove(node123);//移除指定的节点
linkedList.RemoveFirst();//移除头部节点
linkedList.RemoveLast();//移除结尾节点
linkedList.Clear();1-5 Queue<T>
特点:在Queue<T>这种数据结构中,最先插入在元素将是最先被删除;反之最后插入的元素将最后被删除,因此队列又称为“先进先出”(FIFO—first in first out)的线性表,可以存放任何类型且长度可变的数据集合。链表形式储存,无序摆放,类型安全。通过使用Enqueue和Dequeue这两个方法来实现对 Queue<T> 的存取。
操作:
Queue<string> numbers = new Queue<string>();
numbers.Enqueue("one");//放入数据
numbers.Enqueue("two");
numbers.Enqueue("three");
numbers.Enqueue("four");
numbers.Enqueue("four");//可以放入重复数据
numbers.Enqueue("five");
foreach (string number in numbers)
{
Console.WriteLine(number);
}
Console.WriteLine("Dequeuing '{0}'", numbers.Dequeue());//获取并移除数据
Console.WriteLine("Peek at next item to dequeue: {0}", numbers.Peek());//获取最头部的数据,不移除
Queue<string> queueCopy = new Queue<string>(numbers.ToArray());//将数组放入队列中
foreach (string number in queueCopy)
{
Console.WriteLine(number);
}
Console.WriteLine("queueCopy.Contains(\"four\") = {0}", queueCopy.Contains("four"));
queueCopy.Clear();//清空队列
Console.WriteLine("queueCopy.Count = {0}", queueCopy.Count);
1-6 Stack<T>
特点:可以储存任何类型且长度可变的数据集合。链表形式,先进后出,类型安全。
操作:
Stack<string> numbers = new Stack<string>();
numbers.Push("one");//取出的最后一个数据
numbers.Push("two");
numbers.Push("three");
numbers.Push("four");
numbers.Push("five");//取出的第一个数据
//只能循环遍历取出
foreach (string number in numbers)
{
Console.WriteLine(number);
}
numbers.Pop();//获取并移除
numbers.Peek();//获取不移除
Stack<string> stackCopy = new Stack<string>(numbers.ToArray());//可以存数组形式数据
foreach (string number in stackCopy)
{
Console.WriteLine(number);
}
stackCopy.Contains("four");//是否存在
stackCopy.Clear();//清空
stackCopy.Count;//数量1-7 泛型字典Dictionary<T>
特点:通过健值来保存元素的,并具有泛型的全部特征。 Dictionary集合是一组键(key)到一组值(value)的映射,每一个添加项都是由一个值及其相关联的键组成的。Key和Value可以为任何类型,键必须唯一且不能为null(空引用),值若为引用类型,可以为空值。通过键可以访问值。
使用:
Dictionary<string, object> myDic = new Dictionary<string, object>();
myDic.Add("aaa", 111);
myDic.Add("bbb", 222);
myDic.Add("ccc", "呵呵);
myDic.Add("ddd", "helloworld");
返回 .Net数据结构