List类中有一个【Sort方法】
可以非常快速的对【整数类】
或者【小数类】元素进行升序
public class TestCompare MonoBehaviour
{
public List<int>numbers;
private void Start()
{
numbers=new List<int>(){20,10,30,70,60,40,50,90,80,100}:
}
private void Update()
{
if(Input.GetKeyDown(KeyCode.Space))
Sort();
}
}
private void Sort()
{
numbers.Sort();
}
}
复杂的数据排序测试
但是,只有基本的数据类型(指整数类和小数类)
可以直接使用【Iist.Sort方法】进行升序排列
而我们之后需要比较的,并不是单纯的【整数类型
而是每一个【角色资源文件中的得分】,即集合中需要排序的元素从【整数类】变成了【对像的某一属性
这里介绍一个概念【方法/函数重载Method Overloading】
(面试常问的小题)
指的就是方法/函数名称相同,但是括号内的参数不同,这里的$ot方法就有其他三种其他参数形式
其实就是一个包含了两个参数的【委托】
(委托是一个类型,这个类型可以赋值一个方法的引用,可以当作参数来传递
这里就是需要将一个函数名为Comparelnt,作为委托当作参数,使用在24行的sort0中)
因此使用这个方法,我们只需要定义一个【委托】两个参数都是PlayerData类型的
private void Sort()
{
numbers.Sort(CompareInt);
}
private int CompareInt(int_a,int_b)
{
//RETURN Greater one between A and B
return _a.CompareTo(_b);
}
使用A.CompareTo(B)方法其实就是将AB进行比较
该方法会返回三个值:-1,1和0
如果返回值是1则说明A大于B
如果返回值是-1就表明A小于B
事实上,当你有了经验后,特别是在排序的问题上
会看到很多人用【Lambda表达式】简化代码量,更方便阅读
private void SortByCompare()
{
//numbers.Sort(CompareInt);
numbers.Sort((a,b)=>a.CompareTo(b));//MARKER LAMBDA Express/statement
//If
Debug.Log("CompareInt LAMBDA");
}
复杂的数据排序实战
我们既然可以使用方法器,对整数类排序(图1)
只要将Comparelnt(O方法中的参数类型进行调换,就可以完成对象属性的比较(图2)
(比如比较角色的得分,或者击杀数,进行排序)
numbers.Sort ((obj1,obj2)=>obj1.var.CompareTo(obj2.var))
冒泡排序
冒泡排序是许多领域包括Unty中经常使用的一种基本算法
(如背包系统中按照编号重新排序,互换物品位置等都用到了冒泡排序)
冒泡算法【核心思路】是比较相邻两个元素的大小,如果前者大于后者,那么【互换】
位置
反复循环进行比较,直到所有元素都不需要【互换】位置为止
public List<PlayerData>playerDatas = new List<PlayerData>();
private void SortByBulle()
{
bool isBubble m true;
do
{
isBubble▣false;
for (int 1=0;playerDatas.Count -1;1++)
{
if (playerDatas[i].playerHighestscore > playerDatas[i+1].playerHighestscore)
PlayerData temp = playerDatas[i]:
playerDatas[i] = playerDatas[i+1];
playerDatas[i+1] = temp:
isBubble true;
}
}
}
while (isBubblc);
}
使用LINQ排序
同样的LNQ也可以很方便的解决升序排列的问题
(Language integrated Query:语言集成查询)
使用LINQ前必须引用System.Linq:命名空间
LINQ常用来对元素进行【排序】【搜索】】以及按照条件【筛选】等
(我的卡牌收藏系统系列打算使用LINQ功能搜索卡牌,之前的方法性能上不是很好)
通过【OrderBy】方法
可以直接对集合中的元素进行【升序排列】
//STEP 04 SORT BY LINO
if (Input.GetKeyDown(KeyCode.Space))
(
SortByLINQ(playerDatas.Count):
}
//STEP 04
private ListsPlayerData>Soret8yLINQ(int count)
{
return playerDatas.OrderBy(t=>t.playerHighestScore).Take(count).ToList();
}