# Hashtable 哈希表
用于处理和表现类似 key value
的键值对
- key:通常可用来快速查找,区分大小写
- value:用于存储对应于 key 的值
Hashtable 中 keyvalue 键值对均为 object 类型,所以 Hashtable 可以支持任何类型的 keyvalue 键值对
# 使用场景
- 某些数据会被高频率查询
- 数据量大
- 查询字段包含字符串类型
- 数据类型不唯一
# 引入 namespace
| using System.Collections; |
| using System.Collections.Generic; |
# 属性
属性 | 描述 |
---|
Count | 获取 Hashtable 中包含的键值对个数 |
IsFixedSize | 获取一个值,表示 Hashtable 是否具有固定大小 |
IsReadOnly | 获取一个值,表示 Hashtable 是否只读 |
Item | 获取或设置与指定的键相关的值 |
Keys | 获取一个 ICollection,包含 Hashtable 中的键 |
Values | 获取一个 ICollection,包含 Hashtable 中的值 |
# 方法
方法 | 描述 |
---|
public virtual void Add(object key, object value); | 添加键值对 |
public virtual void Remove(object key); | 移除指定的键值对 |
public virtual void Clear(); | 移除所有元素 |
public virtual bool ContainsKey(object key); | 判断是否包含指定的键 key,返回 true/false |
public virtual bool ContainsValue(object value); | 判断是否包含指定键的 key,返回 true/false |
示例
| ... |
| using System.Collections; |
| using System.Collections.Generic; |
| |
| namespace HashTable |
| { |
| class Program |
| { |
| static void Main(string[] args) |
| { |
| Hashtable ht = new Hashtable(); |
| ht.Add("北京", "帝都"); |
| ht.Add("上海", "魔都"); |
| ht.Add("广州", "省会"); |
| ht.Add("深圳", "特区"); |
| Console.WriteLine(ht.Count); |
| |
| ht.Remove("深圳"); |
| Console.WriteLine(ht.Count); |
| |
| Console.WriteLine(ht.Contains("北京")); |
| Console.WriteLine(ht.ContainsValue("省会")); |
| Console.WriteLine(ht["上海"]); |
| |
| ht.Clear(); |
| } |
| } |
| } |
# 遍历
| |
| foreach (DictionaryEntry item in ht) { |
| Console.WriteLine(item.Key); |
| Console.WriteLine(item.Value); |
| } |
| |
| |
| foreach (string key in ht.Keys) { |
| Console.WriteLine(key); |
| } |
| |
| |
| foreach (string value in ht.Values) { |
| Console.WriteLine(value); |
| } |
# 排序
| ArrayList akeys = new ArrayList(ht.Keys); |
| akeys.Sort(); |
| foreach (string key in akeys) { |
| Console.WriteLine(key + ": " + ht[key]); |
| } |
| |
| |
| 北京: 帝都 |
| 广州: 省会 |
| 上海: 魔都 |
# DataTable
DataTable 是一个临时保存数据的网格虚拟表,表示内存中数据的一个表,是一个二维表,也是一个后台数据源和前台显示之间的适配器
# 引入 namespace
# 属性
属性 | 描述 |
---|
TableName | 获取或设置 DataTable 的名称 |
Columns | 获取属于该表的列的集合 |
Rows | 获取属于该表的行的集合 |
DataSet | 获取此表所属的 DataSet |
ChildRelations | 获取此 DataTable 的子关系的集合 |
Constraints | 获取由该表维护的约束的集合 |
DefaultView | 获取可能包括筛选视图或游标位置的表的自定义视图 |
CaseSensitive | 指示表中的字符串比较是否区分大小写 |
HasErrors | 获取一个值,该值指示该表所属的 DataSet 的任何表的任何行中是否有错误 |
MinimumCapacity | 获取或设置该表最初的起始大小。该表中行的最初起始大小,默认值为 50 |
# 方法
方法 | 描述 |
---|
BeginInit() | 开始初始化在窗体上使用或由另一个组件使用的 |
DataTable | 初始化发生在运行时 |
Clear() | 清除所有数据的 DataTable |
Clone() | 克隆 DataTable 的结构,包括所有 DataTable 架构和约束 |
EndInit() | 结束在窗体上使用或由另一个组件使用的 DataTable 的初 始化。初始化发生在运行时 |
ImportRow(DataRow row) | 将 DataRow 复制到 DataTable 中,保留任何属性设置以及初始值和当前值 |
Merge(DataTable table) | 将指定的 DataTable 与当前的 DataTable 合并 |
NewRow() | 创建与该表具有相同架构的新 DataRow |
# 常用使用方法
字段名 | column0 | column1 |
---|
| 张三 | DateTime.Now 当前时间 |
| 李四 | DateTime.Now 当前时间 |
# 创建
| |
| DataTable dt = new DataTable(); |
| |
| |
| DataTable dt = new DataTable("Table_New"); |
| |
| |
| |
| DataTable dt = new DataTable("Table_New","Test"); |
# 添加列
| |
| DataColumn dc = new DataColumn(); |
| dt.Columns.Add(dc); |
| |
| |
| dt.Columns.Add("column0", System.Type.GetType("System.String")); |
| dt.Columns.Add("column0", typeof(String)); |
| |
| |
| DataColumn dc = new DataColumn("column1",System.Type.GetType("System.DateTime")); |
| DataColumn dc = new DataColumn("column1", typeof(DateTime)); |
| dt.Columns.Add(dc); |
# 添加行
| |
| DataRow dr = dt.NewRow(); |
| dt.Rows.Add(dr); |
| |
| |
| dt.Rows.Add(); |
| |
| |
| dt.Rows.Add("张三", DateTime.Now); |
| |
| |
| dt.Rows.Add(dt2.Rows[i].ItemArray); |
# 赋值取值
赋值
| |
| DataRow dr = dt.NewRow(); |
| dr[0] = "张三"; |
| dr["column1"] = DateTime.Now; |
| |
| |
| |
| dt.Rows[0][0] = "张三"; |
| dt.Rows[0]["column1"] = DateTime.Now; |
取值
| string name = dt.Rows[0][0].ToString(); |
| string time = dt.Rows[0]["column1"].ToString(); |
| |
| |
| for (int i = 0; i < dt.Rows.Count; i++) { |
| |
| Console.WriteLine(dt.Rows[i]["column0"].ToString()); |
| Console.WriteLine(dt.Rows[i]["column1"].ToString()); |
| } |
| |
| foreach (DataRow dr in dt.Rows) { |
| |
| Console.WriteLine(dr["column0"]); |
| Console.WriteLine(dr["column1"]); |
| } |
# 筛选行
| |
| DataRow[] drs = dt.Select("column1 is null"); |
| |
| |
| DataRow[] drs = dt.Select("column0 = '李四'"); |
| |
| |
| DataRow[] drs = dt.Select("column0 like '张%'"); |
| |
| |
| DataRow[] drs = dt.Select("column0 like '张%'", "column1 DESC"); |
| |
| |
| DataRow[] drs = dt.Select("column0 = '李四' and column0 = '1'"); |
# 删除行
| |
| dt.Rows.Remove(dt.Rows[0]); |
| |
| |
| dt.Rows.RemoveAt(0); |
| |
| |
| dt.Rows[0].Delete(); |
| dt.AcceptChanges(); |
| |
| |
| |
| |
| |
| |
| for (int i = dt.Rows.Count - 1; i >= 0; i--) |
| { |
| dt.Rows.RemoveAt(i); |
| } |
# 复制表
复制表 - 同时复制了表结构和数据
| |
| DataTable dtNew = new DataTable(); |
| dtNew = dt.Copy(); |
| |
| |
| DataTable dtNew = dt.Copy(); |
| dtNew.Clear(); |
| for (int i = 0; i < dt.Rows.Count; i++) |
| { |
| if (条件语句) |
| { |
| dtNew.Rows.Add(dt.Rows[i].ItemArray); |
| } |
| } |
克隆表 - 只复制表结构,不包括数据
| DataTable dtNew = new DataTable(); |
| dtNew = dt.Clone(); |
| |
| |
| DataTable dtNew = new DataTable(); |
| dtNew = dt.Copy(); |
| dtNew.Rows.Clear(); |
| dtNew.ImportRow(dt.Rows[0]); |
# 表排序
| |
| DataTable dt = new DataTable(); |
| |
| |
| dt.Columns.Add("ID", typeof(Int32)); |
| dt.Columns.Add("Name", typeof(String)); |
| dt.Columns.Add("Age", typeof(Int32)); |
| |
| |
| dt.Rows.Add(new object[] { 1, "张三" ,20}); |
| dt.Rows.Add(new object[] { 2, "李四" ,25}); |
| dt.Rows.Add(new object[] { 3, "王五" ,30}); |
| |
| |
| DataView dv = dt.DefaultView; |
| dv.Sort = "ID DESC"; |
| dv.ToTable(); |
# DataSet
| DataSet ds = new DataSet(); |
| ds.Tables.Add(dt); |
| ds.Tables.Add(dtSort); |
| ds.Tables.Add(dtNew2); |
| |
| foreach (DataTable table in ds.Tables) { |
| Console.WriteLine(); |
| foreach (DataRow rows in table.Rows) { |
| for (int i = 0; i < table.Columns.Count; i++) { |
| Console.Write(rows[i] + "\t"); |
| } |
| Console.WriteLine(); |
| } |
| } |
# DataView
# 三者关系
- DataSet:临时数据库
- DataTable:临时数据表
# List 集合
List<T>
是一种非常常用的泛型集合类,用于存储一组相同类型的元素
List<T>
具有动态调整大小的能力,可以方便地添加、删除、查找和修改元素,
# 引入 namespace
| using System.Collections.Generic; |
# 属性
属性 | 用法 |
---|
Items | 获取或设置指定索引处的元素 |
Count | 返回 List <T> 中存在的元素总数 |
# 方法
方法 | 用法 |
---|
Add | 在 List <T> 的末尾添加元素 |
AddRange | 将指定集合的元素添加到 List <T> 的末尾 |
BinarySearch | 搜索元素并返回该元素的索引 |
Clear | 从 List <T> 中删除所有元素 |
Contains | 检查指定元素在 List <T> 中是否存在 |
Find | 根据指定的谓词函数查找第一个元素 |
Foreach | 遍历 List <T> |
Insert | 在 List <T> 中的指定索引处插入元素 |
InsertRange | 在指定的索引处插入另一个集合的元素 |
Remove | 删除指定元素的第一次出现 |
RemoveAt | 删除指定索引处的元素 |
RemoveRange | 删除所有与提供的谓词功能匹配的元素 |
Sort | 对所有元素进行排序 |
TrimExcess | 将容量设置为实际的元素数 |
TrueForAll | 确定 List <T> 中的每个元素是否与指定谓词定义的条件匹配 |
# 添加元素
| |
| List<int> numbersList = new List<int>(); |
| |
| |
| numbersList.Add(1); |
| numbersList.Add(2); |
| numbersList.Add(3); |
| |
| List<string> fruitsList = new List<string> { "apple", "orange", "banana" }; |
# 删除元素
| |
| fruitsList.Remove("orange"); |
| |
| |
| fruitsList.RemoveAt(1); |
| |
| |
| fruitsList.Clear(); |
# 查找元素
| |
| bool isContains = fruitsList.Contains("orange"); |
| |
| |
| int index = fruitsList.IndexOf("orange"); |
# 遍历
| |
| for (var i = 0; i < fruitsList.Count; i++) { |
| Console.WriteLine(fruitsList[i]); |
| } |
| |
| |
| foreach (var item in fruitsList) { |
| Console.WriteLine(item); |
| } |
# 其它常用方法
| List<int> numbersList = new List<int> { 4, 1, 6, 3, 9 }; |
| |
| |
| int count = numbersList.Count; |
| |
| |
| numbersList.Sort(); |
| |
| |
| numbersList.Reverse(); |
| List<int> numbersList = new List<int> { 1, 2, 3, 4, 5 }; |
| |
| |
| int evenNumber = numbersList.Find(x => x % 2 == 0); |
| |
| List<int> oddNumbers = numbersList.FindAll(x => x % 2 != 0); |
| |
| |
| numbersList.RemoveAll(x => x % 2 == 0); |
| |
| |
| numbersList.ForEach(x => Console.WriteLine(x * 2)); |
| |
| |
| bool isExists = numbersList.Exists(x => x > 3); |
# List<T>
与数组的比较
🚩 数组:
- 优点
- 性能更好:数组在内存中是连续分配的,因此访问元素的性能更好,尤其是对于大量元素的访问
- 固定长度: 数组的长度一旦确定,就无法更改,这有助于保证数据的稳定性和安全性
- 多维数组:数组支持多维数组,可以用于表示表格、矩阵等结构
- 适用场景:当数据集合长度固定且需要频繁访问元素时,可以考虑使用数组
🚩 List<T>
:
- 优点
- 动态调整大小:
List<T>
可以根据需要动态调整大小,无需提前指定长度,更加灵活 - 方便的添加和删除:
List<T>
提供了丰富的方法用于添加、删除和修改元素,操作更方便 - 适应不确定数据量:当数据集合长度不确定,可能需要频繁添加或删除元素时,可以使用
List<T>
- 适用场景:当数据集合长度不确定,或需要频繁进行添加、删除等操作时,可以考虑使用
List<T>
# Array 数组
# 定义
数组是一个存储相同类型元素的固定大小的顺序集合
# 声明
| datatype[] arrayName; |
| |
| - datatype:存储在数组中的元素的类型 |
| - [ ]:数组的大小 |
| - arrayName:数组的名称 |