# 使用 扩展库 Microsoft.DotNet.Interactive.ExtensionLab Microsoft.DotNet.Interactive.ExtensionLab 是 .NET Interactive 的扩展工具库,主要用于增强交互式编程环境的功能性,提供实验性功能模块和高级数据处理能力。 ## 初始化 ```csharp #!import "./Base.ipynb" ``` ## 添加 Nuget 包 添加包成功后,有用法摘要提示! ```csharp //添加 Nuget 包 #r "nuget:Microsoft.DotNet.Interactive.ExtensionLab,*-*" #r "nuget:Microsoft.Data.Analysis" using Microsoft.DotNet.Interactive; using Microsoft.DotNet.Interactive.Commands; using Microsoft.DotNet.Interactive.Documents; using Microsoft.DotNet.Interactive.Utility; using Microsoft.DotNet.Interactive.ExtensionLab; using Microsoft.Data.Analysis; ``` ## 使用 #!linqify 魔法命令 `#!linqify` 魔法命令, 将一个普通的(通常是 C#)代码块转换为 LINQ 查询表达式。这允许你使用更简洁、更声明式的 LINQ 语法来操作数据集合。 注意:没有提供新的Linq功能,只是对原生linq的增强(隐匿返回),方便在Polyglot Notebooks 中使用而已。使用原生还是增强的,随个人喜好。 增强: + 隐式返回 在普通的 C# 代码中,你需要显式地 return LINQ 查询的结果才能看到输出。 使用 #!linqify,查询结果会自动作为单元格的输出返回,无需显式 return 语句。这在交互式 notebook 环境中更方便。 + 简洁性 #!linqify 允许你省略一些样板代码。例如,你不需要定义一个单独的变量来存储 LINQ 查询的结果。 + 交互性 #!linqify是为了更好地适应交互式 notebook 环境而设计的。它简化了在 notebook 中快速编写、执行和查看 LINQ 查询结果的过程。 `C#原生Linq` 与 `linqify魔法命令` 使用对比 ```csharp //公用数据 var students = new List() { new Student(){Id = 1, Name = "张三", Age = 8}, new Student(){Id = 2, Name = "李四", Age = 95}, new Student(){Id = 3, Name = "王五", Age = 60}, new Student(){Id = 4, Name = "张三丰", Age = 54}, new Student(){Id = 5, Name = "王二小", Age = 21}, new Student(){Id = 6, Name = "刘胡兰", Age = 74}, new Student(){Id = 7, Name = "列宁", Age = 19}, new Student(){Id = 8, Name = "江姐", Age = 52}, new Student(){Id = 9, Name = "张海迪", Age = 33}, new Student(){Id = 10, Name = "周小呼", Age = 46}, }; ``` ```csharp //原生Linq var result = students.Where(s => s.Name.StartsWith("张")).ToList(); result.Display(); //或者 var result2 = from s in students where s.Name.StartsWith("张") select s; result.Display(); ``` ```csharp #!linqify students.Where(it => it.Age > 20) ``` 总结: + #!linqify 不是为了实现 LINQ 本身。 + #!linqify 是为了简化 LINQ 在 .NET Interactive Notebooks 中的 交互式使用,通过提供隐式返回和更简洁的语法。 + 在功能上,使用 #!linqify 和直接编写 C# LINQ 代码是等价的。 你可以选择哪种方式更适合你的编码风格和工作流程。 ## ExplainCode 这个扩展使用 Mermaid 内核为 csharp 代码生成序列图.以直观的图形方式,展现代码的执行流程。 ```csharp #!explain var data = new[] { 1, 2, 3 }; for (var i = 0; i < data.Length; i++) { Console.WriteLine(i.ToString()); } ``` ```csharp #!explain "Hello Explain".Display(); ``` ## 使用 #!inspect 命令,检查代码编译详细信息! #!inspect 命令,允许您查看C#单元格代码的反编译、IL和JIT Asm. 注意:深色模式下,展示区顶部的Tab[C# | IL JIT | ASM]不明显,但可以正常点击切换,或者换个VSCode主题。 ```csharp #!inspect foreach(var x in Enumerable.Range(1,10)) { Console.WriteLine(x); } ``` ## 使用 #!record命令来保存您运行的代码的副本 一旦您使用 #!recore 启用转录本记录,每个代码提交(包括重新运行的单元格)都记录在指定的文件中。所使用的JSON格式与.NET Interactive stdio和http API识别的格式相同,可用于通过自动化回放交互式会话。 1. 使用 record 魔法命令,设定转录文件 ```csharp #!record --output recore.json //会在笔记所在的目录生成 recore.json 文件 Console.WriteLine("hello,record!"); ``` 2. 读取转录文件 ```csharp using System.IO; var fileContent = await File.ReadAllTextAsync("recore.json",System.Text.Encoding.UTF8); Console.WriteLine(fileContent); ```