1 using System;
2 using System.Collections;
3 using System.Collections.Generic;
4 using System.Linq;
5 using System.Text;
6 using System.Threading.Tasks;
7
8 namespace ConsoleDemo.List
9 {
10
11 /// <summary>
12 /// 基础回顾:集合:
13 /// 1:线性结构 一对一关系
14 /// 2:树形结构 一对多
15 /// 3:图状结构 多对多
16 /// </summary>
17 public class ListDemo
18 {
19 public static void Get()
20 {
21 #region 线性结构
22 {
23
24 {
25 /*
26 线性结构1:\
27 缺陷: 长度要指定,同理string[]
28 优点:内存连续存储 节约空间,可以索引访问,读取速度快,增删慢
29 */
30 int[] list = new int[10];
31 list[0] = 5;
32 list[1] = 2;
33 list[2] = 0;
34
35 }
36 {
37 /*
38 线性结构1:\
39 缺陷: 将 int[],string[]转化为泛型,装箱拆箱增加性能损耗
40 优点:内存连续存储 节约空间,可以索引访问,读取速度快,增删慢
41 */
42 ArrayList list = new ArrayList();
43 list.Add("sun");
44 list.Add("say");
45 list.Add("hello");
46 list.Add(DateTime.Now);
47 }
48 }
49 #endregion
50
51 #region 链表结构
52 {
53 /*
54 链表结构
55 单链表,双向链表,循环链表
56 存储格式:数据+地址
57 缺点:读取慢,增加了存储空间
58 优点:增删快
59 */
60 List<string> list = new List<string>();//使用泛型过程中制定了格式
61 list.Add("hello");
62 list.Add("shang hai");
63 }
64
65 {
66 //先进先出
67 Queue<string> list = new Queue<string>();
68 list.Enqueue("are"); //入队
69 list.Enqueue("you");
70 list.Enqueue("ok");
71
72 Console.WriteLine(string.Join(",", list)); //are,you,ok
73
74 list.Dequeue(); //出队
75 Console.WriteLine(string.Join(",", list)); //you,ok
76
77 //获取队列头部元素,不做移除动作
78 string value = list.Peek();//you
79 Console.WriteLine(value);
80
81 string value1 = list.Peek();//you
82 Console.WriteLine(value1);
83 }
84 {
85 //栈
86 Stack<string> list = new Stack<string>();
87 list.Push("易烊千玺");
88 list.Push("崇拜");
89 list.Push("我");
90 Console.WriteLine(string.Join(",", list)); //我,崇拜,易烊千玺
91
92 list.Pop();
93 Console.WriteLine(string.Join(",", list)); //崇拜,易烊千玺
94
95 string value = list.Peek();
96 Console.WriteLine(value); //崇拜
97
98 //支持重复
99 list.Push("崇拜");
100 Console.WriteLine(string.Join(",", list)); //崇拜,崇拜,易烊千玺
101
102 }
103
104 {
105 //排重,唯一性,IP投票 统计用户id等
106 HashSet<string> list = new HashSet<string>();
107 list.Add("啊");
108 list.Add("啊");
109 list.Add("啊");
110 list.Add("我看到明星了!");
111 //HashSet:啊,我看到明星了! 长度:2
112 Console.WriteLine("HashSet:" + string.Join(",", list) + " 长度:" + list.Count);
113
114 }
115 {
116 //排重,唯一性,IP投票 统计用户id等
117 SortedSet<string> list = new SortedSet<string>();
118 list.Add("啊");
119 list.Add("啊");
120 list.Add("啊");
121 list.Add("我看到明星了!");
122
123 //SortedSet: 啊,我看到明星了! 长度: 2
124 Console.WriteLine("SortedSet:" + string.Join(",", list) + " 长度:" + list.Count);
125 }
126 {
127 //自动排序
128 SortedSet<int> list = new SortedSet<int>();
129 list.Add(11);
130 list.Add(11);
131 list.Add(9);
132 list.Add(20);
133
134 //SortedSet:我期待的结果是自动排序了:9,11,20 长度: 3
135 Console.WriteLine("SortedSet:我期待的结果是自动排序了:" + string.Join(",", list) + " 长度:" + list.Count);
136 }
137 {
138 //增删都快的,用空间换性能
139 Hashtable list = new Hashtable();
140
141 list.Add("name", "sun");
142 list.Add("age", 18);
143 //list.Add("age", 19);//新增相同key会报错
144
145 Console.WriteLine(string.Join(",", list.Keys.Count)); //2
146
147 list.Remove("age");
148 Console.WriteLine(string.Join(",", list.Keys.Count));//1
149
150 bool IsExistName = list.Contains("name");
151 bool IsExistNa = list.Contains("na");
152 //True-False
153 Console.WriteLine(IsExistName + "-" + IsExistNa);
154 }
155 #endregion
156
157
158 {
159 //IEnumerable 使用的时候linq to object方式
160
161 Console.WriteLine("_________________________");
162 MyColor colors = new MyColor();
163 foreach (string c in colors)
164 {
165 Console.WriteLine("color is : " + c);
166 }
167
168 //ABC[] list = new ABC[10];
169 //list.Add
170 //foreach(var a in list)
171 //{
172 // Console.WriteLine("ABC is :"+ a.Name);
173 //}
174
175
176 int[] myArray = { 1, 32, 43, 343 };
177 IEnumerator myie = myArray.GetEnumerator();
178 myie.Reset();
179 while (myie.MoveNext())
180 {
181 int i = (int)myie.Current;
182 Console.WriteLine("Value: {0}", i);
183 }
184
185
186 /*
187
188
189 延时执行: IQueryable,IEnumberalb 为延时执行(用到的时候再查),IList一次性加载
190 顺时执行: IList一次性查询后加载到内存
191 IQueryable接口与IEnumberable接口的区别:
192 IEnumerable<T> 泛型类在调用自己的SKip 和 Take 等扩展方法之前数据就已经加载在本地内存里了,
193 IQueryable<T> 是将Skip ,take 这些方法表达式翻译成T-SQL语句之后再向SQL服务器发送命令,
194 它并不是把所有数据都加载到内存里来才进行条件过滤。
195
196
197 */
198
199
200 //IQueryable 生成sql 采用表达式目录树,二叉树查找
201 //IQeurable(IQuerable<T>):不在内存加载持久数据,因为这家伙只是在组装SQL,(延迟执行) 到你要使用的时候,
202 //例如 list.Tolist() or list.Count()的时候,数据才从数据库进行加载(AsQueryable())。
203 //IQueryable<CustomData> list2 = dbcontext.CustomDataList.Where(t => t.PrimaryDataID == "123");
204
205 //IEnumberalb,使用的是LINQ to Object方式 内置委托,它会将AsEnumerable()时对应的所有记录都先加载到内存
206 //,然后在此基础上再执行后来的Query
207 //IEnumerable<CustomData> list2 = dbcontext.CustomDataList.Where(t => t.PrimaryDataID == "123").AsEnumerable();
208
209
210 // IList<CustomData> list2 = dbcontext.CustomDataList.Where(t => t.PrimaryDataID == "123").ToList();
211
212
213
214 //List:IList:ICollection:IEnumberable
215 Console.WriteLine("_________________________");
216 }
217 }
218 }
219 public class ABC
220 {
221 public string Name { get; set; }
222 }
223
224 /// <summary>
225 /// 实现了IEnumberable接口也可以
226 /// </summary>
227 public class MyColor : IEnumerable
228 {
229 string[] colors = { "red", "white", "black", "yellow" };
230 public IEnumerator GetEnumerator()
231 {
232 // throw new NotImplementedException();
233 return colors.GetEnumerator();
234 }
235 }
236 }