C# 数组/集合排序

news2024/11/16 5:50:18

一:基础类型集合排序

/// <summary>
/// 排序
/// </summary>
/// <param name="isReverse">顺序是否取反</param>
public static void Sort<T>(this IList<T> array, bool isReverse = false)
	where T : IComparable
{
    var count = array.Count;
    for (int i = 0; i < count; i++)
    {
        for (int j = 0; j < count; j++)
        {
            var k = j + 1;
            if (k >= count)
                break;

            if (!isReverse)
            {
                if (array[j].CompareTo(array[k]) == 1)
                    (array[j], array[k]) = (array[k], array[j]);
            }
            else
            {
                if (array[j].CompareTo(array[k]) == -1)
                    (array[j], array[k]) = (array[k], array[j]);
            }
        }
    }
}

测试:

if (Input.GetKeyDown(KeyCode.Space))
{
    // 字符串数组
    var strArray = new[] {"8", "1", "J", "D","A", "B1"};
    strArray.Sort(true);
    string str0 = "";
    for (int i = 0; i < strArray.Length; i++)
    {
        str0 += strArray[i] + ((i + 1 < strArray.Length) ? "、" : "");
    }
    Debug.LogError(str0);
                
                
    // int数组
    var intArray = new[] {8, 1, 10, 5, 9, 7};
    intArray.Sort();
    string str1 = "";
    for (int i = 0; i < intArray.Length; i++)
    {
        str1 += intArray[i] + ((i + 1 < intArray.Length) ? "、" : "");
    }
    Debug.LogError(str1);
}

在这里插入图片描述

二:排序扩展(根据某个类型排序)

[System.Runtime.InteropServices.ComVisible(true)]
public interface IComparableByEnum : IComparable
{
    int CompareTo(Enum sortEnum, object compareObj);
}

/// <summary>
/// 排序
/// </summary>
/// <param name="sortEnum">依据什么类型排序</param>
/// <param name="isReverse">顺序是否取反</param>
public static void Sort<T>(this IList<T> array, Enum sortEnum, bool isReverse = false)
    where T : IComparableByEnum
{
    var count = array.Count;
    for (int i = 0; i < count; i++)
    {
        for (int j = 0; j < count; j++)
        {
            var k = j + 1;
            if (k >= count)
                break;

            if (!isReverse)
            {
                if (array[j].CompareTo(sortEnum, array[k]) == 1)
                    (array[j], array[k]) = (array[k], array[j]);
            }
            else
            {
                if (array[j].CompareTo(sortEnum, array[k]) == -1)
                    (array[j], array[k]) = (array[k], array[j]);
            }
        }
    }
}
public enum SortType
{
    Id,
    Name,
}
        
public class MyClass : IComparableByEnum
{
    public int id;
    public string name;

    public MyClass(int _id, string _name)
    {
        id = _id;
        name = _name;
    }

    public int CompareTo(object obj)
    {
        return CompareTo(MySortType.Id, obj);
    }

    public int CompareTo(Enum sortEnum, object compareObj)
    {
        if (!(sortEnum is SortType sortType))
            return -1;

        if (!(compareObj is MyClass value))
            throw new ArgumentException($"参数不是{nameof(MyClass)}类型");

        return sortType switch
        {
            SortType.Id => id.CompareTo(value.id),
            SortType.Name => string.Compare(name, value.name, StringComparison.CurrentCulture),
            _ => throw new ArgumentException($"排序类型出错{sortType}")
        };
    }
}

测试:

private void Update()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
        var list = new List<MyClass>()
        {
            new MyClass(5,"Zz"),
            new MyClass(86,"C"),
            new MyClass(1,"Aa"),
            new MyClass(0,"Bb"),
            new MyClass(20,"Tt"),
        };
                
        list.Sort(SortType.Id);
        string str0 = "";
        for (int i = 0; i < list.Count; i++)
        {
            str0 += $"{list[i].id};{list[i].name}" + (i + 1 < list.Count? "、" : "");
        }
        Debug.LogError(str0);

        list.Sort(SortType.Name);
        string str1 = "";
        for (int i = 0; i < list.Count; i++)
        {
            str1 += $"{list[i].name};{list[i].id}" + (i + 1 < list.Count? "、" : "");
        }
        Debug.LogError(str1);
    }
}

