非泛型集合,泛型集合,栈,队列

集合

非泛型集合

为了保存数目不确定的对象,C#中提供了一系列特殊的类,这些类可以存储任意类型的对象,并且长度可变,它们统称为集合。

C#中集合可分为泛型集合和非泛型集合,二者均间接实现了 IEnumerable 接口。泛型集合位于 System.Collections.Generic 命名空间,它只能存储同一种类型的对象,其中最常用的是List泛型集合和Dictionary泛型集合。非泛型集合位于System.Collections命名空间,它可以存储多种类型的对象,其中最常用的是ArrayList集合和Hashtable集合。

ArrayListDemo

ArrayList 集合就像是一个杂货铺,它可以容纳不同类型的对象。例如可以将 intstringobject等类型的对象同时加入到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();


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值