当前位置:网站首页>C#基础深入学习二
C#基础深入学习二
2022-07-04 12:42:00 【华为云】
C#基础深入学习02
哈希表(Hashtable)
Hashtable 类代表了一系列基于键的哈希代码组织起来的键/值对。它使用键来访问集合中的元素。
当您使用键访问元素时,则使用哈希表,而且您可以识别一个有用的键值。哈希表中的每一项都有一个键/值对。键用于访问集合中的项目。
Hashtable 类的方法和属性
下表列出了 Hashtable 类的一些常用的 属性:
属性 | 描述 |
---|---|
Count | 获取 Hashtable 中包含的键值对个数。 |
IsFixedSize | 获取一个值,表示 Hashtable 是否具有固定大小。 |
IsReadOnly | 获取一个值,表示 Hashtable 是否只读。 |
Item | 获取或设置与指定的键相关的值。 |
Keys | 获取一个 ICollection,包含 Hashtable 中的键。 |
Values | 获取一个 ICollection,包含 Hashtable 中的值。 |
下表列出了 Hashtable 类的一些常用的 方法:
序号 | 方法名 & 描述 |
---|---|
1 | public virtual void Add( object key, object value ); 向 Hashtable 添加一个带有指定的键和值的元素。 |
2 | public virtual void Clear(); 从 Hashtable 中移除所有的元素。 |
3 | public virtual bool ContainsKey( object key ); 判断 Hashtable 是否包含指定的键。 |
4 | public virtual bool ContainsValue( object value ); 判断 Hashtable 是否包含指定的值。 |
5 | public virtual void Remove( object key ); 从 Hashtable 中移除带有指定的键的元素。 |
using System;using System.Collections;namespace day21test02{ class Program { /// <summary> /// Hashtable 集合 哈希表 /// 哈希表的顺序与插入顺序,值顺序均无关,只与哈希表的key (hash运算)排列顺序有关 /// /// </summary> /// <param name="args"></param> static void Main(string[] args) { Hashtable ht = new Hashtable(10); //不能出现重复值,比较笨重 ht.Add("id", 145); ht.Add("name", "q"); ht.Add("sex", 's'); //判断哈希表中是否存在该值 if (ht.Contains("sex")) { Console.WriteLine(ht["sex"]); } //可以将之前填充的数据覆盖,不会出现异常 ht["id"] = 45; Console.WriteLine("Hello World!"); } } class T { }}
using System;using System.Collections;using System.Collections.Generic;namespace day21test03{ class Program { /// <summary> /// Hashtable 和 SortedList的排序问题 /// hashtable本身没有排序方法,需要借助list /// </summary> /// <param name="args"></param> static void Main(string[] args) { //初级方法 Hashtable ht = new Hashtable(20); ArrayList ay = new ArrayList(); ht.Add("k1", "v1"); ay.Add("k1"); ht.Add("k2", "v2"); ay.Add("k2"); ht.Add("k3", "v3"); ay.Add("k3"); ht.Add("k4", "v4"); ay.Add("k4"); ay.Sort(); for(int i = 0; i < ay.Count; i++) { Console.WriteLine(ht[ay[i].ToString()].ToString()); } //高级方法,sortedList自动排序,创建时就进行了排序 SortedList sort = new SortedList(); sort.Add("kk1", "vv1"); sort.Add("kk2", "vv2"); sort.Add("kk3", "vv3"); sort.Add("kk4", "vv4"); Console.WriteLine("Hello World!"); } }}
ArrayList 和 List 的比较
ArrayList
ArrayList是一个特殊数组,通过添加和删除元素就可以动态改变数组的长度。
ArrayList集合相对于数组的优点:支持自动改变大小,可以灵活的插入元素,可以灵
活的删除元素,可以灵活的访问元素,但是ArrayList只支持一维,并且查询和检索的
速度比较慢。
在C#中数据类型分为两类:值类型和引用类型。
int bool char double enum struct DateTime等都是值类型(值类型和引用类型的重
要特征在于,值类型的长度固定,而引用类型的长度不固定),string Array class
集合 等都是引用类型。如果是值类型直接存储在栈中(局部变量),如果是引用类
型,先把数据存储在堆中,然后把堆的地址存储在栈中。
object类是所有类的基类,所有的数据类型都可以转换成object类,这就是为什么
ArrayList可以存储值类型和引用类型,因为在存储的时候全被转换成object类型存储
这也是ArrayList的一个缺点,就是存储的时候需要把值类型封装成object类型,取出
来的时候需要再把object类型再转换成值类型,这一装箱和拆箱的过程非常消耗性能
。
装箱:如果往ArrayList中存储值类型的数据,在存储的时候需要转换成object类型存
储,由值类型封装成object类型的过程称为装箱。
拆箱:由object类型转换成值类型的过程称为拆箱。
using System;using System.Collections;namespace day21test01{ class Program { /// <summary> /// ArrayList类 /// 存储时会将值类型装箱为object类型,检索时又将object类型拆箱为值类型,性能的消耗比较大。 /// 并且它只能是一维的 /// </summary> /// <param name="args"></param> static void Main(string[] args) { ArrayList list = new ArrayList(); list.Add(1); list.Add("1"); list.Add('1'); list.Add(null); Console.WriteLine(list[0].GetType()); Console.WriteLine(list[1].GetType()); Console.WriteLine(list[2].GetType()); //Console.WriteLine(list[3].GetType()); Console.WriteLine("Hello World!"); } }}
List
List是由ArrayList发展而来的集合,同样具备了ArrayList相对于Array的优点,List是一种泛型集合,解决了ArrayList对于值类型需要拆箱和装箱的缺点,List在声明的时候需要指定存储集合的数据类型
//定义及其初始化
//第一种方法
List <string> objList = new List<string>();
objList.Add(10);
objList.Add(2);
//第二种方法
int[] array = {1,2,3,4,5};
List<int> objList = new List<int>(array);//用array这个数组来填充
//第三种
List<string> nameList = new List<string>(){“小李”,“校长”};
队列(Queue)
队列(Queue)代表了一个先进先出的对象集合。当您需要对各项进行先进先出的访问时,则使用队列。当您在列表中添加一项,称为入队,当您从列表中移除一项时,称为出队。
Queue 类的方法和属性
下表列出了 Queue 类的一些常用的 属性:
属性 | 描述 |
---|---|
Count | 获取 Queue 中包含的元素个数。 |
下表列出了 Queue 类的一些常用的 方法:
序号 | 方法名 & 描述 |
---|---|
1 | public virtual void Clear(); 从 Queue 中移除所有的元素。 |
2 | public virtual bool Contains( object obj ); 判断某个元素是否在 Queue 中。 |
3 | public virtual object Dequeue(); 移除并返回在 Queue 的开头的对象。 |
4 | public virtual void Enqueue( object obj ); 向 Queue 的末尾添加一个对象。 |
5 | public virtual object[] ToArray(); 复制 Queue 到一个新的数组中。 |
6 | public virtual void TrimToSize(); 设置容量为 Queue 中元素的实际个数。 |
using System;using System.Collections;namespace day21test07{ class Program { /// <summary> /// 队列,有入队和出队的操作 /// </summary> /// <param name="args"></param> static void Main(string[] args) { Queue q = new Queue(); //入队 q.Enqueue(12); q.Enqueue(24); q.Enqueue(36); //出队,自动先出先进入的元素 int a = (int)q.Dequeue(); //查看当前需要出队的元素 int b = (int)q.Peek(); Console.WriteLine("Hello World!"); } }}
点阵列(BitArray)
BitArray 类管理一个紧凑型的位值数组,它使用布尔值来表示,其中 true 表示位是开启的(1),false 表示位是关闭的(0)。
当您需要存储位,但是事先不知道位数时,则使用点阵列。您可以使用整型索引从点阵列集合中访问各项,索引从零开始。
BitArray 类的方法和属性
下表列出了 BitArray 类的一些常用的 属性:
属性 | 描述 |
---|---|
Count | 获取 BitArray 中包含的元素个数。 |
IsReadOnly | 获取一个值,表示 BitArray 是否只读。 |
Item | 获取或设置 BitArray 中指定位置的位的值。 |
Length | 获取或设置 BitArray 中的元素个数。 |
下表列出了 BitArray 类的一些常用的 方法:
序号 | 方法名 & 描述 |
---|---|
1 | public BitArray And( BitArray value ); 对当前的 BitArray 中的元素和指定的 BitArray 中的相对应的元素执行按位与操作。 |
2 | public bool Get( int index ); 获取 BitArray 中指定位置的位的值。 |
3 | public BitArray Not(); 把当前的 BitArray 中的位值反转,以便设置为 true 的元素变为 false,设置为 false 的元素变为 true。 |
4 | public BitArray Or( BitArray value ); 对当前的 BitArray 中的元素和指定的 BitArray 中的相对应的元素执行按位或操作。 |
5 | public void Set( int index, bool value ); 把 BitArray 中指定位置的位设置为指定的值。 |
6 | public void SetAll( bool value ); 把 BitArray 中的所有位设置为指定的值。 |
7 | public BitArray Xor( BitArray value ); 对当前的 BitArray 中的元素和指定的 BitArray 中的相对应的元素执行按位异或操作。 |
using System;using System.Collections;namespace day21test10{ class Program { /// <summary> /// BitArray /// </summary> /// <param name="args"></param> static void Main(string[] args) { //数组内全部以二进制的形式来存储数据 /*Byte[] a = new byte[1]; a[0] = 255; BitArray ary = new BitArray(a); foreach(var item in ary) { Console.WriteLine(item.ToString()); Console.WriteLine(item.ToString().ToLower() == "false"?0:1); } Console.WriteLine("Hello World!"); //位运算符 //使用与(全1取1) 或(全0取0) 异或(相同取0,不同取1)二进制运算是一种高效率的运算方式 int n1 = 100; int n2 = 100; if ((n1 | n2) == 0) { Console.WriteLine("相等"); }*/ //Console.WriteLine(); BitArray b1 = new BitArray(128); BitArray b2 = new BitArray(128); BitArray b3 = b1.Xor(b2); //if ((bool)b1.Xor(b2)) { } Console.Write(b3.ToString().ToLower() == "false"?0:1); } }}
堆栈(Stack)
堆栈(Stack)代表了一个后进先出的对象集合。当您需要对各项进行后进先出的访问时,则使用堆栈。当您在列表中添加一项,称为推入元素,当您从列表中移除一项时,称为弹出元素。
Stack 类的方法和属性
下表列出了 Stack 类的一些常用的 属性:
属性 | 描述 |
---|---|
Count | 获取 Stack 中包含的元素个数。 |
下表列出了 Stack 类的一些常用的 方法:
序号 | 方法名 & 描述 |
---|---|
1 | public virtual void Clear(); 从 Stack 中移除所有的元素。 |
2 | public virtual bool Contains( object obj ); 判断某个元素是否在 Stack 中。 |
3 | public virtual object Peek(); 返回在 Stack 的顶部的对象,但不移除它。 |
4 | public virtual object Pop(); 移除并返回在 Stack 的顶部的对象。 |
5 | public virtual void Push( object obj ); 向 Stack 的顶部添加一个对象。 |
6 | public virtual object[] ToArray(); 复制 Stack 到一个新的数组中。 |
using System;using System.Collections;namespace day21test08{ class Program { /// <summary> /// 堆栈,后进先出的集合类(最后进栈的最先出栈) /// 主要有入栈 出栈 /// </summary> /// <param name="args"></param> static void Main(string[] args) { Stack ss = new Stack(); //压栈 ss.Push(12); ss.Push(13); ss.Push(14); //出栈 int c = (int)ss.Pop(); Console.WriteLine(c); //查看当前要出栈的数据是 int d = (int)ss.Peek(); Console.WriteLine(d); Console.WriteLine("Hello World!"); } }}
边栏推荐
- Implementation mode and technical principle of MT4 cross platform merchandising system (API merchandising, EA merchandising, nj4x Merchandising)
- 在 Apache 上配置 WebDAV 服务器
- Apache服务器访问日志access.log设置
- 聊聊支付流程的设计与实现逻辑
- 数据库锁表?别慌,本文教你如何解决
- CANN算子:利用迭代器高效实现Tensor数据切割分块处理
- PostgreSQL 9.1 飞升之路
- Zhongang Mining: in order to ensure sufficient supply of fluorite, it is imperative to open source and save flow
- Can Console. Clear be used to only clear a line instead of whole console?
- iptables基础及Samba配置举例
猜你喜欢
C#/VB. Net to add text / image watermarks to PDF documents
DGraph: 大规模动态图数据集
SQL statement syntax error in test SQL statement deletion in eclipse linked database
CA:用于移动端的高效坐标注意力机制 | CVPR 2021
Practice: fabric user certificate revocation operation process
After installing vscode, the program runs (an include error is detected, please update the includepath, which has been solved for this translation unit (waveform curve is disabled) and (the source fil
6 分钟看完 BGP 协议。
比量子化学方法快六个数量级,一种基于绝热状态的绝热人工神经网络方法,可加速对偶氮苯衍生物及此类分子的模拟
聊聊支付流程的设计与实现逻辑
【云原生 | Kubernetes篇】深入了解Ingress(十二)
随机推荐
比量子化学方法快六个数量级,一种基于绝热状态的绝热人工神经网络方法,可加速对偶氮苯衍生物及此类分子的模拟
AI 绘画极简教程
SQL语言
7、 Software package management
Reinforcement learning - learning notes 1 | basic concepts
[FAQ] summary of common causes and solutions of Huawei account service error 907135701
使用 NSProxy 实现消息转发
[leetcode] 96 and 95 (how to calculate all legal BST)
PostgreSQL 9.1 飞升之路
ArcGIS uses grid processing tools for image clipping
jsonp
三星量产3纳米产品引台媒关注:能否短期提高投入产出率是与台积电竞争关键
BackgroundWorker用法示例
8 expansion sub packages! Recbole launches 2.0!
2022年中国移动阅读市场年度综合分析
Zhongang Mining: in order to ensure sufficient supply of fluorite, it is imperative to open source and save flow
「小技巧」给Seurat对象瘦瘦身
Agile development / agile testing experience
Personalized online cloud database hybrid optimization system | SIGMOD 2022 selected papers interpretation
DGraph: 大规模动态图数据集