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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

查缺补漏----程序查询方式和中断方式计算题

1.程序查询方式 总结下来就是&#xff1a; 必须在外设传输完端口大小的数据时访问端口&#xff0c;以防止数据未被及时读出而丢失。 占CPU总时间&#xff1a;就是某段时间内设备用了多少时钟周期/PCU有多少个时钟周期 CPU的时钟周期数&#xff1a;就看主频&#xff0c;主频表示…

大数据开发--1.1大数据概论

目录 一.大数据的概念 什么是大数据&#xff1f; 二. 大数据的特点 三. 大数据应用场景 四. 大数据分析业务步骤 大数据分析的业务流程&#xff1a; 五.大数据职业规划 职业方向 岗位技术要求 六. 大数据学习路线 一.大数据的概念 什么是大数据&#xff1f; 数据 世界…

Spring Boot技术:构建高效网上购物平台

第3章 系统分析 3.1 可行性分析 在系统开发之初要进行系统可行分析&#xff0c;这样做的目的就是使用最小成本解决最大问题&#xff0c;一旦程序开发满足用户需要&#xff0c;带来的好处也是很多的。下面我们将从技术上、操作上、经济上等方面来考虑这个系统到底值不值得开发。…

车辆重识别(注意力 U-Net:学习在哪些区域寻找胰腺)论文阅读2024/10/01

什么是注意力机制&#xff1f; 什么是加性注意力&#xff1f; 大致说一下流程&#xff1a; 对于一张特征图来说&#xff0c;对于这张图中的每一个像素向量&#xff08;例如a&#xff09;&#xff0c;计算该向量与所有像素向量的相似度&#xff0c;对这些相似度进行激活函数…

【重学 MySQL】四十五、数据库的创建、修改与删除

【重学 MySQL】四十五、数据库的创建、修改与删除 一条数据存储的过程数据输入数据验证数据处理数据存储数据持久化反馈与日志注意事项 标识符命名规则基本规则长度限制保留字与特殊字符命名建议示例 MySQL 中的数据类型创建数据库创建数据库时指定字符集和排序规则 查看数据库…

数据库重建索引的作用?

重建索引是数据库管理中的一个重要操作&#xff0c;主要用于优化数据库性能和提高查询效率。以下是重建索引的一些主要用途&#xff1a; 提高查询性能&#xff1a;随着时间的推移&#xff0c;数据的插入、更新和删除会导致索引碎片化&#xff0c;重建索引可以减少碎片&#xf…

DNS with libevent

DNS with libevent: high-level and low-level functionality libevent提供了少量用于解析DNS名字的API&#xff0c;以及用于实现简单DNS服务器的机制。 我们从用于名字查询的高层机制开始介绍&#xff0c;然后介绍底层机制和服务器机制。 Portable blocking name resolution…

15年408计算机网络

第一题&#xff1a; 解析&#xff1a; 接收方使用POP3向邮件服务器读取邮件&#xff0c;使用的TCP连接&#xff0c;TCP向上层提供的是面向连接的&#xff0c;可靠的数据传输服务。 第二题&#xff1a; 解析&#xff1a;物理层-不归零编码和曼彻斯特编码 编码1&#xff1a;电平在…

CSS中字体图标的使用

引言&#xff1a; 在网页设计当中&#xff0c;会有很多很简洁的图标&#xff0c;比如箭头&#xff0c;照相机&#xff0c;放大镜等 这些大概率都是使用字体图标来完成的&#xff0c;因为字体图标比较简洁高效&#xff0c;不会像图片一样需要向浏览器请求数据。那么字体图标该…

网络协议详解--IPv6

IPv6产生背景 &#xff08;1&#xff09;地址空间的耗尽&#xff1a;因特网呈指数级发展&#xff0c;导致IPv4地址空间几乎耗尽。虽然采用了子网划分、CIDR和NAT地址转换技术&#xff0c;但这没有从根源解决地址耗尽的问题 &#xff08;2&#xff09;IP层安全需求的增长&#x…

Oracle exadata存储节点更换内存操作及报错处理

