C# 泛型委托应用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/leonardo_Davinci/article/details/78647368

泛型委托实现例如 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);
}



猜你喜欢

转载自blog.csdn.net/leonardo_Davinci/article/details/78647368