Unity 关于Sort排序

背景

开发过程中经常会遇到,按照多个条件排序的问题。传统的排序虽然也可满足排序要求,但是,代码看起来不够简洁。Sort 排序很大程度上简化代码。并且可以实现大多数的排序需求。
核心代码如下:

using System.Collections;
using System.Collections.Generic;
using System.Text;
using UnityEngine;

public class Test23 : MonoBehaviour
{
    private List<NumU> KK1 = new List<NumU>();
    private List<TeamNum> KK2 = new List<TeamNum>();
    private StringBuilder _sb = new StringBuilder();
    // Use this for initialization
    void Start()
    {
        DebugLog1();
        DebugLog2();
    }
    private void DebugLog1()
    {
        _sb.Clear();
        KK1.Add(new NumU(1, 1, 3));
        KK1.Add(new NumU(2, 5, 4));
        KK1.Add(new NumU(3, 6, 1));
        KK1.Add(new NumU(4, 2, 2));
        KK1.Add(new NumU(5, 2, 3));
        KK1.Add(new NumU(6, 2, 1));
        KK1.Add(new NumU(7, 2, 1));
        //-1放在前边 ,1 放在后边,放后的顺序由列表中的先后顺序决定(列表向后插入的时候,位置循环移动)
        KK1.Sort((a, b) => {
            if (a.age != b.age)
                return a.age == 2 ? -1 : 1; //7654 231 满足age条件已经return,顺序不在改变(231的位置受在列表中的位置影响,应该是312呀,这个需要了解底层排序了)
            if (a.weight != b.weight)
                return a.weight == 3 ? 1 : -1;//4 76 5 231   其中4和5分开(满足weight条件),7和6留给id排 ,1,2,3不满足条件,不变
                                              //按照id升序排列(这个是按照顺序排的)
            return (a.id - b.id);//7,6按照id排,结果67 ,最终结果4675231
        });
        foreach (var temp in KK1)
        {   //4675231
            _sb.Append(temp.id);
            _sb.Append(" ");
        }
        Debug.LogError(_sb.ToString());
    }
    private void DebugLog2()
    {
        _sb.Clear();
        //ship_id qua team_id
        KK2.Add(new TeamNum(0, 0, 0));
        KK2.Add(new TeamNum(1, 0, 0));
        KK2.Add(new TeamNum(2, 1, 0));

        KK2.Add(new TeamNum(3, 2, 1));
        KK2.Add(new TeamNum(4, 3, 2));
        
        KK2.Add(new TeamNum(5, 4, 3));
        KK2.Add(new TeamNum(6, 4, 3));
        KK2.Add(new TeamNum(7, 5, 3));
        //初始序列01234567
        KK2.Sort((a, b) =>
        {   //201 34567 (012按照规则排序,其他不变)
            if (a.team_id == 0 && b.team_id == 0)
            {
                if (a.qua == b.qua)
                    return a.ship_id - b.ship_id;
                return b.qua - a.qua;
            }
            //56743 201 (56743 按照team_id降序排,201不变)
            if (a.team_id == 0 || b.team_id == 0)
            {
                return b.team_id - a.team_id;
            }
            //756 43 201  (567 按照规则排,43201不变)
            if (a.team_id == b.team_id)
            {
                if (a.qua == b.qua)
                    return a.ship_id - b.ship_id;
                return b.qua - a.qua;
            }
            //3 4 756 201 (34按升序排列【564看成对象放后边】201不变{最后一个条件关联最终的条件})
            return a.team_id - b.team_id;
        });
        foreach (var temp in KK2)
        {
            //34756201
            _sb.Append(temp.ship_id);
            _sb.Append(" ");
        }
        Debug.LogError(_sb.ToString());
    }
}
public class NumU
{ 
    public int id; 
    public int age;
    public int weight;
    public NumU(int id, int age, int weight)
    { 
        this.id = id;
        this.age = age;
        this.weight = weight; 
    }
}
public class TeamNum
{
    public int team_id; 
    public int qua; 
    public int ship_id;
    public TeamNum(int ship_id, int qua, int team_id)
    {
        this.ship_id = ship_id;
        this.qua = qua;
        this.team_id = team_id;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

W低小调W

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值