C#冒泡排序深度实践:普通类实现 VS 泛型类实现 ,从入门到通用
学习中迸发的小灵感在学习编程语言是冒泡排序是我们绕不开的一个课题在最开始我也只会写固定的int类型的排序。随着学习的不断深入接触到泛型后我便想着既然它能支持实现IComparable的类型那么便有实现冒泡排序的可能。普通类实现冒泡排序我们先来看一看普通类实现冒泡排序的方式如下using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace practice { internal class Program { static void Main(string[] args) { //创建一个数组 int[] array new int[] { 1, 3, 5, 77, 2, 12, 56, 34, 23, 11, 17, 13 }; //打印原数组 Console.Write(原数组); foreach (var n in array) { Console.Write({0} , n); } Console.WriteLine(); //创建一个bubbles 类对象 BubbleSorterA bubblesA new BubbleSorterA(); //调用ToSort方法 来实现冒泡排序 bubblesA.Sort(array); //打印冒泡排序后的数组 Console.Write(冒泡排序后的数组); foreach (var n in array) { Console.Write({0} ,n); } } } //创建一个类 public class BubbleSorterA { /// summary /// 创建一个方法以此来实现冒泡排序 /// /summary /// param namearray传入原数组以实现冒泡排序/param public void Sort(int[] array) { //当数组为空时 提醒用户 if(array null) { //代码提前拦截程序在这里终止方法执行并告诉用户错误的地方 throw new ArgumentNullException(nameof(array),待排序数组不能为null); } //数组元素小于2无需排序直接返回 if(array.Length 1) { return; } //第一层for循环是要进行多少次排序 for(int i 0;iarray.Length;i) { //利用bool值 作为有序标记 bool isSwap false; //第二层for循环 是数组内相邻元素进行比较大小 for(int j 1;jarray.Length-1-i;j) { //利用if语句来实现升序 if (array[j 1] array[j]) { int tmparray[j1]; array[j1]array[j]; array[j]tmp; //本轮发生交换时 isSwap true; } } //本轮没有发生任何交换时数组已经全部有序直接跳出循环 if(!isSwap) { break; } } } } }我通过创建了一个普通类BubbleSorterA通过调用Sort方法传入原数组的方法来实现的。我们可以看到这个实现方法支持的仅int[ ]一种类型若数组中误写入float或double类型的数字那么程序就会报错出现异常。运行结果如下这是最容易理解的实现但复用性差。泛型类实现冒泡排序这是用泛型类实现的冒泡排序using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace practice_02 { internal class Program { static void Main(string[] args) { //创建待排序的整型数组 int[] array { 45, 1, 34, 2, 15, 3, 21, 20, 11, 9, 6, 5 }; //打印原数组 Console.Write(原数组为); //循环输出原数组的所有元素 foreach (var t in array) { Console.Write({0} , t); } //创建冒泡排序器实例 BubbleSorterB bubblesB new BubbleSorterB(); //调用泛型排序方法 bubblesB.Sort(array); Console.WriteLine(); //打印排序完成的数组 Console.Write(排序后的数组为); //循环输出排序后的所有数组 foreach (var t in array) { Console.Write({0} ,t); } } } /// summary /// 冒泡排序工具类泛型实现 /// /summary public class BubbleSorterB { /// summary /// 泛型冒泡排序方法 /// /summary /// typeparam nameT数组元素类型必须实现IComparable接口支持大小比较/typeparam /// param namearray需要排序的数组/param public void SortT(T[] array) where T : IComparable { //当数组为空时 提醒用户 if(array null) throw new ArgumentNullException(nameof(array),待排序数组不能为null); //当数组长度小于等于1时无需排序直接退出 if (array.Length 1) return; //外层for循环 是指一共最多进行length-1轮冒泡 for (int i 0; i array.Length; i) { //设置bool值 作为有序标记 来判断本轮是否发生交换 bool isSwapped false; //内层循环每一轮把最大元素排到右侧 length-1-i 即后面i个元素已经排好序不用再比较 for (int j 0; j array.Length - 1 - i; j) { //array[j1].CompareTo(array[j]) 0 代表后一个元素 前一个元素 if (array[j 1].CompareTo(array[j]) 0) { //利用中间变量 交换两个元素 T tmp array[j 1]; array[j 1] array[j]; array[j] tmp; //当发生交换时标记为true isSwapped true; } } //若标记为false 即本轮没有任何交换数组已经全部有序直接跳出循环提前结束 if (!isSwapped) break; } } } }在此代码中我通过创建了泛型类BubbleSorterB并加入了where T :IComparable类型约束它能限定传入的类型T必须实现IComparable接口并保证它一定具备“比较大小”的能力where T : IComparable调用Sort方法并向其中传入原数组public void SortT(T[] array)在方法中调用CompareTo()方法来实现的此写法实现了IComparable接口支持C#所有基础类型。用同一套泛型方法来排序int数组 string数组例如static void Main(string[] args) { BubbleSorterB sorter new BubbleSorterB(); //1排序int数组 int[] intArray { 45, 1, 34, 2, 15, 3, 21 }; //用实现了字符串的拼接 //string.Join(分隔符,数组) 遍历数组同时把所有元素拼接成一个完整字符串元素之间使用指定分隔符隔开 Console.WriteLine(int数组排序前 string.Join(, , intArray)); sorter.Sort(intArray); Console.WriteLine(int数组排序后 string.Join(, , intArray)); Console.WriteLine(); //2排序string数组 string[] strArray { banana, apple, cherry, date, blueberry }; Console.WriteLine(string数组排序前 string.Join(, , strArray)); sorter.Sort(strArray); Console.WriteLine(string数组排序后 string.Join(, , strArray)); }运行结果如下它们之间的优缺点对比维度普通类固定 int 类型实现泛型类实现支持类型仅支持int[]一种类型支持所有实现IComparable的类型int/double/string/ 自定义类等代码复用性极差新增类型必须重写整套排序逻辑极强一套代码适配所有可比较类型学习门槛极低只需要懂循环、类和方法中等需理解泛型、类型约束、IComparable 接口性能表现理论最优零额外开销首次调用有极微的泛型初始化开销后续运行几乎无差异类型安全编译时强类型安全编译时强类型安全无装箱拆箱扩展性差新增排序规则、新类型都要改核心代码强可轻松扩展自定义比较器、降序排序适用场景算法学习、作业演示、单一固定类型排序工业级开发、通用工具类、多类型排序场景我们通过这个表格可以知道普通类的优点是1.代码极度直观对刚入门的比较友好2.报错直白调试简单出现的问题几乎都是算法逻辑错误局限性同样也很明显它的复用性几乎为零不符合开闭原则反观泛型类它的优点有1.一套代码全类型复用2.编译时类型安全3.开闭原则友好局限性也是有的它有一定学习门槛如果你是初学算法、做简单作业用普通类实现专注算法本身。如果你要写通用工具类、做项目开发必须用泛型实现保证可维护性和扩展性。如果你需要极致性能且只有单一类型可以用固定类型实现。学习感悟初学冒泡排序时我先用普通类完成了仅支持 int 数组的实现。虽然我写的这个版本语法简单但它帮我吃透双层循环、元素交换与有序标记优化顺利理解了冒泡排序核心原理虽然只能处理单一类型复用性很差但也确实是我的来时路。接触泛型后我开始重写冒泡排序。一开始很难理解类型约束where T : IComparable和CompareTo通过在网上查找资料慢慢弄懂后才豁然开朗。同一套代码既能排序 int 数组也能排序string 数组不用重复编写算法逻辑真切感受到泛型消除代码冗余、提高复用性的优势。这次实践让我体会到编程的进阶之路先实现功能再追求通用。基础写法用来理解算法泛型方案贴近实际开发。今后写代码不能只满足于 “跑通就行”要多思考如何优化、提升代码可复用性。最后这句话不仅写给你们也勉励我自己。不急于求成持续优化代码也持续优化自己。

相关新闻

Shell条件语句详解:从基础语法到实战优化

Shell条件语句详解:从基础语法到实战优化

1. Shell条件语句基础概念在Linux/Unix系统管理中,Shell脚本是最常用的自动化工具。条件语句作为编程逻辑的核心构件,直接影响脚本的决策能力。与Python等高级语言不同,Shell的条件判断有其独特的语法体系和易错点,这也是许多初学…

2026/10/14 8:15:53 阅读更多 →
从零写一个 FFmpeg 播放器:架构设计远比“解码显示”复杂

从零写一个 FFmpeg 播放器:架构设计远比“解码显示”复杂

基于 FFmpeg 构建跨平台播放器系统时,其架构设计通常遵循‌模块化、高内聚低耦合‌的原则,核心目标是实现高效的音视频解码、渲染及同步。很多人学 FFmpeg,都是从这段代码开始的:ffplay input.mp4然后自己照着抄一个:a…

2026/10/13 5:26:30 阅读更多 →
Vue 3移动端组织架构选择器:设计、实现与性能优化

Vue 3移动端组织架构选择器:设计、实现与性能优化

1. 项目概述:为什么我们需要一个移动端的组织选择器?在开发企业级或协同办公类的移动端应用时,有一个场景几乎无法回避:让用户选择某个部门、某个角色,或者指定某位同事。无论是发起审批流程、分配任务,还是…

2026/10/11 0:46:17 阅读更多 →

最新新闻

2026年最新--区块链运营岗面试题库(100题)

2026年最新--区块链运营岗面试题库(100题)

一、行业趋势与运营思维(1-10题) 1. 2026年加密行业营销的核心趋势有哪些?请结合“用户质量优先”的转变,说明运营策略应如何调整。 2026年加密营销的7大核心趋势涵盖绩效营销、内容创作、渠道多元化、活动体验、激励机制以及AI驱动的运营。最关键的转变是:Fintech和Web…

2026/10/14 15:17:11 阅读更多 →
C# GPS定位到地图显示:NMEA解析、坐标转换与GMap.NET实战

C# GPS定位到地图显示:NMEA解析、坐标转换与GMap.NET实战

简介:面向C#开发者和GIS初学者的GPS定位与地图综合示例源码。项目基于.NET框架,展示如何使用GeoCoordinateWatcher获取NMEA GPS数据,并通过Bing Maps控件实现地图加载、缩放、平移及城市名地理编码定位,涵盖地图事件处理、UI布局、…

2026/10/14 15:17:11 阅读更多 →
HTML表单与表格实战:学生注册表单与课程表制作全解析

HTML表单与表格实战:学生注册表单与课程表制作全解析

做了几年前端开发,接手过不少新人带教和作业评审。说句实在话,不管后来技术栈换成React还是Vue,凡是能把HTML里的表单和表格玩明白的,上手业务系统的效率往往都不会太差。这两块看起来基础,里面的门道却一点也不少——…

2026/10/14 15:17:11 阅读更多 →
工业AI检测项目为何死于“全产线覆盖”?

工业AI检测项目为何死于“全产线覆盖”?

1. 那句“全产线覆盖”,到底杀死了什么我做了七八年机器视觉和上位机开发,前前后后参与过二十多个工业AI项目,从服装检测、3C外观检、到食品包装异物识别都碰过。如果让我总结这些项目失败的最大共性,不是算法不行,不是…

2026/10/14 15:17:11 阅读更多 →
微信小程序商城定制怎么落地?选型要点全拆解

微信小程序商城定制怎么落地?选型要点全拆解

其实, 微信小程序商城定制这事儿, 说起来就是搭建一套能够实现商品售卖、会员管理以及营销推广的线上商业闭环, 不要被“定制”这两个字给吓到了, 要知道现在的SaaS平台已经把所有的基础功能都变成了现成的模块状态, 这些模块大概占据了整体功能总量的百分之八十的比例, 因此, …

2026/10/14 15:17:11 阅读更多 →
fast-check 4.7.0 深度解析:stringMatching 支持 Unicode 属性转义与可逆的 json 生成器

fast-check 4.7.0 深度解析:stringMatching 支持 Unicode 属性转义与可逆的 json 生成器

开发工具测试 【免费下载链接】fast-check Property based testing framework for JavaScript (like QuickCheck) written in TypeScript 项目地址: https://gitcode.com/gh_mirrors/fa/fast-check 点击查看 免费下载 fast-check 4.7.0 是一个围绕"让生成器更…

2026/10/14 15:16:08 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →