C#自定义工具类-数组工具类

news2024/11/23 8:16:52

目录

数组工具类基本操作

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.测试结果

        好了,本次的分享到这里就结束啦,希望对你有所帮助~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2182299.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

河南做网站与SEO:如何提升搜索引擎排名

河南做网站与SEO&#xff1a;如何提升搜索引擎排名 在当今数字化时代&#xff0c;越来越多的企业意识到互联网的重要性&#xff0c;特别是在河南这样一个快速发展的地区&#xff0c;建立一个优秀的网站已经成为企业发展的必要条件。而在建立网站的同时&#xff0c;SEO&#xff…

--- java数据结构 map set ---

java中map 和 set的底层实现是通过搜索树和哈希函桶来实现 搜索树 二叉搜索树有叫二叉排序树 他具有以下的特点 若存在左节点&#xff0c;那么他左节点的值一定小于根节点 若存在右节点&#xff0c;那么他右节点的值一定大于根节点 它的左右子树也是搜索树 对他进行中序…

leetcode热题100.最长公共子序列

题目 1143. 最长公共子序列 - 力扣&#xff08;LeetCode&#xff09; 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原…

SOMEIP_ETS_143: SD_Request_non_existing_ServiceID

测试目的&#xff1a; 验证DUT能够拒绝一个请求不存在的服务ID&#xff08;ServiceID&#xff09;的SubscribeEventgroup消息&#xff0c;并以SubscribeEventgroupNAck作为响应。 描述 本测试用例旨在确保DUT遵循SOME/IP协议&#xff0c;当接收到一个请求不存在服务ID的Subs…

RS485串口通信:【图文详讲】

RS485&#xff0c;RS的意义为Recommended Standard的缩写&#xff0c;也就是推荐标准&#xff0c;是一种常用的半双工-异步-串行通信总线。半双工的意思就是两者通信时&#xff0c;同一时刻&#xff0c;只能由其中一方发送&#xff0c;另一方只能接收&#xff0c;不可以同时收发…

vue3 antdv3/4 Modal显示一个提示,内容换行显示。

1、官网地址&#xff1a; Ant Design Vue — An enterprise-class UI components based on Ant Design and Vue.js 2、显示个信息&#xff1a; Modal.info({title: This is a notification message,content: h(div, {}, [h(p, some messages...some messages...),h(p, some …

基于解压缩模块的JPEG同步重压缩检测论文学习

一、论文基本信息&#xff1a; 论文题目&#xff1a;基于解压缩模块的JPEG同步重压缩检测 作者&#xff1a;王金伟1 &#xff0c;胡冰涛1 &#xff0c;张家伟1 &#xff0c;马 宾2 &#xff0c;罗向阳3 &#xff08;1.南京信息工程大学计算机学院、网络空间安全学院&#xf…

Linux-L11-查看本机ip地址

linux查看ip地址 查看自己的IP地址使用 ip 命令&#xff1a;使用 ifconfig 命令使用 hostname 命令&#xff1a;使用 nmcli 命令 查看某个特定接口的IP查看公网IP地址 在Linux系统中&#xff0c;查看自己的IP地址可以通过多种方式实现&#xff0c;这里提供几种常用的方法&#…

Stable Diffusion绘画 | LCM模型:实现秒出图

在过往&#xff0c;不管使用 SD 还是 MJ&#xff0c;生成一张图片起码要等上10秒。 而现在&#xff0c;有了 LCM 技术的加持&#xff0c;已经能做到秒出图&#xff0c;甚至是实时出图。 LCM(潜空间一致性模型) 是由 清华大学信息科学技术研究院 研发的大模型&#xff0c;它最…

鸿蒙 如何退出 APP

terminateSelf() 停止Ability自身 在EntryAbility中这么使用 this.context.terminateSelf()在Pages页面中这么使用 import { common } from kit.AbilityKit (getContext(this) as common.UIAbilityContext)?.terminateSelf() 也可以直接封装&#xff1a; import common f…

【GreenHills】GHS的Run-Time检查功能

【更多软件使用问题请点击亿道电子官方网站】 一、文档背景 在编写代码时&#xff0c;内存检查的重要性不容忽视。内存是程序运行的核心资源之一&#xff0c;负责存储程序运行所需的数据。由于内存资源的有限性和操作的复杂性&#xff0c;内存错误常常会直接导致程序崩溃、性…

华为开源自研AI框架昇思MindSpore应用案例:基于MindSpore框架的Swin Transformer

如果你对MindSpore感兴趣&#xff0c;可以关注昇思MindSpore社区 模型简介 模型背景 Swin Transfromer在2021年首次发表于论文《Swin Transformer: Hierarchical Vision Transformer using Shifted Windows》&#xff0c;目前已用于图像分割、分类等计算机视觉领域的各项任务…

如何搭建医疗陪诊平台?基于互联网医院系统源码的开发技术详解

本篇文章&#xff0c;小编将深入探讨医疗陪诊平台的搭建过程&#xff0c;尤其是基于互联网医院系统源码的开发技术&#xff0c;以期为有志于此领域的开发者提供参考。 一、选择合适的互联网医院系统源码 在搭建医疗陪诊平台时&#xff0c;选择合适的互联网医院系统源码至关重…

【前端开发入门】前端开发环境配置

目录 引言一、Vscode编辑器安装1. 软件下载2. 软件安装3. 插件安装 二、Nodejs环境安装及版本控制1. 安装内容2. 使用nvm安装2.1 软件下载并安装2.2 nvm基本指令2.3 nvm下载过慢导致超时解决 三、git安装及配置1. 软件下载2. 软件安装3. 基础配置 四、总结 引言 本系列教程旨在…

SRC漏洞挖掘 | 针对Spring-Boot 框架漏洞的初探

&#x1f497;想加内部圈子&#xff0c;请联系我&#xff01; &#x1f497;文章交流&#xff0c;请联系我&#xff01;&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 一个想当文人的黑客 &#xff0c;很高兴认识大家~ ✨主…

fmt:C++ 格式化库

fmt 是一个现代化、快速且安全的 C 格式化库&#xff0c;专注于高效地格式化文本。它提供了类似 Python 的 format 功能&#xff0c;但具有更高的性能和类型安全特性。fmt 库在处理字符串格式化、日志输出以及构建用户友好的输出时尤为强大。自从 C20 标准引入 std::format 后&…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《故障扰动下的风火储送端系统频率动态特性与储能容量优化配置》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

婚前协议模版(琴生生物机械科技工业研究所)

婚前协议示例 本协议由甲方&#xff08;全名&#xff09;&#xff0c;身份证号码&#xff08; _________ &#xff09;&#xff0c;与乙方&#xff08;全名&#xff09;&#xff0c;身份证号码&#xff08; _________ &#xff09;&#xff0c;在平等、自愿、相互尊重及充分沟…

DataEase v2 开源代码 Windows 从0到1环境搭建

一、环境准备 功能名称 描述 其它 操作系统 Windows 数据库 Mysql8.0 开发环境 JDK17以上 本项基于的21版本开发 Maven 3.9版本 开发工具 idea2024.2版本 前端 VSCode TIPS&#xff1a;如果你本地有jdk8版本&#xff0c;需要切换21版本&#xff0c;请看…

[python] 基于PyOD库实现数据异常检测

PyOD是一个全面且易于使用的Python库&#xff0c;专门用于检测多变量数据中的异常点或离群点。异常点是指那些与大多数数据点显著不同的数据&#xff0c;它们可能表示错误、噪声或潜在的有趣现象。无论是处理小规模项目还是大型数据集&#xff0c;PyOD提供了50多种算法以满足用…