news 2026/9/25 11:25:08

常见类后续,泛型,文件

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
常见类后续,泛型,文件

引言

常见类后续较为重要的大体可以概述为“集合List","字典Dictionary",二者均为容器对象(存储多个元素),二者异中有同

  • List集合: 可变长度(扩容), 提供丰富方法, 元素可重复

  • 字典: 可变长度(扩容),提供丰富方法, key-value(键值对), key唯一, value可重复

泛型:通过泛型,你可以创建适用于多种数据类型的类、接口、委托和方法,而无需为每种类型编写重复代码。

文件:内存中存放的数据在计算机关机后就会消失。要长久保存数据,就要使用硬盘、光盘、U 盘等设备。为了便于数据的管理和检索,引入了“文件”的概念。

常见类后续

1.集合List

ArrayList: 早期的List集合, 不支持泛型, object[], 添加任意类型的元素, 向上转型为object(装箱操作), 获取元素(object), 手动向下转型(拆箱操作), 效率低, 无安全检查。

List<T>: 泛型List集合,<T>: 定义一个T数据类型变量, 创建List集合对象,给T赋值:List<int>限制集合存储元素类型, 避免装箱拆箱操作。

///注意点:装箱:添加任意类型的元素, 向上转型为object;拆箱:获取元素(object), 手动向下转型

1.Arraylist

ArrayList是 C# 中一个经典的集合类型,位于System.Collections命名空间中。它是 .NET Framework 早期版本中的动态数组实现,可以存储任意类型的对象。可以将ArrayList类看作扩充了功能的数组,但它并不等同于数组。使用ArrayList类要添加引用:using.System.Collections;

特点:

动态数组:底层使用数组实现,自动处理扩容非泛型集合:存储 System.Object 类型的元素

索引访问:支持类似数组的索引器访问允许重复:同一元素可以多次添加

2.List<T>泛型集合

List<T>是 C# 中最常用的集合类型之一,它属于System.Collections.Generic命名空间,提供了强大的动态数组功能。使用ArrayList存储的数据都是object类型,操作的时候经常要进行类型转换,效率低并且类型转换时容易出错,可以使用泛型集合来改进。泛型集合可以约束集合内的元素类型

对比:

名称ArrayListList<T>
类型安全非泛型,存储 object 类型泛型,编译时类型检查
性能需要装箱/拆箱操作,性能较低需装箱/拆箱,性能更高
线程安全非线程安全非线程安全

方法:

遍历:foreach 循环,若循环操作中,涉及到增删改等操作,会在运行时抛出异常,而for i循环中则无此情况,推荐使用for i循环

排序 Sort():进行排序, 要求提供比较强

ICompareable比较器:要求元素所在类实现接口, 默认排序, 在A业务中,需要的ICompareable指定的排序规则, 在B业务中, 不需要的ICompareable指定的排序规则, 另外排序规则, 不能直接修改类的CompareTo()方法。

IComparer接口: 不需要在元素所在类实现接口, 只需要编写类实现这个接口的int Compare(object x, object y);如果某个类比较规则很多, 编写很多个实现IComparer接口类,造成类暴增, 比较规则只使用一次。

Comparison委托: 只需要提供方法, 结合lambda表达式, 在使用的时候,创建方法,优化: 不需要创建类,只需要在调用Sort()方法时.使用代码动态去创建一个比较规则 Comparison(委托)

List<int> list = new List<int>() { 2,5,3,10,8,7 } ///使用委托进行比较 list.Sort((num1,num2)=> num1-num2);

寻找元素:

FindIndex:返回第一个匹配元素的下标

int firstEven = numbers.Find(x => x % 2 == 0); // 返回 2

Find:返回匹配的第一个元素

int index = numbers.FindIndex(x => x > 3); // 返回 3

FindAll:返回满足条件的所有元素

int index = numbers.FindIndex(x => x > 3); // 返回 3

2.字典

key唯一, value可重复, key不能是null ,这一种一一对应关系称为字典, key--> value关系 存储一对key,value 使用字典。

