C#核心知识回顾——12.lambda表达式、List排序、协变和逆变

1.Lambda表达式

可以将lambad表达式理解为匿名函数的简写
它除了写法不同外,使用上和匿名函数一模一样
都是和委托或者事件配合使用的

//匿名函数
//delegate(参数列表)
//{

//}

//lambda表达式
//(参数列表) =>
//{
      //函数体
//}

//1.无参无返回值Action a = () =>{Debug.Log("Lambda");};a();//2.有参Action<int> a2 = (int value) =>{Debug.Log("参数lambda");};a2(10);//3.参数类型可以省略,参数类型和委托或者事件一致Action<int> a3 = (value) =>{Debug.Log("无类型参数");};a3(100);//4.有返回值Func<string, int> a4 = (value) =>{Debug.Log("返回值");return 1;};a4("a");

闭包:

内层的函数可以引用包含在它外层的函数的变量
即使外层函数的执行已经终止

注意:
该变量提供的值并非变量创建时的值,而是在父函数范围内的最终值。

public class test : MonoBehaviour
{    private void Start(){Tes tes = new Tes();tes.DoThing();}}class Tes
{public event Action action;/// <summary>/// 这里就形成了闭包/// 当构造函数执行完毕,声明的临时变量value生命周期被改变了/// </summary>public Tes(){int value = 10;action = () =>{Debug.Log(value);};for (int i = 0; i < 5; i++){//想要实现for循环存进事件不同的i值,需要在循环内部声明一个临时变量//每次存储的index不是同一个indexint index = i;//假如事件注册进5个i变量,但是当使用时,变量的值都是for循环的最终值5,action += () =>{Debug.Log(index);};}}public void DoThing(){action();}
}

2.List排序

A.自带排序:

 //list自带排序List<int> list = new List<int>();list.Add(6);list.Add(1);list.Add(5);list.Add(3);list.Add(6);list.Add(5);list.Sort();

B.自定义排序:

