C# 数组/集合排序

一:基础类型集合排序

csharp 复制代码
/// <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]);
            }
        }
    }
}

测试:

csharp 复制代码
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);
}

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

csharp 复制代码
[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]);
            }
        }
    }
}
csharp 复制代码
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}")
        };
    }
}

测试:

csharp 复制代码
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);
    }
}
相关推荐
运维开发小白4 小时前
使用夜莺 + Elasticsearch进行日志收集和处理
运维·c#·linq
幻想趾于现实5 小时前
C# Winform 入门(4)之动图显示
开发语言·c#·winform
向宇it7 小时前
【零基础入门unity游戏开发——2D篇】SortingGroup(排序分组)组件
开发语言·unity·c#·游戏引擎·材质
军训猫猫头8 小时前
87.在线程中优雅处理TryCatch返回 C#例子 WPF例子
开发语言·ui·c#·wpf
du fei8 小时前
C# 与 相机连接
开发语言·数码相机·c#
古力德9 小时前
Unity中造轮子:定时器
c#·unity3d
小码编匠10 小时前
C# 实现西门子S7系列 PLC 数据管理工具
后端·c#·.net
“抚琴”的人1 天前
【机械视觉】C#+VisionPro联合编程———【六、visionPro连接工业相机设备】
c#·工业相机·visionpro·机械视觉
omegayy1 天前
Unity 2022.3.x部分Android设备播放视频黑屏问题
android·unity·视频播放·黑屏
FAREWELL000751 天前
C#核心学习(七)面向对象--封装(6)C#中的拓展方法与运算符重载: 让代码更“聪明”的魔法
学习·c#·面向对象·运算符重载·oop·拓展方法