1.报错信息 在进行Oracle exadata巡检时&#xff0c;发现cell节点有一根内存报错&#xff0c;报错信息如下&#xff1a; 报错内存位置为&#xff1a;CPU1 P1/D2槽位 报错内存信息&#xff1a; 根据报错信息确认内存PN号、大小等息&#xff0c;并将信息反馈公司&#xff0c;及…

Hadoop框架及应用场景说明

Hadoop是一个开源的分布式系统基础架构。由多个组件组成&#xff0c;组件之间协同工作&#xff0c;进行大规模数据集的存储和处理。 本文将探讨Hadoop的架构以及应用场景。 一Hadoop框架 Hadoop的核心组件包含&#xff1a; 1. Hadoop分布式文件系统&#xff08;HDFS&#xff…

Qt --- 常用控件的介绍---Widget属性介绍

一、控件概述 编程&#xff0c;讲究的是站在巨人的肩膀上&#xff0c;而不是从头发明轮子。一个图形化界面上的内容&#xff0c;不需要咱们全都从零区实现&#xff0c;Qt中已经提供了很多内置的控件了&#xff08;按钮&#xff0c;文本框&#xff0c;单选按钮&#xff0c;复选…

【Java SE 题库】移除元素(暴力解法)--力扣

&#x1f525;博客主页&#x1f525;&#xff1a;【 坊钰_CSDN博客 】 欢迎各位点赞&#x1f44d;评论✍收藏⭐ 目录 1. 题目 2. 解法(快慢“指针”) 3. 源码 4. 小结 1. 题目 给你一个数组 nums 和一个值 val&#xff0c;你需要原地移除所有数值等于 val 的元素。元素的顺…

C0007.Clion中添加ui文件及运行的完整步骤

1.创建ui文件 选择Ui文件目录&#xff0c;右击&#xff0c;打开Qt Designer&#xff1b; 创建完成后&#xff0c;保存ui界面&#xff0c;并且命名为test.ui&#xff1b; 2.新建头文件test.h 在include目录中&#xff0c;新建头文件&#xff0c;文件名为test.h 3.新建test.…

神点SAAS云财务系统/多账套/前后端全开源

>>>系统简述&#xff1a; 神点SAAS云财务软件开源版&#xff0c;包含账套、凭证字、科目、期初、币别、账簿、报表、凭证、结账等功能。 神点云财务系统&#xff0c;餐饮行业财务软件、微服务架构财务软件、开源云财务软件、Java全开源财务软件优选&#xff01; >…

「轻盈」之旅:OOM故障重现与解决

前期准备 本项目均采用 VisualVM 2.1.10 进行dump文件的分析。JDK1.8及之前所在目录的bin目录下有自带的VisualVM&#xff0c;JDK1.8以后需要自行手动安装下载。 下载地址&#xff1a;https://visualvm.github.io/download.html IDEA插件配置&#xff1a;在Plugins里搜索visual…

CSS文本格式化

通过 CSS 中的文本属性您可以像操作 Word 文档那样定义网页中文本的字符间距、对齐方式、缩进等等&#xff0c;CSS 中常用的文本属性如下所示&#xff1a; text-align&#xff1a;设置文本的水平对齐方式&#xff1b;text-decoration&#xff1a;设置文本的装饰&#xff1b;te…

Vue项目开发注意事项

事项一&#xff1a;项目代码放在本地怎么运行起来 1、首先确定项目对应的node和npm版本 node下载地址 Index of /dist/https://nodejs.org/dist/ node 与 npm版本对应关系 Node.js — Node.js Releases 2、node卸载的时候&#xff0c;会自动把对应的npm卸载掉 情况1&…

光控资本:股票后边带个u是啥意思,常见股票后缀字母还有哪些?

股票后面带有字母U标明该股票发行人到目前为止还没有盈利&#xff0c;这是根据上交所发布的《关于科创板股票及存托凭证生意相关事项的奉告》中的规则&#xff0c;在上市后实现初度盈利&#xff0c;这个标识就会消除掉。一般是在科创板上市的股票会有U的标明&#xff0c;且一般…