参考地址:https://blog.csdn.net/qiaoquan3/article/details/51380992
1、集合set:纯粹的数据集合
2、线性结构:一对一的,数组
3、树形结构:一对多的,菜单/文件夹/类别/属性控件/表达式目录树
4、图形/网状结构:多对多,地图应用比较多,网站的应用比较少
线性结构:
Array/ArrayList/List/LinkedList/Queue/Stack/HastSet/SortedSet/Hashtable/SortedList/Dictionary/SortedDictionary
IEnumerable、ICollection、IList、IQueryable
接口是标机功能的,不同的接口岔开,就是为了接口隔离;虽然我们接口内容也可以复用。
IEnumerable任何数据集合,都实现了的,为不同的数据结构,提供了统一数据访问方式,这个就是迭代器模式。
1、内存连续存储,节约空间,可以索引访问,读取速度快,增删慢
Array:在内存上连续分配的,而且元素类型是一样的。
int[] intArray = new int[3]; intArray[0] = 123; string[] stringArray = new string[] { "123", "234" };//Array
ArrayList:不定长的,连续分配的;元素没有类型限制,任何元素都是当成object处理,如果是值类型,会有装箱操作;读取快,增删慢。
ArrayList arrayList = new ArrayList(); arrayList.Add("Bingle1"); arrayList.Add("Bingle2"); arrayList.Add(32);//add增加长度 //arrayList[4] = 26;//索引复制,不会增加长度 //删除数据 //arrayList.RemoveAt(4); var value = arrayList[2]; arrayList.RemoveAt(0); arrayList.Remove("Bingle2");
List<T>:也是Array,内存上都是连续拜访的;不定长;泛型,保证类型安全,避免装箱拆箱;读取快,增删慢。
List<int> intList = new List<int>() { 1, 2, 3, 4 }; intList.Add(123); intList.Add(123); //intList.Add("123"); //intList[0] = 123; List<string> stringList = new List<string>(); //stringList[0] = "123";//异常的 foreach (var item in intList) { }
2、非连续拜访的,存储数据+地址,找书的话就只能顺序查找,读取就比较慢,增删快
LinkedList<T>:泛型的特点;链表,元素不连续分配,每个元素都有记录前后节点;节点值可以重复。能不能下标访问?不能的,找元素就只能遍历,查找不方便,增删就比较方便。
LinkedList<int> linkedList = new LinkedList<int>(); //linkedList[3] linkedList.AddFirst(123); linkedList.AddLast(456); bool isContain = linkedList.Contains(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();
Queue:就是链表,先进先出,放任务延迟执行,A不断写入日志任务,B不断获取任务去执行
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 '{numbers.Dequeue()}'"); Console.WriteLine($"Peek at next item to dequeue: { numbers.Peek()}"); Console.WriteLine($"Dequeuing '{numbers.Dequeue()}'"); Queue<string> queueCopy = new Queue<string>(numbers.ToArray()); foreach (string number in queueCopy) { Console.WriteLine(number); } Console.WriteLine($"queueCopy.Contains(\"four\") = {queueCopy.Contains("four")}"); queueCopy.Clear(); Console.WriteLine($"queueCopy.Count = {queueCopy.Count}");
Stack:就是链表,先进后出,解析表达式目录树的时候,先产生的数据后使用。操作记录为命令,撤销的时候是倒叙的。
Stack<string> numbers = new Stack<string>(); numbers.Push("one"); numbe