在这里插入图片描述

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

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

相关文章

Linux下多线程的相关概念

&#x1f916;个人主页&#xff1a;晚风相伴-CSDN博客 &#x1f496;如果觉得内容对你有帮助的话&#xff0c;还请给博主一键三连&#xff08;点赞&#x1f49c;、收藏&#x1f9e1;、关注&#x1f49a;&#xff09;吧 &#x1f64f;如果内容有误或者有写的不好的地方的话&…

py黑帽子学习笔记_scapy

简介 代码简洁&#xff1a;相比于前两个博客总结&#xff0c;很多socket操作&#xff0c;如果使用scapy仅需几行代码即可实现 获取邮箱身份凭证 编写基础嗅探器&#xff0c;脚本可显示任何收到的一个包的详细情况 直接运行 尝试监听邮件收发&#xff0c;监听指定端口&#x…

2024年03月 Python(六级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,共50分) 第1题 以下选项中,创建类正确的是?() A: class test1: def prt(self): …… B: class Mg(): def__init__(na,ag): self.na=na C: class A(): def print(self): print(“Yes”) a=A() a.print() D…

理解多线程看这一篇就够了

一、基本概念与关系 程序 程序是含有指令和数据的文件&#xff0c;静态地存储在磁盘等存储设备上。它是软件的实体&#xff0c;但未被激活。 进程 进程是程序的一次执行过程&#xff0c;是系统运行程序的基本单位。当程序被操作系统加载并执行时&#xff0c;就成为一个进程&a…

Kprobe实现原理

kprobe其实就是将某个要检测的指令备份&#xff0c;再替换成int3(x86)或者未定义指令(arm)来触发异常&#xff0c;再调用对应体系的异常处理函数来执行我们自定义的hook&#xff0c;执行完我们自定义的hook,再将备份的指令放回原来的位置继续往下执行 下面我们就来看下linux内核…

拍视频麦克风什么牌子好?户外无线麦克风哪个牌子好,看本期文章

​无线领夹麦克风&#xff0c;作为现代音频技术的重要代表&#xff0c;已经广泛应用于各种场合。它不仅能提高演讲者的声音质量&#xff0c;还能增加演讲的互动性和生动性。然而&#xff0c;面对市场上众多的无线领夹麦克风产品&#xff0c;如何选择一款适合自己的设备成为了一…

TPshop商城的保姆教程(windows)

提前准备 phpStudy下载&#xff1a;https://www.xp.cn/download.html 选择适合自己的版本下载 TPshop商城源文件下载链接&#xff1a; https://pan.baidu.com/s/143fLrxbwe9CTMCbyx7mXJQ?pwd6666 开始安装 安装完phpstudy后 以管理员的身份启动phpstudy.exe 选择合适自己…

C语言 指针——指针变量的定义、初始化及解引用

目录 指针 内存如何编址&#xff1f; 如何对变量进行寻址&#xff1f; 用什么类型的变量来存放变量的地址? 如何显示变量的地址?​编辑 使用未初始化的指针会怎样&#xff1f; NULL是什么&#xff1f; 如何访问指针变量指向的存储单元中的数据&#xff1f; 指针变量的…

二刷算法训练营Day15 | 二叉树(2/9)

目录 详细布置&#xff1a; 1. 层序遍历 2. 226. 翻转二叉树 3. 101. 对称二叉树 详细布置&#xff1a; 1. 层序遍历 昨天练习了几种二叉树的深度优先遍历&#xff0c;包括&#xff1a; ​​​​​​前中后序的递归法前中后序的迭代法前中后序迭代的统一写法 今天&…

糖尿病视网膜病变分级新方法:卷积网络做分割和诊断 + 大模型生成详细的测试和治疗建议

糖尿病视网膜病变分级新方法&#xff1a;卷积网络做分割和诊断 大模型生成详细的测试和治疗建议 提出背景相关工作3.1 数据集3.1.1 病变分割 3.1.2 图像分级3.1.3 大型语言模型&#xff08;LLMs&#xff09; 解法 数据预处理 数据增强 网络架构 训练过程 测试过程子解法1…

