泛型委托实现例如 List.Find() /Array.Find()的功能,就是一个工具(跨平台、通用、方便)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
/// <summary>
/// 泛型和委托应用
/// </summary>
public static class ArrayHelper {
/// <summary>
/// 升序 1.跨平台 2.通用 3方便
/// </summary>
/// <typeparam name="T">类型</typeparam>
/// <typeparam name="Tkey">类型当中某个类型</typeparam>
/// <param name="array">要进行排序的数组</param>
/// <param name="handler">获得T类型中的TKEy类型的值</param>
public static void OrderBy<T, Tkey>
(T[] array, SelectHandler<T, Tkey> handler)
where Tkey:IComparable<Tkey>
{
//使用选择排序
for (int i = 0; i < array.Length-1; i++)
{
for (int j = i+1; j < array.Length; j++)
{
if((handler(array[i]).
CompareTo(handler(array[j]))>0))
{
var temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
}
}
/// <summary>
/// 降序
/// </summary>
/// <typeparam name="T"></typeparam>
/// <typeparam name="TKey"></typeparam>
/// <param name="array"></param>
/// <param name="handler"></param>
public static void OrderByDescending<T, TKey>(
T[] array, SelectHandler<T, TKey> handler)
where TKey : IComparable<TKey>
{
for (int i = 0; i < array.Length - 1; i++)
{
for (int j = i+1; j < array.Length; j++)
{
if ((handler(array[i]).
CompareTo(handler(array[j])) < 0))
{
var temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
}
}
/// <summary>
/// 找最大
/// </summary>
/// <typeparam name="T">数据类型</typeparam>
/// <typeparam name="TKey">类型当中需要进行比较的类型</typeparam>
/// <param name="array">数组</param>
/// <param name="handler">要进行比较的条件</param>
/// <returns></returns>
public static T Max<T, TKey>(T[] array, SelectHandler<T, TKey>
handler) where TKey : IComparable<TKey>
{
T t = array[0];
for (int i = 1; i < array.Length; i++)
{
if ((handler(t).CompareTo(handler(array[i]))) < 0)
{
t = array[i];
}
}
return t;
}
/// <summary>
/// 最小
/// </summary>
/// <typeparam name="T"></typeparam>
/// <typeparam name="TKey"></typeparam>
/// <param name="array"></param>
/// <param name="handler"></param>
/// <returns></returns>
public static T Min<T, TKey>(T[] array, SelectHandler<T, TKey>
handler) where TKey : IComparable<TKey>
{
T t = array[0];
for (int i = 1; i < array.Length; i++)
{
if ((handler(t).CompareTo(handler(array[i]))) > 0)
{
t = array[i];
}
}
return t;
}
/// <summary>
/// 按照条件查询单个对象 CharacterState 查询HP小于15的对象
/// </summary>
/// <typeparam name="T">要查询的数组当中的类型</typeparam>
/// <param name="array">要查询的数组</param>
/// <param name="handler">要查询的条件</param>
/// <returns></returns>
public static T Find<T>(T[] array, FindHandler<T> handler)
{
for (int i = 0; i < array.Length; i++)
{
if (handler(array[i]))
return array[i];
}
return default(T);
}
/// <summary>
/// 查找所有符合条件的对象
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="array"></param>
/// <param name="handler"></param>
/// <returns></returns>
public static 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();
}
/// <summary>
/// 将一个类型当中某个类型单独提取出来
/// </summary> 将CharacterState当中的HP单独提取出来作为新的
/// float数组
/// <typeparam name="T">数组</typeparam>
/// <typeparam name="Tkey">要提取的类型</typeparam>
/// <param name="array"></param>
/// <param name="handler"></param>
/// <returns></returns>
public static 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;
}
/// <summary> CharacterState Tkey:HP MP Speed
/// 选择委托 T: GameObject Tkey:transform position
/// </summary>
/// <typeparam name="T">数据类型</typeparam>
/// <typeparam name="TKey">当前数据类型中的某一个类型</typeparam>
/// <param name="t"></param>
/// <returns></returns>
public delegate TKey SelectHandler<T, TKey>(T t);
public delegate bool FindHandler<T>(T t);
}