解析“60k”大佬的19道C#面试题(下)
解析“60k”大佬的19道C#面试题(下)
在上篇中,我解析了前 10 道题目,本篇我将尝试解析后面剩下的所有题目。
这些题目确实不怎么经常使用,因此在后文中,我会提一组我的私房经典“6k面试题”,供大家轻松一刻。
先略看题目:
- 简述
LINQ的lazy computation机制 - 利用
SelectMany实现两个数组中元素做笛卡尔集,然后一一相加 - 请为三元函数实现柯里化
- 请简述
ref struct的作用 - 请简述
ref return的使用方法 - 请利用
foreach和ref为一个数组中的每个元素加1 - 请简述
ref、out和in在用作函数参数修饰符时的区别 - 请简述非
sealed类的IDisposable实现方法 delegate和event本质是什么?请简述他们的实现机制
解析:
11. 简述 LINQ 的 lazy computation 机制
Lazy computation 是指延迟计算,它可能体现在解析阶段的表达式树和求值阶段的状态机两方面。
首先是解析阶段的表达式树, C# 编译器在编译时,它会将这些语句以表达式树的形式保存起来,在求值时, C# 编译器会将所有的 表达式树 翻译成求值方法(如在数据库中执行 SQL 语句)。
其次是求值阶段的状态机, LINQ to Objects 可以使用像 IEnumemrable<T> 接口,它本身不一定保存数据,只有在求值时,它返回一个迭代器—— IEnumerator<T> ,它才会根据 MoveNext() / Value 来求值。
这两种机制可以确保 LINQ 是可以延迟计算的。
12. 利用 SelectMany 实现两个数组中元素做笛卡尔集,然后一一相加
// 11. 利用 `SelectMany` 实现两个数组中元素的两两相加
int[] a1 = { 1, 2, 3, 4, 5 };
int[] a2 = { 5, 4, 3, 2, 1 };
a1
.SelectMany(v => a2, (v1, v2) => $"{v1}+{v2}={v1 + v2}")
.Dump();
解析与说明:大多数人可能只了解 SelectMany 做一转多的场景(两参数重载,类似于 flatMap ),但它还提供了这个三参数的重载,可以允许你做多对多——笛卡尔集。因此这些代码实际上可以用如下 LINQ 表示:
from v1 in a1
from v2 in a2
select $"{v1}+{v2}={v1 + v2}"
执行效果完全一样。
13. 请为三元函数实现柯里化
解析:柯里化是指将 f(x, y) 转换为 f(x)(y) 的过程,三元和二元同理:
Func<int, int, int, int> op3 = (a, b, c) => (a - b) * c;
Func<int, Func<int, Func<int, int>>> op11 = a => b => c => (a - b) * c;
op3(4, 2, 3).Dump(); // 6
op11(4)(2)(3).Dump(); // 6
通过实现一个泛型方法,实现通用的三元函数柯里化:
Func<T1, Func<T2, Func<T3, TR>>> Currylize3<T1, T2, T3, TR>(Func<T1, T2, T3, TR> op)
{
return a => b => c => op(a, b, c);
}
// 测试代码:
var op12 = Currylize3(op3);
op12(4)(2)(3).Dump(); // (4-2)x3=6
现在了解为啥
F#签名也能不用写参数了吧,因为参数确实太长了解析“60k”大佬的19道C#面试题(下)的更多相关文章
- 解析“60k”大佬的19道C#面试题(上)
解析"60k"大佬的19道C#面试题(上) 先略看题目: 请简述async函数的编译方式 请简述Task状态机的实现和工作机制 请简述await的作用和原理,并说明和GetResu ...
- 补充《解析“60k”大佬的19道C#面试题(上)》
[广州.NET技术俱乐部]微信群的周杰写了一篇文章<解析“60k”大佬的19道C#面试题(上)>https://www.cnblogs.com/sdflysha/p/20200325-19 ...
- 19道常见的JS面试算法题
最近秋招也做了多多少少的面试题,发现除了基础知识外,算法还是挺重要的.特意整理了一些常见的算法题,添加了自己的理解并实现. 除此之外,建议大家还可以刷刷<剑指offer>.此外,左神在牛客 ...
- 「剑指offer」27道Mybatis面试题含解析
1.什么是Mybatis? Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动.创建连接.创建statement等繁杂 ...
- 【19道XSS题目】不服来战!
记得第一次接触xss这个概念是在高中,那个时候和一个好基友通过黑客X档案和黑客手册.第一次接触到了除了游戏以外的电脑知识,然后知道了,原来电脑除了玩游戏还可以搞这些,从此两人一发不可收拾的爱上了玩黑这 ...
- 2019年19道java经典面试题(附答案)
1.不可变对象 指对象一旦被创建状态不能再改变.任何修改都会创建一个新的对象,如 String.Integer及其它包装类. 2.能否创建一个包含可变对象的不可变对象? 可以.不要共享可变对象的引用就 ...
- 【19道XSS题目】不服来战!(转)
[19道XSS题目]不服来战! 记得第一次接触xss这个概念是在高中,那个时候和一个好基友通过黑客X档案和黑客手册.第一次接触到了除了游戏以外的电脑知识,然后知道了,原来电脑除了玩游戏还可以搞这些,从 ...
- 509道Java面试题解析:2020年最新Java面试题
<Java面试全解析>是我在 GitChat 发布的一门电子书,全书总共有 15 万字和 505 道 Java 面试题解析,目前来说应该是最实用和最全的 Java 面试题解析了. 我本人是 ...
- java面试题—精选30道Java笔试题解答(二)
摘要: java面试题-精选30道Java笔试题解答(二) 19. 下面程序能正常运行吗() public class NULL { public static void haha(){ System ...
随机推荐
- useful_tool
记录工作学习中遇到的经典好用的工具软件. 工作篇 AxeSlide斧子演示 AxeSlide是PPT的良好替代品,跨平台,基于Html5 2D/3D技术开发.动画特效等效果十分不错.工具提供很多免费模 ...
- Dangerous query method called with non-attribute argument(s)
踩坑 query method. 问题描述 现有model issue,需要对issues进行排序,根据指定的ID集合来决定记录的位置,比如id包含在(4, 6, 9)中的纪录就排在前面,剩下的排在后 ...
- 用新架构适配MI3中遇到的各种坑
用新架构适配MI3中遇到的各种坑 首先不得不说hendy架构的强大之处, mi3也直接开机但是遇到各种坑,不能怪架构不够强大,只有说miui定制化太高.下面详细说一下mi3适配中的各种坑.有些坑会附带 ...
- STM32 一个初始化EXTI的例子
23 May 2017 » Hardware 注:STM32F407VGT6 with STM32F4 DSP and standard peripherals library v1.8.0 外部中断 ...
- linux lsof常用方法
lsof简介 lsof(list open files)是一个列出当前系统打开文件的工具,在linux环境下,任何事物都是以文件形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件.系统 ...
- LeetCode 题解 | 237. 删除链表中的节点
题目描述: 请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点. 现有一个链表 -- head = [4,5,1,9],它可以表示为: 示例 1: 输入: hea ...
- PDF 相关操作
去年一年偷了下懒, 博客写了一点就没写了, 还好一些大的flag完成了. 花了半年的空余时间, 培养了一门兴趣爱好. 自己在为人处世上还是不够圆滑啊, 也难怪. 自己当初选择走技术这条路的初 ...
- Java enum枚举在实际项目中的常用方法
在项目实际开发过程中,经常会遇到对某些固定的值.字典项的定义的需求,很多项目经常使用常量来定义,其实在jdk1.5就已经引入了枚举,使用枚举可以更好的解决这类需求,本文主要记录枚举的优势以及经常在项目 ...
- JavaScript常见的六种继承方式
前言 面向对象编程很重要的一个方面,就是对象的继承.A 对象通过继承 B 对象,就能直接拥有 B 对象的所有属性和方法.这对于代码的复用是非常有用的. 大部分面向对象的编程语言,都是通过"类 ...
- 使用nestjs集成grpc具体操作
两个程序中, 提供grpc服务的称为服务端, 调用grpc服务的为客户端, 以下是grpc服务端和客户端的代码编写 1. 创建两个nestjs项目demo1(端口: 3000)和demo2(端 ...