spdlog日志库源码:线程池thread_pool

线程池 线程池本质上一组事先创建的子线程&#xff0c;用于并发完成特定任务的机制&#xff0c;避免运行过程中频繁创建、销毁线程&#xff0c;从而降低程序运行效率。通常&#xff0c;线程池主要涉及到以下几个方面问题&#xff1a; 如何创建线程池&#xff1f;线程池如何执…

FPGA基础:触发器和锁存器

目录 锁存器&#xff08;Latch&#xff09;D触发器&#xff08;Flip-Flop&#xff09;最基本时序电路时序块&#xff08;Sequential blocks&#xff09;:同步与异步触发器概念触发器分类触发器的Verilog实现1. 上升沿触发的触发器2. 带异步复位、上升沿触发的触发器3. 带异步复…

Pandas-中axis的用法

在Pandas中&#xff0c;min(axis)方法是计算DataFrame或Series中每行或每列的最小值的函数。该函数可以接受一个参数axis&#xff0c;用于指定计算最小值的方向。当axis0时&#xff0c;表示沿着行的方向计算最小值&#xff1b;当axis1时&#xff0c;表示沿着列的方向计算最小值…

奶奶也能看懂的耦合协调度分析

不会计算&#xff1f;跟着文献学起来~ 案例数据连接&#xff08;复制链接后粘贴到浏览器中&#xff09;&#xff1a; 耦合协调度数据​spssau.com/spssaudata.html?shareDataF363000CD033FF15E557BB75B9B0D412 假如你有这样一组数据&#xff1a; 如何进行计算分析耦合协调度…

python中pow是什么意思

pow()方法返回xy&#xff08;x的y次方&#xff09;的值。 语法 以下是math模块pow()方法的语法&#xff1a; import math math.pow( x, y ) 内置的pow()方法 pow(x, y[, z]) 函数是计算x的y次方&#xff0c;如果z在存在&#xff0c;则再对结果进行取模&#xff0c;其结果等效…

【后端开发】服务开发场景之分布式(CAP,Raft,Gossip | API网关,分布式ID与锁 | RPC,Dubbo,Zookeeper)

【后端开发】服务开发场景之分布式&#xff08;CAP&#xff0c;Raft&#xff0c;Gossip | API网关&#xff0c;分布式ID与锁 | RPC&#xff0c;Dubbo&#xff0c;Zookeeper&#xff09; 文章目录 1、如何设计一个分布式系统&#xff1f;&#xff08;底层原理&#xff09;理论&a…

企业网站有必要进行软件测试吗?网站测试有哪些测试流程?

企业网站在现代商业中扮演着重要的角色&#xff0c;它不仅是企业形象的重要体现&#xff0c;也是与客户、合作伙伴进行沟通与交流的重要渠道。然而&#xff0c;由于企业网站的复杂性和关键性&#xff0c;其中可能存在各种潜在的问题和隐患。因此&#xff0c;对企业网站进行软件…

网页中的音视频裁剪拼接合并

一、需求描述 项目中有一个配音需求&#xff1a; 1&#xff09;首先&#xff0c;前台会拿到一个英语视频&#xff0c;视频的内容是A和B用英语交流&#xff1b; 2&#xff09;然后&#xff0c;用户可以选择为某一个角色配音&#xff0c;假如选择为A配音&#xff0c;那么视频在播…

Centos7时区设置及手动修改时间

一、修改系统时区 1、查看时区命令 timedatectl 2、设置时区命令 #下面将时区设置为上海时区 timedatectl set-timezone Asia/Shanghai 3、查看时区看一下新时区有没有生效 timedatectl 二、手动修改系统时间 修改系统时间 date -s "2023-12-25 16:05:10" 查…

display: none 和 visibility: hidden 的共性与区别

display: none 和 visibility: hidden 的共性与区别 共性&#xff1a;display: none 和 visibility: hidden 都是用于设置元素可见性的样式 区别 display: none 使元素及其占位完全消失&#xff1a;元素及其所有子元素将从文档流和布局中完全消失&#xff0c;就像它们不存在一…