集合
非泛型集合
为了保存数目不确定的对象,C#中提供了一系列特殊的类,这些类可以存储任意类型的对象,并且长度可变,它们统称为集合。
C#中集合可分为泛型集合和非泛型集合,二者均间接实现了 IEnumerable 接口。泛型集合位于 System.Collections.Generic 命名空间,它只能存储同一种类型的对象,其中最常用的是List泛型集合和Dictionary泛型集合。非泛型集合位于System.Collections命名空间,它可以存储多种类型的对象,其中最常用的是ArrayList集合和Hashtable集合。
ArrayListDemo
ArrayList 集合就像是一个杂货铺,它可以容纳不同类型的对象。例如可以将 int、string、object等类型的对象同时加入到ArrayList集合中。ArrayList集合提供了一系列方法
ArrayList list = new ArrayList();
获取集合元素的数量
Console.WriteLine(list.Count);
Add方法向集合中添加数据
list.Add(2);
list.Add(3);
list.Add(4);
获取集合的容量,容量由0-4-8-12-16的方式随元素数量的增加而提高
Console.WriteLine(list.Capacity);
AddRange用来使括号中的所有元素添加到现集合的末尾
list.AddRange(list);
Contains用来判断元素X是否在集合中
bool ret = list.Contains(100);
GetRange获得一个新的集合,为样本集合下标X开始复制共Y个元素的集合。
ArrayList arraylist = list.GetRange(1, 3);
IndexOf用来判断(1)括号中元素于所在集合中的下标
int index = list.IndexOf(4);
(2)从下标处开始判断某个元素是在下标几对应的元素
int index = list.IndexOf("C#从入门到精通",1);
Insert插入方法,在下标为X的方位插入需要的元素
list.Insert(1,100);
RemoveAt用来移除下标X处的元素
list.RemoveAt(1);
Reverse用来将整个集合中的元素反转操作
list.Reverse();
Sort用来将整个集合的元素正序排序
list.Sort();
HashtableDemo
C#中提供了一个 Hashtable 集合,该集合又被称为键值对集合。所谓的键就类似于字典中的目录,值就类似于字典中的具体信息,键与值是一一对应关系,通过唯一的键能找到对应的一个值。因此,Hashtable 的这种特性大大提高了查询效率。
在Hashtable这样的集合中存储的顺序是乱序的
Hashtable ht = new Hashtable();
ht.Add("北京","重度雾霾");
ht.Add("上海", "梅雨");
ht.Add("郑州","霾");
Console.WriteLine(ht["北京"]);
Contains用来判断集合中是否包含特定键
bool ret = ht.Contains("石家庄");
Remove移除带有指定键的元素
ht.Remove("郑州");
void Clear ***清除集合中的所有元素***
通过foreach循环对集合键遍历输出集合的所有键与其对应的元素
foreach循环 是对集合做修改 遍历操作 禁止对foreach做删除操作
foreach (var item in ht.Keys)
{
Console.WriteLine(item +" "+ht[item]);
}
泛型集合
List泛型集合
在C#中,提供了一个List泛型集合,该集合不仅具备ArrayList集合的功能,而且还可以保证List集合只能添加同类型元素,不会出现类型转换的问题
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>();
GetRange用来截取由下标X开始共Y个元素为一个新集合
List<int> newList = numList.GetRange(2, 3);
记录查找元素的数量
int count = 0;
while (newList.IndexOf(2) != -1)
{
index = newList.IndexOf(2);
count++;
***由于此步操作需要删除集合中的元素,所以通常复制一个新集合进行操作***
newList.RemoveAt(index);
}
Console.WriteLine(count);
Dictionary泛型集合
Hashtable集合中的键与值在默认情况下都是object类型,这使得用户在取值时不可避免地遇到类型转换的问题。为了解决这个问题, C#中提供了Dictionary泛型集合。该集合中的键与值都只能是一种类型。
Dictionary<string, string> dic = new Dictionary<string, string>();
在一个字典中 键是唯一的
在一个字典中不同的键可以对应相同的值
dic.Add("张杰", "高飞");
dic.Add("刘欢", "好汉歌");
dic.Add("周杰伦", "青花瓷");
dic.Add("刘英", "青花瓷");
ContainsKey判断是否包含特定的键
bool key = dic.ContainsKey("周杰伦");
ContainsValue判断是否包含特定的元素
bool value = dic.ContainsValue("好汉歌");
dic.Keys获取键的集合
KeyCollection keys = dic.Keys;
字典集合中对象的有效使用案例
Dictionary<string, Book> books = new Dictionary<string, Book>(); books.Add("0000000",new Book("C#编程之道",56,"王垚"));
books.Add("0000001", new Book("C#从入门到精通", 98, "YY"));
books.Add("0000002", new Book("C#从入门到放弃", 2, "亚东"));
对整个字典集合的遍历的两种方法
foreach (var item in dic)
{
Console.WriteLine(item);
}
foreach (KeyValuePair<string,string> item in dic)
{
Console.WriteLine(item.Key);
}
SortedDictionary表示对字典集合根据键进行排序
SortedDictionary<string, string> dic = new SortedDictionary<string, string>();
HashSet泛型集合
HashSet的特点是集合中的元素不会相同,此特性在生成1-100的随机数案例中得以有效体现,根据集合特性,100个数直接随机输出。
HashSet<int> hs = new HashSet<int>();
Random random = new Random();
while (hs.Count < 100)
{
hs.Add(random.Next(1, 101));
}
foreach (var item in hs)
{
Console.WriteLine(item);
}
栈
栈的特点是先进后出(就像子弹)
Stack stack = new Stack();
将数据压入到栈
stack.Push(1);
stack.Push(2);
stack.Push(3);
Pop用来弹出栈顶数据,就是删除栈顶元素
stack.Pop();
stack.Peek()用来获取栈顶元素
object numberObj = stack.Peek();
***********************************
通过栈特性转换进制的方法(10转其他)
class Program
{
static void Main(string[] args)
{
Console.WriteLine(Test02(30, 26));
}
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());
class StackExtern:Stack
{
public new char[] ToArray()
{
int count = this.Count;
int[] chArr = new int[count];
int index = 0;
while (this.Count > 0)
{
object obj = Pop();
Console.WriteLine((char)obj);
chArr[index] = (int)obj;
//index++;
}
return null;
}
}
**************************************
队列
队列的特点是先进先出(就像排队)
Count(集合的容量)
Queue queue = new Queue();
EnterQueue 入队
queue.Enqueue(1);
queue.Enqueue(2);
queue.Enqueue(3);
Dequeue移除队列顶端元素并返回其他元素
queue.Dequeue();
Peek返回队列顶端元素
object obj = queue.Peek();