背景
开发过程中经常会遇到,按照多个条件排序的问题。传统的排序虽然也可满足排序要求,但是,代码看起来不够简洁。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;
}
}