You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
PolyglotNotebooksStudy/Docs/多语言笔记.5.1.使用扩展库.md

113 lines
4.4 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 使用 扩展库 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<Student>()
{
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);
```