引入StringBuilder的概念
static void Main(string[] args) { Stopwatch sw = new Stopwatch(); string ret = string.Empty; StringBuilder sb = new StringBuilder(); sw.Start(); for (int i = 0; i < 100000000; i++) { //ret += i; sb.Append(i); } sw.Stop(); Console.WriteLine("总时间是:{0}",sw.Elapsed); //Console.WriteLine(ret); }
集合四大功能,增 删 改 查 .
在前面的章节中讲解过数组可以保存多个对象,但在某些情况下无法确定到底需要保存多少个对象,由于数组的长度不可变,因此数组将不再适用。例如要保存一个学校的学生信息,由于不停有新生来报到,同时也有学生离开学校,这时学生的数目很难确定。为了保存这些数目不确定的对象,C#中提供了一系列特殊的类,这些类可以存储任意类型的对象,并且长度可变,它们统称为集合。 C#中集合可分为泛型集合和非泛型集合,二者均间接实现了 IEnumerable 接口。泛型集合位于 System.Collections.Generic 命名空间,它只能存储同一种类型的对象,其中最常用的是List泛型集合和Dictionary泛型集合。非泛型集合位于System.Collections命名空间,它可以存储多种类型的对象,其中最常用的是ArrayList集合和Hashtable集合。
非泛型:弱类型
支持接受一切类型的元素,但遍历操作的时候会涉及到类型的转换,可能会异常.中间涉及拆装箱操作也比较耗时.
Arraylist
ArrayList list = new ArrayList(); //获取集合元素的数量 Console.WriteLine(list.Capacity); Console.WriteLine(list.Count); //向集合中添加数据 list.Add(2); Console.WriteLine(list.Count); Console.WriteLine(list.Capacity); list.Add(3); list.Add(8); list.Add(5); list.Add(6); list.Add(7);
Console.WriteLine(list.Capacity); list.Add(new Student()); list.AddRange(list); bool ret = list.Contains(100); Console.WriteLine(ret); ArrayList arraylist = list.GetRange(1, 3); 从list集合里提取元素组成新集合 从下标为1元素开始提取,提取三个元素 3 4 5//IEnumerator GetEnumerator(int index, int count); foreach 是对集合做修改 遍历操作 禁止对foreach做删除操作 foreach (var item in arraylist) { Console.WriteLine(item); } int index = list.IndexOf(4); 找出集合里元素所对应的索引 Console.WriteLine(index); list.Insert(1, 100); 从索引为1的位置插入100; list.Remove(100); 把集合中为100的元素删除 list.RemoveAt(1); 把索引为1的元素从集合删除 list.Reverse(); //将集合进行反转 list.Sort(); list.Reverse(); 升序排序 Console.WriteLine("----------"); foreach (var item in list) { Console.WriteLine(item);
Hashtable
//在 Hashtable 这样的集合中 存储的顺序是乱序的 Hashtable ht = new Hashtable(); ht.Add("北京","重度雾霾"); ht.Add("上海", "梅雨"); ht.Add("郑州","霾"); Console.WriteLine(ht["北京"]); ht["石家庄"] = "123"; bool ret = ht.Contains("石家庄"); Console.WriteLine(ret); //ht.Remove("郑州"); ret = ht.Contains("郑州"); Console.WriteLine(ret); foreach (var item in ht.Keys) { Console.WriteLine(item +" "+ht[item]); }
Add,添加元素到集合,
Clear.清除所有元素.
Contains(object key).判断是否包含指定的键(键是唯一的),
ContainsVaiue(object value)判断是否包含指定的值(值不是唯一的),
Remove.(object key)移除指定的键和其匹配的值,
StringBuilder
static void Main(string[] args) { StringBuilder sb = new StringBuilder();; Console.WriteLine(sb.Capacity); sb.Append("12"); sb.Append(12); sb.Append(new Student()); sb.AppendFormat("{0}***{1}***{2}", 12, 13, 45); sb.Insert(0, "YY"); sb.Remove(0, 2); sb.Replace("1991", "1998"); sb.Replace("19", "2000", 4, 4); Console.WriteLine(sb.GetHashCode()); Console.WriteLine(sb.Capacity); Console.WriteLine(sb.Append(sb)); Console.WriteLine(sb); }
Append()添加一切元素,
AppendFormat()添加一个Format类型元素,
Insert(index,valua)将元素插入到指定的索引,
Remove(index,value)将指定索引的元素移除,
Replace(object,object)将元素1替换成元素2,
Replace(1234)要替换的字符串,替换的字符串或空,此示例中子字符串开始的位置,子字符串的长度.
泛型:强类型,支持编辑时的检查,只接受一种类型的元素例如<int>.
List<>
static void Test01() { //ArrayList list = new ArrayList(); Add方法的参数类型是object类型 在传递参数的时候整型1会转化成object类型 这样属于装箱操作 //list.Add(1); 如果实现 list[0] + 2 得到正确的结果 要将list[0]转化成int类型 也就是说要进行拆箱操作 //Console.WriteLine((int)list[0] + 2); //泛型结合在声明的时候已经确定了里面的元素类型 List<string> list = new List<string>(); //里面的传入的数据类型只能和声明时定义的类型保持一致 //泛型能在编译时,提供强大的类型检查,减少数据类型之间的显示转化、装箱操作和运行时的类型检查。 list.Add("C#编程之道"); list.Add("C#从入门到精通"); list.AddRange(list); Console.WriteLine(list.Count); bool ret = list.Contains("C#编程之道"); Console.WriteLine(ret); int index = list.IndexOf("C#从入门到精通"); Console.WriteLine(index); //从0开始查找,找到元素的下标 index = list.IndexOf("C#从入门到精通", 2); //2从第二个元素开始查找; Console.WriteLine(index); List<int> numList = new List<int>(); numList.Add(1); numList.Add(2); numList.Add(5); numList.Add(1); numList.Add(2); numList.Add(2); numList.Add(4); List<int> newList = numList.GetRange(0, numList.Count); //numList.GetRange得到numList的浅源副本,可以理解为把原来的集合赋到新的集合,原来的集合不变 //0代表从下标为0的开始 index = -1; //记录查找元素的数量 int count = 0; while (newList.IndexOf(2) != -1) { index = newList.IndexOf(2); count++; newList.RemoveAt(index); } Console.WriteLine(count); //Console.WriteLine("-------------------------"); //foreach (var item in numList) //{ // Console.WriteLine(item); //} } }
Add.添加,
AddRange.将指定元素添加到末尾,
Contains.判断是否包含某元素,
IndexOf(object,index)从指定索引开始寻找并返回找到的第一个索引,否则返回-1,
GetRange(index,count)从索引开始复制count数量的元素到一个子类中.次方法一般用于辅助之后进行操作防止元数据被更改.
RemovrAt(index)移除制定所引出的元素
Dictionary
static void Test01() { Dictionary<string, string> dic = new Dictionary<string, string>(); dic.Add("张杰", "高飞"); dic.Add("刘欢", "好汉歌"); //在一个字典中 键是唯一的 //在一个字典中不同的键可以对应相同的值 dic.Add("周杰伦", "青花瓷"); dic.Add("刘英", "青花瓷"); bool key = dic.ContainsKey("周杰伦"); Console.WriteLine(key); bool value = dic.ContainsValue("好汉歌"); Console.WriteLine(value); KeyCollection keys = dic.Keys; //dic.Remove("刘英"); foreach (var item in keys) { Console.WriteLine(item); } } static void Test02() { Dictionary<string, Book> books = new Dictionary<string, Book>(); books.Add("0000000",new Book("C#编程之道",56,"xx")); books.Add("0000001", new Book("C#从入门到精通", 98, "yy")); books.Add("0000002", new Book("C#从入门到放弃", 2, "zz")); foreach (var item in books) { Console.WriteLine(item.Key +" " + item.Value.Price); } static void Test03() { SortedDictionary<string, string> dic = new SortedDictionary<string, string>(); dic.Add("张杰", "高飞"); dic.Add("刘欢", "好汉歌"); //在一个字典中 键是唯一的 //在一个字典中不同的键可以对应相同的值 dic.Add("周杰伦", "青花瓷"); dic.Add("刘英", "青花瓷"); dic.Add("asdef", "青花瓷"); dic.Add("asdeh", "青花瓷"); bool key = dic.ContainsKey("周杰伦"); Console.WriteLine(key); bool value = dic.ContainsValue("好汉歌"); Console.WriteLine(value); foreach (KeyValuePair<string,string> item in dic) { //这里是已经排序排好了的 Console.WriteLine(item.Key); } } HashSet:不能添加相同的元素,会默认删除.
static void Main(string[] args) { HashSet<int> hs = new HashSet<int>(); //不可以有相同元素 //hs.Add(1); //Console.WriteLine(hs.Count); //hs.Add(2); //Console.WriteLine(hs.Count); //hs.Add(1); //Console.WriteLine(hs.Count); Random random = new Random(); while (hs.Count < 100) { hs.Add(random.Next(1, 101)); } foreach (var item in hs) { Console.WriteLine(item); } 栈
void Test() { Queue queue = new Queue(); //EnterQueue 入队 queue.Enqueue(1); queue.Enqueue(2); queue.Enqueue(3); //DeleteQueue queue.Dequeue(); //peek 不影响队列中的元素的 object obj = queue.Peek(); Console.WriteLine(obj + " ++++"); foreach (var item in queue) { Console.WriteLine(item); } } class Program { static void Main(string[] args) { Console.WriteLine(Test02(30, 26)); } static void Test() { //FILO first in last out Stack stack = new Stack(); //将数据压入到栈 stack.Push(1); stack.Push(2); stack.Push(3); //Console.WriteLine(stack.Count); //弹出栈顶数据 就是删除栈顶元素 stack.Pop(); //获取栈顶元素 object numberObj = stack.Peek(); Console.WriteLine(numberObj); foreach (var item in stack) { Console.WriteLine(item); } } static string Test02(int number,int baseNumber) { Stack<char> statck = new Stack<char>(); while (number/baseNumber !=0) { statck.Push( (char)(number % baseNumber +'a')); number /= baseNumber; } statck.Push((char)(number + 'a')); return new string(statck.ToArray()); } 队列 void Test() { Queue queue = new Queue(); //EnterQueue 入队 queue.Enqueue(1); queue.Enqueue(2); queue.Enqueue(3); //DeleteQueue queue.Dequeue(); //peek 不影响队列中的元素的 object obj = queue.Peek(); Console.WriteLine(obj + " ++++"); foreach (var item in queue) { Console.WriteLine(item); } }