C#自定义工具类-数组工具类
目录
数组工具类基本操作
1.排序:升序,降序
2.查找
1)查找最值:最大值,最小值
2)查找满足条件的单个对象
3)查找满足条件的所有对象
4)选取数组中所有对象的某一字段
完整代码
测试
1.测试代码
2.测试结果
本篇文章来分享一下如何实现数组工具类。工具类,一般具有很强的通用性,复用性很强,在需要时就可以移植到项目,可以让我们的工作更加快捷方便。今天要分享的数组工具类实现了有关数组基本操作。
数组工具类基本操作
1.排序:升序,降序
可以参考 【一文读懂】C#如何实现通用的排序功能 进行理解
/// <summary>
/// 选择委托
/// 返回数据类型T的属性Tkey的值
/// </summary>
/// <typeparam name="T">数据类型</typeparam>
/// <typeparam name="Tkey">数据类型T的字段</typeparam>
/// <returns>选择的属性</returns>
public delegate TKey SelectHandler<T, TKey>(T t);//注意是写在类外/// <summary>
/// 使用委托对任何数据类型数组进行升序排序
/// </summary>
/// <typeparam name="T">数据类型</typeparam>
/// <typeparam name="Tkey">数据类型T的字段</typeparam>
/// <param name="array">数据类型T的数组</param>
/// <param name="selectHandler">选择委托的对象</param>
public static void OrderBy<T, Tkey>(T[] array, SelectHandler<T, Tkey> selectHandler)where Tkey : IComparable<Tkey>
{for (int i = 0; i < array.Length; ++i){for (int j = i + 1; j < array.Length; ++j){//将委托已经取得数据类型的属性的进行比较if (selectHandler(array[i]).CompareTo(selectHandler(array[j])) > 0){T temp = array[i];array[i] = array[j];array[j] = temp;}}}
}/// <summary>
/// 使用委托对任何数据类型数组进行降序排序
/// </summary>
/// <typeparam name="T">数据类型</typeparam>
/// <typeparam name="Tkey">数据类型T的字段</typeparam>
/// <param name="array">数据类型T的数组</param>
/// <param name="selectHandler">选择委托的对象</param>
public static void OrderByDescending<T, Tkey>(T[] array, SelectHandler<T, Tkey> selectHandler)where Tkey : IComparable<Tkey>
{for (int i = 0; i < array.Length; ++i){for (int j = i + 1; j < array.Length; ++j){//将委托已经取得数据类型的属性的进行比较if (selectHandler(array[i]).CompareTo(selectHandler(array[j])) < 0){T temp = array[i];array[i] = array[j];array[j] = temp;}}}
}
2.查找
1)查找最值:最大值,最小值
/// <summary>
/// 查找最大值
/// </summary>
/// <typeparam name="T">数据类型</typeparam>
/// <typeparam name="Tkey">数据类型T的字段</typeparam>
/// <param name="array">数据类型T的数组</param>
/// <param name="selectHandler">选择委托的对象</param>
/// <returns>返回T类型的数组中字段Tkey最大的数据</returns>
public static T Max<T, Tkey>(T[] array, SelectHandler<T, Tkey> selectHandler)where Tkey : IComparable<Tkey>
{T temp = array[0];for (int i = 1; i < array.Length; ++i){//将委托已经取得数据类型的属性的进行比较if (selectHandler(temp).CompareTo(selectHandler(array[i])) < 0){temp = array[i];}}return temp;
}/// <summary>
/// 查找最小值
/// </summary>
/// <typeparam name="T">数据类型</typeparam>
/// <typeparam name="Tkey">数据类型T的字段</typeparam>
/// <param name="array">数据类型T的数组</param>
/// <param name="selectHandler">选择委托的对象</param>
/// <returns>返回T类型的数组中字段Tkey最大的数据</returns>
public static T Min<T, Tkey>(T[] array, SelectHandler<T, Tkey> selectHandler)where Tkey : IComparable<Tkey>
{T temp = array[0];for (int i = 1; i < array.Length; ++i){//将委托已经取得数据类型的属性的进行比较if (selectHandler(temp).CompareTo(selectHandler(array[i])) > 0){temp = array[i];}}return temp;
}
2)查找满足条件的单个对象
/// <summary>
/// 查找条件委托 表示一个查找条件
/// 数据t是否满足某个条件
/// </summary>
/// <typeparam name="T">数据类型</typeparam>
/// <param name="t">数据类型T的对象</param>
/// <returns>bool值</returns>
public delegate bool FindHandler<T>(T t);//注意是写在类外/// <summary>
/// 查找单个(第一个)满足条件的对象
/// </summary>
/// <typeparam name="T">数据类型</typeparam>
/// <param name="array">数据类型T的数组</param>
/// <param name="findHandler">查找条件委托</param>
/// <returns>返回第一个满足条件的类型为T的对象</returns>
public static T Find<T>(T[] array, FindHandler<T> findHandler)
{T temp = default;for (int i = 0; i < array.Length; ++i){if (findHandler(array[i])){return array[i];}}return temp;
}
3)查找满足条件的所有对象
/// <summary>
/// 查找满足条件的所有对象
/// </summary>
/// <typeparam name="T">数据类型</typeparam>
/// <param name="array">数据类型T的数组</param>
/// <param name="findHandler">查找条件委托</param>
/// <returns>返回 所有 满足条件的,类型为T的 对象</returns>
///
public static T[] FindAll<T>(T[] array, FindHandler<T> findHandler)
{List<T> res = new List<T>();for (int i = 0; i < array.Length; ++i){if (findHandler(array[i])){res.Add(array[i]);}}return res.ToArray();
}
4)选取数组中所有对象的某一字段
/// <summary>
/// 选取数组中所有对象的某一字段
/// </summary>
/// <typeparam name="T">数据类型</typeparam>
/// <typeparam name="Tkey">数据类型T的字段</typeparam>
/// <param name="array">数据类型T的数组</param>
/// <param name="selectHandler">选择委托的对象</param>
/// <returns>返回数组中所有对象的某一字段组成的数组</returns>
public static Tkey[] Select<T, Tkey>(T[] array, SelectHandler<T, Tkey> selectHandler)
{Tkey[] res = new Tkey[array.Length];for (int i = 0; i < array.Length; ++i){res[i] = selectHandler(array[i]);}return res;
}
完整代码
using System;
using System.Collections.Generic;/// <summary>
/// 选择委托
/// 返回数据类型T的属性Tkey的值
/// </summary>
/// <typeparam name="T">数据类型</typeparam>
/// <typeparam name="Tkey">数据类型T的字段</typeparam>
/// <returns>选择的属性</returns>
public delegate TKey SelectHandler<T, TKey>(T t);/// <summary>
/// 查找条件委托 表示一个查找条件
/// 数据t是否满足某个条件
/// </summary>
/// <typeparam name="T">数据类型</typeparam>
/// <param name="t">数据类型T的对象</param>
/// <returns>bool值</returns>
public delegate bool FindHandler<T>(T t);/// <summary>
/// 数组助手类
/// 排序:升序 降序
/// 查找:最大 最小 单个 全部...
/// </summary>
public static class ArrayHelper
{/// <summary>/// 升序排序(冒泡排序)/// 使用委托对任何数据类型数组进行排序/// </summary>/// <typeparam name="T">数据类型</typeparam>/// <typeparam name="Tkey">数据类型T的字段</typeparam>/// <param name="array">数据类型T的数组</param>/// <param name="selectHandler">选择委托的对象</param>public static void OrderBy<T, Tkey>(T[] array, SelectHandler<T, Tkey> selectHandler)where Tkey : IComparable<Tkey>{for (int i = 0; i < array.Length; ++i){for (int j = i + 1; j < array.Length; ++j){//将委托已经取得数据类型的属性的进行比较if (selectHandler(array[i]).CompareTo(selectHandler(array[j])) > 0){T temp = array[i];array[i] = array[j];array[j] = temp;}}}}/// <summary>/// 降序排序(冒泡排序)/// 使用委托对任何数据类型数组进行排序/// </summary>/// <typeparam name="T">数据类型</typeparam>/// <typeparam name="Tkey">数据类型T的字段</typeparam>/// <param name="array">数据类型T的数组</param>/// <param name="selectHandler">选择委托的对象</param>public static void OrderByDescending<T, Tkey>(T[] array, SelectHandler<T, Tkey> selectHandler)where Tkey : IComparable<Tkey>{for (int i = 0; i < array.Length; ++i){for (int j = i + 1; j < array.Length; ++j){//将委托已经取得数据类型的属性的进行比较if (selectHandler(array[i]).CompareTo(selectHandler(array[j])) < 0){T temp = array[i];array[i] = array[j];array[j] = temp;}}}}/// <summary>/// 查找最大值/// </summary>/// <typeparam name="T">数据类型</typeparam>/// <typeparam name="Tkey">数据类型T的字段</typeparam>/// <param name="array">数据类型T的数组</param>/// <param name="selectHandler">选择委托的对象</param>/// <returns>返回T类型的数组中字段Tkey最大的数据</returns>public static T Max<T, Tkey>(T[] array, SelectHandler<T, Tkey> selectHandler)where Tkey : IComparable<Tkey>{T temp = array[0];for (int i = 1; i < array.Length; ++i){//将委托已经取得数据类型的属性的进行比较if (selectHandler(temp).CompareTo(selectHandler(array[i])) < 0){temp = array[i];}}return temp;}/// <summary>/// 查找最小值/// </summary>/// <typeparam name="T">数据类型</typeparam>/// <typeparam name="Tkey">数据类型T的字段</typeparam>/// <param name="array">数据类型T的数组</param>/// <param name="selectHandler">选择委托的对象</param>/// <returns>返回T类型的数组中字段Tkey最大的数据</returns>public static T Min<T, Tkey>(T[] array, SelectHandler<T, Tkey> selectHandler)where Tkey : IComparable<Tkey>{T temp = array[0];for (int i = 1; i < array.Length; ++i){//将委托已经取得数据类型的属性的进行比较if (selectHandler(temp).CompareTo(selectHandler(array[i])) > 0){temp = array[i];}}return temp;}/// <summary>/// 查找(单个)第一个满足条件的对象/// </summary>/// <typeparam name="T">数据类型</typeparam>/// <param name="array">数据类型T的数组</param>/// <param name="findHandler">查找条件委托</param>/// <returns>返回第一个满足条件的类型为T的对象</returns>public static T Find<T>(T[] array, FindHandler<T> findHandler){T temp = default;for (int i = 0; i < array.Length; ++i){if (findHandler(array[i])){return array[i];}}return temp;}/// <summary>/// 查找所有满足条件的对象/// </summary>/// <typeparam name="T">数据类型</typeparam>/// <param name="array">数据类型T的数组</param>/// <param name="findHandler">查找条件委托</param>/// <returns>返回所有满足条件的类型为T的对象</returns>/// public static T[] FindAll<T>(T[] array, FindHandler<T> findHandler){List<T> res = new List<T>();for (int i = 0; i < array.Length; ++i){if (findHandler(array[i])){res.Add(array[i]);}}return res.ToArray();}/// <summary>/// 选取数组中所有对象的某一字段/// </summary>/// <typeparam name="T">数据类型</typeparam>/// <typeparam name="Tkey">数据类型T的字段</typeparam>/// <param name="array">数据类型T的数组</param>/// <param name="selectHandler">选择委托的对象</param>/// <returns>返回数组中所有对象的某一字段组成的数组</returns>public static Tkey[] Select<T, Tkey>(T[] array, SelectHandler<T, Tkey> selectHandler){Tkey[] res = new Tkey[array.Length];for (int i = 0; i < array.Length; ++i){res[i] = selectHandler(array[i]);}return res;}
}
测试
1.测试代码
排序功能测试可查看【一文读懂】C#如何实现通用的排序功能,如下是对数组工具类的查找功能进行测试
using System;
using UnityEngine;namespace ArrayHelperTest
{public class ArrayHelperTest : MonoBehaviour{public void Start(){int[] intArray = { 4, 1, 5, 0 };string[] stringArray = { "2", "a", "ab", "hello", "0" };Student[] studentArray ={new Student(){ Id=1001,Name="张三",Age=20 },new Student(){ Id=1003,Name="李四",Age=18 },new Student(){ Id=1002,Name="赵六",Age=21 },new Student(){ Id=1000,Name="王五",Age=19 },new Student(){ Id=1004,Name="孙七",Age=18 }};//查找//1)查找最值:最大值,最小值FindMaxAndMinTest<int, int>(intArray, value => value );FindMaxAndMinTest<string, string>(stringArray, value => value);FindMaxAndMinTest<Student, int>(studentArray, student => student.Id);FindMaxAndMinTest<Student, string>(studentArray, student => student.Name);//2)查找满足条件的单个对象(第一个)ArrayHelper.Find<int>(intArray, value => value > 0);ArrayHelper.Find<string>(stringArray, value => value == "a");ArrayHelper.Find<Student>(studentArray, student => student.Age==18);//3)查找满足条件的所有对象Student[] students = ArrayHelper.FindAll<Student>(studentArray, student => student.Age == 18);string studentStr = "";foreach (var student in students){studentStr += student.Id + " " + student.Name + " " + student.Age + "\n";}Debug.Log(studentStr);//4)选取数组中所有对象的某一字段string[] names= ArrayHelper.Select<Student,string>(studentArray, student => student.Name);string nameStr = "";foreach (var name in names){nameStr += name+" ";}Debug.Log(nameStr);}private void FindMaxAndMinTest<T, Tkey>(T[] array, SelectHandler<T, Tkey> selectHandler) where Tkey : IComparable<Tkey>{Debug.Log(array.GetType() + "测试:\n"+"最小值:" + ArrayHelper.Min<T, Tkey>(array, selectHandler)+" 最大值:" + ArrayHelper.Max<T, Tkey>(array, selectHandler));}}public class Student{public int Id { get; set; }public string Name { get; set; }public int Age { get; set; }}
}
2.测试结果
好了,本次的分享到这里就结束啦,希望对你有所帮助~
相关文章:
C#自定义工具类-数组工具类
目录 数组工具类基本操作 1.排序:升序,降序 2.查找 1)查找最值:最大值,最小值 2)查找满足条件的单个对象 3)查找满足条件的所有对象 4)选取数组中所有对象的某一字段 完整代…...
18年408数据结构
第一题: 解析:这道题很简单,按部就班的做就可以了。 画出S1,S2两个栈的情况: 第一轮: S1: S2: 2 3 - 8 * 5 从S1中依次弹…...
Android 通过自定义注解实现Activity间跳转时登录路由的自动拦截
应用场景 在Android 中部分软件需要登录才能使用,但是有的页面又不需要登录,Android不同于Web可以直接拦截重定向路由,因此如果在Android中如果需要检测是否登录,如果没登录跳转登录的话就需要再每个页面中判断,当然也…...
安全开发指南
1. 准备工作与培训 安全文化与意识:建立并强化组织的安全文化,对所有成员进行安全意识培训。安全策略与标准:制定明确的安全开发策略、标准和流程,包括代码审查、安全测试、事件响应等。工具与技术选择:选择合适的开发…...
【word脚注】双栏设置word脚注,脚注仅位于左栏,右栏不留白
【word脚注】双栏设置word脚注,脚注仅位于左栏,右栏不留白 调整前效果解决方法调整后效果参考文献 调整前效果 调整前:脚注位于左下角,但右栏与左栏内容对其,未填充右下角的空白区域 解决方法 备份源文件复制脚注内…...
ROS学习笔记(三):VSCode集成开发环境快速安装,以及常用扩展插件配置
文章目录 前言VSCode集成开发环境1 安装VSCode2 VSCode扩展插件2.1 VSCode扩展插件模块介绍2.1 常用扩展插件配置一、语言支持类插件二、智能辅助类插件三、科学计算与数据分析类插件四、ROS开发相关插件 3 总结相关链接 前言 关于Ubuntu与ROS的常规安装,可以看这几…...
论文精读--Two-Stream Convolutional Networks for Action Recognition in Videos
对于单张图片,丢进卷积和全连接层直接得出分类结果就行 但对于视频,早期的一些工作把视频中的一些关键帧抽取出来,把一个个帧通过网络,最后把结果合并,或者把帧叠起来,一起丢进网络。在网络中进行early fu…...
JAVA姓氏头像情侣头像家庭头像签名头像谐音顽埂头像设计小程序头像大全系统小程序源码
姓氏头像到谐音梗,打造你的专属头像大全系统 🎨✨ 👨👩👧👦 家庭头像:记录温馨瞬间 在这个充满爱的时代,用一张家庭头像来记录你和家人的美好瞬间吧!我们的“姓氏…...
UE5.4.3 Replay 重播回放系统
工程的配置文件DefaultEngine.ini中需要加入 +NetDriverDefinitions=(DefName=“DemoNetDriver”,DriverClassName=“/Script/Engine.DemoNetDriver”,DriverClassNameFallback=“/Script/Engine.DemoNetDriver”) 此步骤将启用并加载DemoNetDriver .ini添加示例 [/Script/En…...
深入掌握 Protobuf 与 RPC 的高效结合:实现C++工程中的高效通信
目录 一、Protobuf与RPC框架的通信流程概述二、Protobuf与RPC在C中的实际应用2.1 定义 .proto 文件2.2 编译 .proto 文件生成C代码2.3 实现服务器端逻辑2.4 实现客户端逻辑2.5 使用CMake构建工程2.6 编译与运行2.7 关键组件解析2.8 序列化与反序列化的实现 三、关键实现与解析四…...
录屏软件大比拼:四款必备工具助你轻松录制精彩瞬间!
哎呀,说到电脑录屏这事儿,我这个办公室小文员可是深有体会啊!平时工作里,经常需要录个会议啊、做个教程啊,或者分享个操作技巧给同事们看。市面上的录屏软件多得数不清,但我最常用的几款工具。今天就来跟大…...
计算机毕业设计宠物领养网站我的发布领养领养用户信息/springboot/javaWEB/J2EE/MYSQL数据库/vue前后分离小程序
目录 1.课题背景 2.课题意义 3.技术介绍 4.技术性需求 4.1后端服务: 4.2 前端展示 5.数据库设计: 6.系统性能: 7.安全性: 8. 功能介绍: 9. 部分代码 1.课题背景 近年来,随着宠物饲养数量…...
用示波器测动态滞回线
大学物理(下)实验-中南民族大学通信工程2022级 手动逐个处理数据较为麻烦且还要绘图,故想到用pythonmatplotlib来计算结果并数据可视化。 代码实现 import matplotlib.pyplot as plt# 样品一磁化曲线 X [0, 0.2, 0.4, 0.6, 0.8, 1, 1.5, 2.…...
【JDK动态代理】JDK动态代理:为何只能代理接口和接口实现类
在Java开发中,JDK动态代理是一种非常有用的技术,它允许开发者在不修改目标类代码的情况下,为目标类添加额外的功能。然而,JDK动态代理的使用有一些限制,特别是它只能代理接口和接口实现类。本文将深入探讨这一限制的原…...
MFC工控项目实例二十一型号选择界面删除参数按钮禁用切换
承接专栏《MFC工控项目实例二十手动测试界面模拟量输入实时显示》 对于禁止使用的删除、参数按钮,在选中列表控件选项时切换为能够使用。 1、在TypDlg.h文件中添加代码 #include "ShadeButtonST.h" #include "BtnST.h" class CTypDlg : publi…...
前端框架对比和选择指南
前端框架对比和选择指南 随着 Web 开发技术的快速发展,前端框架已经成为了现代 Web 开发的核心工具之一。它们为开发人员提供了快速构建高效、交互性强的应用的基础。当前流行的前端框架主要包括 React.js、Vue.js 和 Angular.js。在这篇技术博客中,我们…...
人工智能价格战——如何降低成本让人工智能更易于普及
十年前,开发人工智能 (AI) 是只有大公司和资金充足的研究机构才能负担得起的事情。必要的硬件、软件和数据存储成本非常高。但从那时起,情况发生了很大变化。一切始于 2012 年的 AlexNet,这是一种深度学习模型,展示了神经网络的真…...
企业间图文档发放:如何在保障安全的同时提升效率?
不管是大型企业,还是小型创业公司,不论企业规模大小,每天都会有大量的图文档发放,对内传输协作和对外发送使用,数据的生产也是企业业务生产力的体现之一。 伴随着业务范围的不断扩大,企业与客户、合作伙伴之…...
深入解析 ConcurrentHashMap:从 JDK 1.7 到 JDK 1.8
✨探索Java基础 ConcurrentHashMap✨ 引言 ConcurrentHashMap 是 Java 中一个线程安全的高效 Map 集合。它在多线程环境下提供了高性能的数据访问和修改能力。本文将详细探讨 ConcurrentHashMap 在 JDK 1.7 和 JDK 1.8 中的不同实现方式,以及它们各自的优缺点。 …...
VS code user setting 与 workspace setting 的区别
VS code user setting 与 workspace setting 的区别 引言正文引言 相信有不少开始接触 VS code 的小伙伴会有疑问,user setting 与 workspace setting 有什么区别呢?这里我们来说明一下 正文 首先,当我们使用 Ctrl + Shift + P 打开搜索输入 setting 后,可以弹出 4 个se…...
网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...
