using System;
using System.Collections.Generic;
using System.Text;
/// <summary>
/// 自己写的Array工具类;对数组进行升序排序;
/// </summary>
static class ArrayHelper
{//第二个参数是实例化委托handler,然后在下面调用声明委托handler;
static public void OrderBy4<T, TKey>(T[] array, SelectHandler<T, TKey> handler) where TKey : IComparable<TKey>//对数组的属性进行约束;
{//对象 非 默认字段 数组比较
for (int i = 0; i < array.Length; i++)
{
for (int j = i + 1; j < array.Length; j++)
{
//使用委托取属性的值 去比较;函数的名字加括号handler()调用lambda表达式函数;
if (handler(array[i]).CompareTo(handler(array[j])) > 0)//如果需要降序排序,将这里的>大于号改成<小于号
{
var temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
}
}
}
//声明一个委托;
public delegate TKey SelectHandler<T, TKey>(T t);
using System;
namespace PrjArrayHelper
{
class Program
{//程序的执行部分,只写了排序;
static void Main(string[] args)
{
var arr1 = new int[] { 1, 5, 3 };//创建一个int类型的数组;
var arr2 = new Student[] {//往数组里放三个Student对象;
new Student{ Id=1,Age=20,Tall=168},
new Student{ Id=2,Age=19,Tall=172},
new Student{ Id=3,Age=21,Tall=170}
};
ArrayHelper.OrderBy4(arr1, a => a);//=>前的(a)有参数时可以不带小括号;=>前是参数,后面是方法体;
ArrayHelper.OrderBy4(arr1, (a) => a);//排序方法;这是lambda表达式,将函数执行部分进去;
//从T对象取一个属性,返回该属性的值;
ArrayHelper.OrderBy4(arr2, (a) => a.Tall);//结果不对时,可能跟打断点的位置有关;
}
}
class Student {
public int Age { set; get; }
public int Id { set; get; }
public int Tall { set; get; }
}
}
using System;
using System.Collections.Generic;
using System.Text;
/// <summary>
/// 自己写的Array工具类;返回数组中最大的值;
///工具类放在script/common文件夹下
/// </summary>
static class ArrayHelper
{//工具类方法声明为静态static方便调用
static public void Max<T, TKey>(T[] array, SelectHandler<T, TKey> handler) where TKey : IComparable<TKey>
{//对象 非 默认字段 数组比较
T temp=default(T);//T的默认值,null或0
temp=array[0];
for (int i = 1; i < array.Length; i++)
{
if (handler(temp).CompareTo(handler(array[i])) < 0)//如果取最小值,小于号<改为大于号>;
{
temp = array[i];
}
}
return temp;//这里有返回值
}
static public T[] FindAll<T>(T[] array,FindHandler<T> handler)
{
List<T> list=new List<T>();//声明一个可变数组;
for(int i=0;i<array.Length;i++)
{
if(handler(array[i]))
{
list.Add(array[i]);
}
}
return list.ToArray();//将可变长度数组转为不可变长度数组
}
static public TKey[] Select<T,TKey>(T[] array,SelectHandler<T,TKey> handler)
{//取数组中所有对象的某一个属性值,并将其放入一个新的数组中;
TKey[] keys=new TKey[array.Length];//因为是取数组中元素的某一个属性,所以使用固定数组和原数组的长度;
for(int i=0;i<array.Length;i++)
{
keys[i]=handler(array[i]);
}
return keys;
}
}
public delegate TKey SelectHandler<T, TKey>(T t);//声明一个'选择'委托;从T对象取一个属性,返回该属性的值;
public delegate bool FindHandler<T>(T t);//查找条件委托:表示一个查找条件,if语句的判断条件;
//1、通过标签找到所有敌人
GameObject[] gos=GameObject.FindGameObjectWithTag("Enemy");
//2、找出HP最大的敌人, HP在脚本中,脚本=组件,组件在gos中;这里用到了之前写的工具类;
var enemy=ArrayHelper.Max(gos,go=>go.GetComponent<EnemyHealth>().HP);
//3、将HP最大的敌人变为黄色
enemy.GetComponent<Renderer>().material.color=Color.yellow;
//1、根据标签找到所有敌人
GameObject[] gos=GameObject.FindGameObjectsWithTag("Enemy");
//2、找到所有生命值大于20的敌人
var enemys=ArrayHelper.FindAll(gos,go=>go.GetComponent<EnemyHealth>().HP>20);
//3、变为蓝色
foreach(var enemy in enemys)
{enemy.GetComponent<Renderer>().material.color=Color.blue;}
//1、根据tag找到所有敌人,
GameObject[] gos=GameObject.FindGameObjectsWithTag("Enemy");
//2、找出离主角最近的敌人
var enemy=ArrayHelper.min(gos,go=>Vector3.Distance(this.transform.position,go.transform.position));
//3、变为红色
enemy.GetComponent<Renderer>().material.color=Color.red;