解析“60k”大佬的19道C#面试题(下)

在上篇中,我解析了前 10 道题目,本篇我将尝试解析后面剩下的所有题目。

姐妹篇:解析“60k”大佬的19道C#面试题(上)

这些题目确实不怎么经常使用,因此在后文中,我会提一组我的私房经典“6k面试题”,供大家轻松一刻。

先略看题目:

  1. 简述 LINQlazy computation 机制
  2. 利用 SelectMany 实现两个数组中元素做笛卡尔集,然后一一相加
  3. 请为三元函数实现柯里化
  4. 请简述 ref struct 的作用
  5. 请简述 ref return 的使用方法
  6. 请利用 foreachref 为一个数组中的每个元素加 1
  7. 请简述 refoutin 在用作函数参数修饰符时的区别
  8. 请简述非 sealed 类的 IDisposable 实现方法
  9. delegateevent 本质是什么?请简述他们的实现机制

解析:

11. 简述 LINQlazy 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# 签名也能不用写参数了吧,因为参数确实太长了

最新文章

  1. 自制 移动端 纯原生 Slider滑动插件
  2. C# 序列化反序列化
  3. iscroll简单使用说明
  4. c# access插入null值
  5. [工具开发] Perl 爬虫脚本--从美国国家漏洞数据库抓取实时信息
  6. Log4J入门教程(一) 入门例程
  7. linux 关机方式
  8. HTTP认证方式
  9. SRM566 1000pts
  10. (转)css换行样式:word-wrap同word-break的区别
  11. Eclipse(PHP、JAVA)的快捷键大全
  12. UE4/Unity3D中同时捕获多高清摄像头的高效插件
  13. UVA - 10285 Longest Run on a Snowboard (线性DP)
  14. 可空类型 Nullable&lt;T&gt;
  15. RDD
  16. Lua游戏开发之时区问题
  17. EF Core扩展工具记录
  18. Git 删除操作
  19. 传统Java Web(非Spring Boot)、非Java语言项目接入Spring Cloud方案
  20. MVC+Nhibernate+spring.net(三)

热门文章

  1. # Django 2.2.*问题记录
  2. RocketMQ介绍与实践
  3. Apple store,奢华背后的辛酸
  4. 从 ListView 到 RecyclerView 的用法浅析
  5. C++走向远洋——64(项目三、数组类模板)
  6. Maven使用和配置
  7. 2,Java中的数据结构
  8. 使用EventBus + Redis发布订阅模式提升业务执行性能(下)
  9. 一个轻量级的基于 .NET Core 的 ORM 框架 HSQL
  10. JZOJ 1775. 合并果子2 (Standard IO)