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);
    }
}
相关推荐
Jasmine_llq26 分钟前
《 火星人 》
算法·青少年编程·c#
军训猫猫头2 小时前
20.抽卡只有金,带保底(WPF) C#
ui·c#·wpf
异次元的归来9 小时前
Unity DOTS中的share component
unity·游戏引擎
向宇it12 小时前
【从零开始入门unity游戏开发之——C#篇25】C#面向对象动态多态——virtual、override 和 base 关键字、抽象类和抽象方法
java·开发语言·unity·c#·游戏引擎
_oP_i14 小时前
unity webgl部署到iis报错
unity
Go_Accepted14 小时前
Unity全局雾效
unity
向宇it14 小时前
【从零开始入门unity游戏开发之——C#篇24】C#面向对象继承——万物之父(object)、装箱和拆箱、sealed 密封类
java·开发语言·unity·c#·游戏引擎
每日出拳老爷子17 小时前
【图形渲染】【Unity Shader】【Nvidia CG】有用的参考资料链接
unity·游戏引擎·图形渲染
北海651618 小时前
Dots 常用操作
unity
坐井观老天19 小时前
在C#中使用资源保存图像和文本和其他数据并在运行时加载
开发语言·c#