C#有两种: 非泛型字典: HashTable 泛型字典: Dictionary<T>

1.HashTable

Hashtable通常称为哈希表,它表示键/值对的集合,这些键/值对根据键的哈希代码进行组织。它的每个元素都是一个存储在DictionaryEntry对象中的键/值对。键不能为空引用,但值可以。

hash算法:根据key进行hash算法,得到对应hash值, 根据hash值找Bucket数组的位置(下标) 下标 = hash % 桶的长度; 11 31%11 = 9 9%11 = 9

Hash冲突: 1. key不一样,但是计算得到hash码一样 1. key不一样, hash值不一样, 计算得到桶的下标一样。

解决方法:可以使用开放寻址法处理冲突

方法:遍历

1. 第一种方式先得到key的集合(Keys), 遍历key集合, 通过key获取value

foreach (object key in hashtable.Keys) { //通过key获取value 通过索引器 object value = hashtable[key]; Console.WriteLine($"key:{key}-->value:{value}"); }

2.第二种方式: 遍历HashTable集合, 得到DictionaryEntry(包含key,value)

foreach (DictionaryEntry entry in hashtable) { Console.WriteLine($"{entry.Key}:{entry.Value}"); }

|

方法作用
void Remove(object key)根据指定的 key 值移除对应的集合元素。
void Clear()清空集合。
ContainsValue(object value)判断集合中是否包含指定 value 值的元素

2.Dictionary字典

实际开发中, 推荐使用Dictionary<K,V>, 它的方法与HashTable一样, 底层数据结构不一样, HashTable底层是Bucket对象数组, Dictionary底层是数组+链表(哈希表)。

方法同上

拓展方法:

  • ToList() 把字典转换为List, 元素KeyValuePair

  • 排序好的集合 OrderBy(Func委托) 升序排序

static void Main(string[] args) { Dictionary<string,int> dict = new Dictionary<string, int> { { "one", 1 }, { "two", 5 }, { "three", 3 } // 等价于上面写法 //["one"] = 1, //["two"] = 2, //["three"] = 3 }; //ToList() 把字典转换为列表, Dictionary: key-value键值对封装成: KeyValuePair<TKey,TValue> //List<KeyValuePair<string, int>> list = dict.ToList(); //// 按照值排序 Sort() //list.Sort((a,b)=>b.Value - a.Value); //list.ForEach((kvp)=> Console.WriteLine($"{kvp.Key}:{kvp.Value}")); //排序方法 OrderBy() 升序排序 OrderByDescending() 降序排序 //根据哪一个字段(表达式)排序 //var orderDict = dict.OrderBy(kvp=>kvp.Value); var orderDict = dict.OrderByDescending(kvp => kvp.Value); Console.WriteLine(string.Join("\n",orderDict)); Dictionary<string,Student> studentDict = new Dictionary<string, Student> { { "1", new Student{ Id=1,Name="张三",Age=18 } }, { "2", new Student{ Id=2,Name="李四",Age=20 } }, { "3", new Student{ Id=3,Name="王五",Age=19 } } }; //根据学生的年龄进行排序 var orderStuDict = studentDict.OrderByDescending(kvp => kvp.Value.Age); Console.WriteLine(string.Join("\n", orderStuDict)); } }

泛型

数据类型参数化,通过泛型,你可以创建适用于多种数据类型的类、接口、委托和方法,而无需为每种类型编写重复代码。其泛型变量本质就是一个站位符;

1:使用场景:

1:泛型变量定义方式:

  • 泛型类: 在类声明后面定义泛型变量, 这泛型变量的作用域在整个类都有效

/// <summary> /// 泛型类 /// </summary> internal class Demo2<T> { //字段使用 private T data; //属性使用 public T Data { get { return data; } set { data = value; } } //构造方法使用 public Demo2(T data) { this.data = data; } public Demo2() { } //非静态方法使用 public T Fun(T t) { return t; } //静态方法使用 public static void Fun2(T t) { } }
  • 泛型方法: 在方法定义后面定义泛型变量, 作业域: 只在该方法内使用

2:泛型变量赋值

申明在方法上的泛型变量, 调用这个方法的时候赋值, 可以不需要使用<数据类型>显示赋值, 如果泛型变量在参数上使用, 给参数传递什么类型的值, 泛型变量数据类型就是该参数对应数据类型(隐式赋值);

//注意点 如果泛型变量作为参数使用: 可以显示赋值, 也可以隐式赋值, 推荐隐式赋值如果泛型变量只作为返回值类型使用, 只能显示赋值

2:泛型约束

限制泛型变量赋值范围,如果泛型没有约束, 值可以是任意数据类型

约束说明
where T : structT必须是值类型(包括枚举,非null)
where T : classT必须是引用类型(包括null)
where T : new()T必须有无参构造函数
where T : 基类名T必须继承自指定基类
where T : 接口名T必须实现指定接口
where T : UT必须与U相同或是U的派生类(U也是类型参数)

///注意点:泛型约束必须写在类,方法定义最后

文件

想看的话,关注笔者,下周在更新。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/1 8:37:30

AWR1843毫米波雷达Python数据采集与可视化完整指南

AWR1843毫米波雷达Python数据采集与可视化完整指南 【免费下载链接】AWR1843-Read-Data-Python-MMWAVE-SDK-3- Python program to read and plot the data in real time from the AWR1843 mmWave radar board (MMWAVE SDK 3) 项目地址: https://gitcode.com/gh_mirrors/aw/AW…

作者头像 李华
网站建设 2026/9/22 15:08:00

基于Java Swing的打砖块小游戏(1)

1、项目介绍 打砖块小游戏是一款基于Java Swing开发的经典休闲游戏&#xff0c;复刻了传统打砖块游戏的核心玩法。该项目采用面向对象的设计思想&#xff0c;封装了游戏中的核心元素&#xff08;挡板、小球、砖块&#xff09;&#xff0c;实现了游戏界面渲染、用户输入处理、碰…

作者头像 李华
网站建设 2026/9/24 22:10:50

JSP如何整合第三方控件支持大文件上传?

大文件传输解决方案&#xff08;源码级交付&#xff09; 作为山西IT行业软件公司项目负责人&#xff0c;我深刻理解当前需求的复杂性与紧迫性。针对政府、央企客户对100G级文件传输、高稳定性断点续传、信创兼容、数据安全的核心诉求&#xff0c;结合集团多项目统一组件、低成…

作者头像 李华
网站建设 2026/9/1 11:33:57

Ansible-Playbook

ansible-Playbook是一系列ansible命令的合集&#xff0c;使用的是yaml语言进行编写的&#xff0c;自上而下的顺序进行执行&#xff0c;并且可以进行使用变量Yaml语法yaml语言是专门使用于进行编写配置文件的 大小写敏感 使用缩进来进行表示层级关系 缩进的空格数不重要&#xf…

作者头像 李华
网站建设 2026/9/24 18:11:59

毕业设计项目 基于协同过滤的电影推荐系统

文章目录1 简介1 设计概要2 课题背景和目的3 协同过滤算法原理3.1 基于用户的协同过滤推荐算法实现原理3.1.1 步骤13.1.2 步骤23.1.3 步骤33.1.4 步骤44 系统实现4.1 开发环境4.2 系统功能描述4.3 系统数据流程4.3.1 用户端数据流程4.3.2 管理员端数据流程4.4 系统功能设计5 主…

作者头像 李华
网站建设 2026/9/25 3:49:11

主流小程序服务商功能特点与选择要点分析

在当下数字化零售趋势情形里&#xff0c;小程序商城已然成了众多企业去布局线上业务、着手构建私域流量的关键工具。面对市场当中种类众多繁杂的服务商&#xff0c;商家于选择之际常常需要全面综合性地考量系统的功能性、生态适配性、技术稳定性以及服务支持能力。本文会客观公…

作者头像 李华