c#-自学笔记02-数组工具类基础01,通用的遍历取值排序

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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值