引入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);
}
}