public class test : MonoBehaviour
{private void Start(){List<Items> ite = new List<Items>();ite.Add(new Items(2));ite.Add(new Items(21));ite.Add(new Items(12));ite.Add(new Items(52));ite.Add(new Items(32));ite.Sort();for (int i = 0; i < ite.Count; i++){Debug.Log(ite[i].id);}}}
/// <summary>
/// 继承IComparable接口实现对比
/// </summary>
class Items : IComparable<Items>
{public int id;public Items(int id) { this.id = id;}public int CompareTo(Items other){//返回值的含义//小于0://放在传入对象的前面//等于0://保持当前的位置不变//大于0://放在传入对象的后面//可以简单理解传入对象的位置就是//如果你的返回为负数就放在它的左边也就前面//如果你返回正数就放在它的右边也就是后面if (this.id < other.id){ return -1; }else{return 1;}}
}

C.通过委托函数实现排序

public class test : MonoBehaviour
{private void Start(){List<ShopItem> items = new List<ShopItem>();items.Add(new ShopItem(2));items.Add(new ShopItem(13));items.Add(new ShopItem(24));items.Add(new ShopItem(15));//1.调用函数items.Sort(SortShop);//2.匿名函数//items.Sort(delegate (ShopItem a, ShopItem b)//{//    if (a.id > b.id)//    {//        return 1;//    }//    else//    {//        return -1;//    }//});//3.lambda表达式//items.Sort((a, b) =>//{//    return a.id > b.id ? 1 : -1;//});for(int i = 0; i < items.Count; i++){Debug.Log(items[i].id);}}static int SortShop(ShopItem a,ShopItem b){//传入的两个对象,为列表中两个对象,进行两两比较//用左边的和右边的比较,负数在左边,正数在右边if (a.id > b.id){return 1;}else{return -1;}}
}class ShopItem
{public int id;public ShopItem(int id) {this.id = id;}
}

 

public class test : MonoBehaviour
{private void Start(){List<ShopItem> items = new List<ShopItem>();items.Add(new ShopItem(1,2,3,4));items.Add(new ShopItem(4,3,2,1));items.Add(new ShopItem(6,7,8,9));items.Add(new ShopItem(9,8,7,6));items.Add(new ShopItem(3,4,5,6));int item = UnityEngine.Random.Range(0, 4);items.Sort((a, b) =>{int index = 0;switch (item){case 0:index = a.gong > b.gong ? 1 : -1;break;case 1:index = a.fang > b.fang ? 1 : -1;break;case 2:index = a.xue > b.xue ? 1 : -1;break;case 3:index = a.fan > b.fan ? 1 : -1;break;}return index;});for (int i = 0; i < items.Count; i++){switch (item){case 0:Debug.Log(items[i].gong);break;case 1:Debug.Log(items[i].fang);break;case 2:Debug.Log(items[i].xue);break;case 3:Debug.Log(items[i].fan);break;}}}}class ShopItem
{public int gong;public int fang;public int xue;public int fan;public ShopItem(int gong,int fang,int xue,int fan) {this.gong = gong;this.fang = fang;this.xue = xue;this.fan = fan;}
}

3.协变和逆变

协变:
和谐的变化,自然的变化
因为里氏替换原则 父类可以装子类
比如string变成object
感受是和谐的

逆变:
逆常规的变化,不正常的变化
因为里氏替换原则 父类可以装子类 但是子类不能装父类
所以比如object变成string
感受是不和谐的

协变和逆变是用来修饰泛型的
协变:out
逆变:in
用于在泛型中 修饰 泛型字母的
只有泛型接口和泛型委托能使用

//1.返回值和参数
//用out修饰的泛型只能作为返回值
delegate T Test out<out T>();
//用in修饰的泛型只能作为参数
delegate void Test In<in T>(T t);

public class test : MonoBehaviour
{//用out修饰的泛型只能作为返回值delegate T TestOut<out T>();//用in修饰的泛型只能作为参数delegate void TestIn<in T>(T t);private void Start(){//协变 父类总是能被子类替换TestOut<Son> os = () =>{return new Son();};TestOut<Father> of = os;//实际返回的是os里面装的函数 返回的是sonFather f = of();//逆变TestIn<Father> iF = (value) =>{};TestIn<Son> iS = iF;//实际上 调用的是iFiS(new Son());}
}
class Father{}
class Son : Father{}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/18808.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Maven】类或者包提示找不到,报红

背景 使用IDEA&#xff0c;类或者包提示找不到&#xff0c;报红 解决方法 1. maven reload 2. 检查profiles是否对 3. 不要选中offline模式 4. 检查本地仓库位置 5. 清掉idea缓存 6. 到本地maven仓库删掉出错的包然后重新maven reload 7. update本地仓库 8. 排查是不是别人没…

Seata 分布式事务的中间件Seata设计和实现方案

文章目录 分布式事务的中间件SeataSeata AT 模式-默认模式前提整体机制写隔离读隔离 Seata XA 模式前提整体机制工作机制 Seata TCC 模式Seata Saga 模式概述缺点&#xff1a; Saga的实现外传 分布式事务的中间件Seata Seata 是一款开源的分布式事务解决方案&#xff0c;致力于…

Java设计模式之创建型-原型模式(UML类图+案例分析)

目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析 1、通用实现&#xff08;浅克隆&#xff09; 2、深克隆 五、总结 一、基础概念 原型模式通过复制已有对象作为原型&#xff0c;通过复制该原型来返回一个新对象&#xff0c;而不是新建对象&#xff0c;说白了…

重磅IntelliJ IDEA 2023.2 新版本即将发布,拥抱 AI

IntelliJ IDEA 近期连续发布多个EAP版本&#xff0c;官方在对用户体验不断优化的同时&#xff0c;也新增了一些不错的功能&#xff0c;尤其是人工智能助手补充&#xff0c;AI Assistant&#xff0c;相信在后续IDEA使用中&#xff0c;会对开发者工作效率带来不错的提升。 以下是…

一个Transformer在尺度上适合多模态扩散的所有分布

文章目录 One Transformer Fits All Distributions in Multi-Modal Diffusion at Scale摘要本文方法实验结果 One Transformer Fits All Distributions in Multi-Modal Diffusion at Scale 摘要 本文提出了一个统一的扩散框架(UniDiffuser)来拟合一个模型中与一组多模态数据相…

【来不及刷题之】43、最小栈(PriorityQueue)

因为要在常量时间内查询出最小值&#xff0c;所以需要有另外的数据结构维护最小值&#xff0c;很自然地想到了“堆”这个结构&#xff0c;“最小堆”的堆顶元素刚好是最小值因此出栈和入栈的同时也要维护好最小堆 class MinStack {PriorityQueue<Integer> heap;LinkedLi…

Kubernetes service服务的发布 - kube-proxy(负载均衡器)-IPVS

目录 Service Service将内部的pod暴露到外面&#xff0c;让用户可以访问 负载均衡策略&#xff1a; Service 的类型&#xff1a; 案例&#xff1a;Service服务发布案例 扩展&#xff1a;我们在案例再加入一个探针的使用 更改后的my_nginx.yaml文件&#xff1a; 创建Pod&…

Langchain 新手完全指南

Langchain 可能是目前在 AI 领域中最热门的事物之一&#xff0c;仅次于向量数据库。 它是一个框架&#xff0c;用于在大型语言模型上开发应用程序&#xff0c;例如 GPT、LLama、Hugging Face 模型等。 它最初是一个 Python 包&#xff0c;但现在也有一个 TypeScript 版本&…

Linux常用命令——env命令

在线Linux命令查询工具 env 显示系统中已存在的环境变量 补充说明 env命令用于显示系统中已存在的环境变量&#xff0c;以及在定义的环境中执行指令。该命令只使用"-“作为参数选项时&#xff0c;隐藏了选项”-i"的功能。若没有设置任何选项和参数时&#xff0c;…

webpack笔记一

文章目录 什么是webpack安装webpack一、创建配置项二、安装webpack局部安装(推荐)全局安装 三、安装webpack-cli(可选) 核心概念入口(entry)出口(output)loader插件(plugin)模式(mode) 项目实例webpack基本使用 html打包插件&#xff1a;html-webpack-plugin文件拷贝插件&#…

[sqoop]导入数据

一、覆盖导入 例如维度表&#xff0c;每次导入的数据需要覆盖上次导入的数据。 hive-overwrite参数&#xff1a;实现覆盖导入 hive-import参数&#xff1a;表示向hive表导入 hive-table参数&#xff1a;指定目标hive库表 sqoop import \ --connect jdbc:mysql://hadoop1:3…

基于单片机的老人防摔倒的设计与实现

功能介绍 以51单片机作为主控系统&#xff1b;通过LCD1602液晶显示屏显示当前的经纬度及时间的信息&#xff1b;温度传感器采集当前体温&#xff1b;通过GPS接收模块获得当前位置的位置的经度、纬度、时间和高度等信息&#xff1b;通过ADXL345检测老人摔倒的一瞬间重力加速度通…