├── csharp-scenarios
├── images
│ ├── alien-ship.png
│ └── split-method.png
└── 01-Alien-Translator.ipynb
├── notebook-getting-started
├── images
│ ├── play.png
│ ├── run all.png
│ ├── done timer.png
│ ├── edit markdown.png
│ ├── hover buttons.png
│ ├── save markdown.png
│ └── progress timer.png
├── REF-VS Keyboard Shortcuts.ipynb
├── 01-What are Notebooks.ipynb
├── 03-Markdown Cells.ipynb
└── 02-Code Cells.ipynb
├── CODE_OF_CONDUCT.md
├── machine-learning
├── data
│ ├── usa_hockey.csv
│ ├── europe_hockey.csv
│ ├── iris-test.tsv
│ ├── playerSalary.json
│ ├── iris-train.tsv
│ └── titanic-submission.csv
├── shorturl_bulk.csv
├── 01-Intro to Machine Learning.ipynb
└── E2E-Text-Classification-API-with-Yelp-Dataset.ipynb
├── LICENSE
├── SECURITY.md
├── csharp-101
├── shorturl_bulk.csv
├── 09-Combining Branches and Loops.ipynb
├── 06-Numbers and Decimals.ipynb
├── 03-Searching Strings.ipynb
├── 12-Lists of Other Types.ipynb
├── 11- Search, Sort, and Index Lists.ipynb
├── 01-Hello World.ipynb
├── 07-Branches (if).ipynb
├── 08-What Are Loops.ipynb
├── 02-The Basics of Strings.ipynb
├── 04-Numbers and Integer Math.ipynb
├── 05-Numbers and Integer Precision.ipynb
├── 10-Arrays, Lists, and Collections.ipynb
└── 13-Objects and Classes.ipynb
├── .gitignore
└── README.md
/csharp-scenarios/images/alien-ship.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kinfey/csharp-notebooks/HEAD/csharp-scenarios/images/alien-ship.png
--------------------------------------------------------------------------------
/csharp-scenarios/images/split-method.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kinfey/csharp-notebooks/HEAD/csharp-scenarios/images/split-method.png
--------------------------------------------------------------------------------
/notebook-getting-started/images/play.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kinfey/csharp-notebooks/HEAD/notebook-getting-started/images/play.png
--------------------------------------------------------------------------------
/notebook-getting-started/images/run all.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kinfey/csharp-notebooks/HEAD/notebook-getting-started/images/run all.png
--------------------------------------------------------------------------------
/notebook-getting-started/images/done timer.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kinfey/csharp-notebooks/HEAD/notebook-getting-started/images/done timer.png
--------------------------------------------------------------------------------
/notebook-getting-started/images/edit markdown.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kinfey/csharp-notebooks/HEAD/notebook-getting-started/images/edit markdown.png
--------------------------------------------------------------------------------
/notebook-getting-started/images/hover buttons.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kinfey/csharp-notebooks/HEAD/notebook-getting-started/images/hover buttons.png
--------------------------------------------------------------------------------
/notebook-getting-started/images/save markdown.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kinfey/csharp-notebooks/HEAD/notebook-getting-started/images/save markdown.png
--------------------------------------------------------------------------------
/notebook-getting-started/images/progress timer.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kinfey/csharp-notebooks/HEAD/notebook-getting-started/images/progress timer.png
--------------------------------------------------------------------------------
/CODE_OF_CONDUCT.md:
--------------------------------------------------------------------------------
1 | # Code of Conduct
2 |
3 | This project has adopted the code of conduct defined by the Contributor Covenant
4 | to clarify expected behavior in our community.
5 | For more information, see the [.NET Foundation Code of Conduct](https://dotnetfoundation.org/code-of-conduct).
6 |
--------------------------------------------------------------------------------
/machine-learning/data/usa_hockey.csv:
--------------------------------------------------------------------------------
1 | Birthday,Nat,Height,Weight,DraftYear,OverallDraft,Hand,Last Name,First Name,Position,Team,GamesPlayed,Goals,Assists,Points,PIM,Shifts,TimeOnIce
2 | 88-16-04,USA,72,218,2006,7,R,Okposo,Kyle,RW,BUF,65,19,26,45,24,1443,73983
3 | 90-08-10,USA,76,210,2009,114,L,Helgeson,Seth,D,N.J,9,1,0,1,15,177,7273
4 | 96-26-11,USA,77,203,2015,37,R,Carlo,Brandon,D,BOS,82,6,10,16,59,2080,102414
5 | 90-16-11,USA,74,219,,,L,Schaller,Tim,C,BOS,59,7,7,14,23,1035,43436
6 | 92-20-03,USA,72,215,2010,37,R,Faulk,Justin,D,CAR,75,17,20,37,32,1987,104133
7 | 94-01-05,USA,74,205,2012,120,L,Slavin,Jaccob,D,CAR,82,5,29,34,12,2135,115316
8 | 90-20-06,USA,75,221,2008,128,R,Pateryn,Greg,D,DAL/MTL,36,1,8,9,10,720,33312
9 | 90-27-05,USA,74,196,2009,198,R,Dowd,Nic,C,L.A,70,6,16,22,25,1230,52314
10 | 90-16-07,USA,75,221,,,L,Lashoff,Brian,D,DET,5,0,0,0,0,93,3754
11 | 86-09-08,USA,71,197,,,R,Cannone,Patrick,C,MIN,3,0,0,0,0,35,1419
12 |
--------------------------------------------------------------------------------
/machine-learning/data/europe_hockey.csv:
--------------------------------------------------------------------------------
1 | Birthday,Nat,Height_cm,Weight_kg,DraftYear,OverallDraft,Hand,Last Name,First Name,Position,Team,GamesPlayed,Goals,Assists,Points,PIM,Shifts,TimeOnIce
2 | 90-11-21,SWE,180,84,2009,53,L,Rodin,Anton,RW,VAN,3,0,1,1,0,40,1604
3 | 86-04-28,CZE,188,107,2004,180,R,Polak,Roman,D,TOR,75,4,7,11,65,1817,80643
4 | 90-11-29,CZE,201,100,,,R,Sustr,Andrej,D,T.B,80,3,11,14,43,1813,84427
5 | 96-05-25,CZE,183,82,2014,25,R,Pastrnak,David,RW/LW,BOS,75,34,36,70,34,1597,80921
6 | 94/03/23,SWE,190,95,2012,81,R,Sundqvist,Oskar,C,PIT,10,0,0,0,2,138,5504
7 | 90-06-05,CZE,183,93,2010,66,R,Gudas,Radko,D,PHI,67,6,17,23,93,1739,77555
8 | 90-06-01,CHE,185,91,2008,38,L,Josi,Roman,D,NSH,72,12,37,49,18,2076,108323
9 | 86-08-01,SWE,180,86,2005,216,R,Stralman,Anton,D,T.B,73,5,17,22,20,1963,100304
10 | 92-11-12,SWE,190,98,2011,4,R,Larsson,Adam,D,EDM,79,4,15,19,55,2055,95509
11 | 89-11-21,FRA,183,91,,,L,Roussel,Antoine,LW,DAL,60,12,15,27,115,1427,55866
12 |
--------------------------------------------------------------------------------
/machine-learning/data/iris-test.tsv:
--------------------------------------------------------------------------------
1 | Label Sepal length Sepal width Petal length Petal width
2 | setosa 5.1 3.5 1.4 0.2
3 | setosa 4.9 3.0 1.4 0.2
4 | setosa 4.7 3.2 1.3 0.2
5 | setosa 4.6 3.1 1.5 0.2
6 | setosa 5.0 3.6 1.4 0.2
7 | setosa 5.4 3.9 1.7 0.4
8 | setosa 4.6 3.4 1.4 0.3
9 | setosa 5.0 3.4 1.5 0.2
10 | setosa 4.4 2.9 1.4 0.2
11 | setosa 4.9 3.1 1.5 0.1
12 | versicolor 7.0 3.2 4.7 1.4
13 | versicolor 6.4 3.2 4.5 1.5
14 | versicolor 6.9 3.1 4.9 1.5
15 | versicolor 5.5 2.3 4.0 1.3
16 | versicolor 6.5 2.8 4.6 1.5
17 | versicolor 5.7 2.8 4.5 1.3
18 | versicolor 6.3 3.3 4.7 1.6
19 | versicolor 4.9 2.4 3.3 1.0
20 | versicolor 6.6 2.9 4.6 1.3
21 | versicolor 5.2 2.7 3.9 1.4
22 | virginica 6.3 3.3 6.0 2.5
23 | virginica 5.8 2.7 5.1 1.9
24 | virginica 7.1 3.0 5.9 2.1
25 | virginica 6.3 2.9 5.6 1.8
26 | virginica 6.5 3.0 5.8 2.2
27 | virginica 7.6 3.0 6.6 2.1
28 | virginica 4.9 2.5 4.5 1.7
29 | virginica 7.3 2.9 6.3 1.8
30 | virginica 6.7 2.5 5.8 1.8
31 | virginica 7.2 3.6 6.1 2.5
32 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) .NET Foundation. All rights reserved.
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE
22 |
--------------------------------------------------------------------------------
/machine-learning/data/playerSalary.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "Salary": 3000000,
4 | "Name": "Adam Larsson"
5 | },
6 | {
7 | "Salary": 1600000,
8 | "Name": "Andrej Sustr"
9 | },
10 | {
11 | "Salary": 2200000,
12 | "Name": "Antoine Roussel"
13 | },
14 | {
15 | "Salary": 950000,
16 | "Name": "Anton Rodin"
17 | },
18 | {
19 | "Salary": 4500000,
20 | "Name": "Anton Stralman"
21 | },
22 | {
23 | "Salary": 717500,
24 | "Name": "Brandon Carlo"
25 | },
26 | {
27 | "Salary": 650000,
28 | "Name": "Brian Lashoff"
29 | },
30 | {
31 | "Salary": 925000,
32 | "Name": "David Pastrnak"
33 | },
34 | {
35 | "Salary": 750000,
36 | "Name": "Greg Pateryn"
37 | },
38 | {
39 | "Salary": 742500,
40 | "Name": "Jaccob Slavin"
41 | },
42 | {
43 | "Salary": 5500000,
44 | "Name": "Justin Faulk"
45 | },
46 | {
47 | "Salary": 8000000,
48 | "Name": "Kyle Okposo"
49 | },
50 | {
51 | "Salary": 792500,
52 | "Name": "Oskar Sundqvist"
53 | },
54 | {
55 | "Salary": 600000,
56 | "Name": "Patrick Cannone"
57 | },
58 | {
59 | "Salary": 4000000,
60 | "Name": "Radko Gudas"
61 | },
62 | {
63 | "Salary": 4250000,
64 | "Name": "Roman Josi"
65 | },
66 | {
67 | "Salary": 2250000,
68 | "Name": "Roman Polak"
69 | },
70 | {
71 | "Salary": 600000,
72 | "Name": "Seth Helgeson"
73 | },
74 | {
75 | "Salary": 600000,
76 | "Name": "Tim Schaller"
77 | }
78 | ]
--------------------------------------------------------------------------------
/notebook-getting-started/REF-VS Keyboard Shortcuts.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# **VS Notebook 编辑器快捷键**\n",
8 | "\n",
9 | "## **编辑器快捷键**\n",
10 | "这些快捷方式仅在焦点位于 Code 或 Markdown 编辑器内时才有效。 当焦点位于单元格上时,您可以按 “回车” 将焦点移到编辑器中。\n",
11 | "\n",
12 | "| 按键 | 对应指令 |\n",
13 | "|----------|------|\n",
14 | "| ESC | 将焦点移到单元格 |\n",
15 | "| ctrl+shift+- | 拆分 cell|\n",
16 | "| ctrl+enter | 运行当前 cell|\n",
17 | "| shift+enter | 运行当前 cell 并向下移动焦点|\n",
18 | "\n",
19 | "## **Cell 快捷键**\n",
20 | "这些快捷方式仅在焦点位于 cell 级别时才有效。 当焦点在编辑器上时,您可以按 ESC 将焦点移动到 cell\n",
21 | "\n",
22 | "| 按键 | 对应指令 |\n",
23 | "|----------|------|\n",
24 | "| ENTER | 将焦点移至编辑器|\n",
25 | "| K | 焦点向上移动|\n",
26 | "| J | 焦点向下移动|\n",
27 | "| A | 在上方插入 cell|\n",
28 | "| B | 在下方插入 cell|\n",
29 | "| DD | 删除 cell|\n",
30 | "| Z | 撤销 |\n",
31 | "| S | 保存 |\n",
32 | "| C | 复制 Cell |\n",
33 | "| X | 剪切 Cell |\n",
34 | "| V | 粘贴 Cell |\n",
35 | "| L | 切换行号|\n",
36 | "| O | 切换输出|\n",
37 | "| II | 停止 cell 执行|\n",
38 | "| 00 | 重启 kernel|\n",
39 | "\n"
40 | ]
41 | },
42 | {
43 | "cell_type": "markdown",
44 | "metadata": {},
45 | "source": []
46 | }
47 | ],
48 | "metadata": {
49 | "kernelspec": {
50 | "display_name": ".NET (C#)",
51 | "language": "C#",
52 | "name": ".net-csharp"
53 | },
54 | "language_info": {
55 | "file_extension": ".cs",
56 | "mimetype": "text/x-csharp",
57 | "name": "C#",
58 | "pygments_lexer": "csharp",
59 | "version": "8.0"
60 | }
61 | },
62 | "nbformat": 4,
63 | "nbformat_minor": 4
64 | }
65 |
--------------------------------------------------------------------------------
/machine-learning/shorturl_bulk.csv:
--------------------------------------------------------------------------------
1 | URL,Domain,Alias
2 | vsnb://OpenNotebook?url=https://raw.githubusercontent.com/dotnet/csharp-notebooks/main/machine-learning/01-Intro%20to%20Machine%20Learning.ipynb,ntbk.io,ml-01-intro
3 | vsnb://OpenNotebook?url=https://raw.githubusercontent.com/dotnet/csharp-notebooks/main/machine-learning/02-Data Preparation and Feature Engineering.ipynb,ntbk.io,ml-02-data
4 | vsnb://OpenNotebook?url=https://raw.githubusercontent.com/dotnet/csharp-notebooks/main/machine-learning/03-Training and AutoML.ipynb,ntbk.io,ml-03-training
5 | vsnb://OpenNotebook?url=https://raw.githubusercontent.com/dotnet/csharp-notebooks/main/machine-learning/04-Model Evaluation.ipynb,ntbk.io,ml-04-evaluation
6 | vsnb://OpenNotebook?url=https://raw.githubusercontent.com/dotnet/csharp-notebooks/main/machine-learning/E2E-Classification with Iris Dataset.ipynb,ntbk.io,ml-e2e-iris
7 | vsnb://OpenNotebook?url=https://raw.githubusercontent.com/dotnet/csharp-notebooks/main/machine-learning/E2E-Forecasting using Regression with Luna Dataset.ipynb,ntbk.io,ml-e2e-luna-regression
8 | vsnb://OpenNotebook?url=https://raw.githubusercontent.com/dotnet/csharp-notebooks/main/machine-learning/E2E-Forecasting using SSA with Luna Dataset.ipynb,ntbk.io,ml-e2e-luna-ssa
9 | vsnb://OpenNotebook?url=https://raw.githubusercontent.com/dotnet/csharp-notebooks/main/machine-learning/E2E-Regression with Taxi Dataset.ipynb,ntbk.io,ml-e2e-taxi
10 | vsnb://OpenNotebook?url=https://raw.githubusercontent.com/dotnet/csharp-notebooks/main/machine-learning/E2E-Text-Classification-API-with-Yelp-Dataset.ipynb,ntbk.io,ml-e2e-text-classification-api
11 | vsnb://OpenNotebook?url=https://raw.githubusercontent.com/dotnet/csharp-notebooks/main/machine-learning/REF-Data Processing with DataFrame.ipynb,ntbk.io,ml-ref-data-frame
12 | vsnb://OpenNotebook?url=https://raw.githubusercontent.com/dotnet/csharp-notebooks/main/machine-learning/REF-Graphs and Visualizations.ipynb,ntbk.io,ml-ref-visualizations
13 | vsnb://OpenNotebook?url=https://raw.githubusercontent.com/dotnet/csharp-notebooks/main/machine-learning/REF-Kaggle with Titanic Dataset.ipynb,ntbk.io,ml-ref-kaggle-titanic
14 |
--------------------------------------------------------------------------------
/SECURITY.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | ## Security
4 |
5 | Microsoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/).
6 |
7 | If you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://docs.microsoft.com/en-us/previous-versions/tn-archive/cc751383(v=technet.10)), please report it to us as described below.
8 |
9 | ## Reporting Security Issues
10 |
11 | **Please do not report security vulnerabilities through public GitHub issues.**
12 |
13 | Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://msrc.microsoft.com/create-report).
14 |
15 | If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://www.microsoft.com/en-us/msrc/pgp-key-msrc).
16 |
17 | You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://www.microsoft.com/msrc).
18 |
19 | Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue:
20 |
21 | * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.)
22 | * Full paths of source file(s) related to the manifestation of the issue
23 | * The location of the affected source code (tag/branch/commit or direct URL)
24 | * Any special configuration required to reproduce the issue
25 | * Step-by-step instructions to reproduce the issue
26 | * Proof-of-concept or exploit code (if possible)
27 | * Impact of the issue, including how an attacker might exploit the issue
28 |
29 | This information will help us triage your report more quickly.
30 |
31 | If you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://microsoft.com/msrc/bounty) page for more details about our active programs.
32 |
33 | ## Preferred Languages
34 |
35 | We prefer all communications to be in English.
36 |
37 | ## Policy
38 |
39 | Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://www.microsoft.com/en-us/msrc/cvd).
40 |
41 |
--------------------------------------------------------------------------------
/csharp-101/shorturl_bulk.csv:
--------------------------------------------------------------------------------
1 | URL,Domain,Alias
2 | vscode://ms-dotnettools.dotnet-interactive-vscode/openNotebook?url=https://raw.githubusercontent.com/dotnet/csharp-notebooks/main/csharp-101/01-Hello%20World.ipynb,ntbk.io,csharp101-notebook01
3 | vscode://ms-dotnettools.dotnet-interactive-vscode/openNotebook?url=https://raw.githubusercontent.com/dotnet/csharp-notebooks/main/csharp-101/02-The%20Basics%20of%20Strings.ipynb,ntbk.io,csharp101-notebook02
4 | vscode://ms-dotnettools.dotnet-interactive-vscode/openNotebook?url=https://raw.githubusercontent.com/dotnet/csharp-notebooks/main/csharp-101/03-Searching%20Strings.ipynb,ntbk.io,csharp101-notebook03
5 | vscode://ms-dotnettools.dotnet-interactive-vscode/openNotebook?url=https://raw.githubusercontent.com/dotnet/csharp-notebooks/main/csharp-101/04-Numbers%20and%20Integer%20Math.ipynb,ntbk.io,csharp101-notebook04
6 | vscode://ms-dotnettools.dotnet-interactive-vscode/openNotebook?url=https://raw.githubusercontent.com/dotnet/csharp-notebooks/main/csharp-101/05-Numbers%20and%20Integer%20Precision.ipynb,ntbk.io,csharp101-notebook05
7 | vscode://ms-dotnettools.dotnet-interactive-vscode/openNotebook?url=https://raw.githubusercontent.com/dotnet/csharp-notebooks/main/csharp-101/06-Numbers%20and%20Decimals.ipynb,ntbk.io,csharp101-notebook06
8 | vscode://ms-dotnettools.dotnet-interactive-vscode/openNotebook?url=https://raw.githubusercontent.com/dotnet/csharp-notebooks/main/csharp-101/07-Branches%20(if).ipynb,ntbk.io,csharp101-notebook07
9 | vscode://ms-dotnettools.dotnet-interactive-vscode/openNotebook?url=https://raw.githubusercontent.com/dotnet/csharp-notebooks/main/csharp-101/08-What%20Are%20Loops.ipynb,ntbk.io,csharp101-notebook08
10 | vscode://ms-dotnettools.dotnet-interactive-vscode/openNotebook?url=https://raw.githubusercontent.com/dotnet/csharp-notebooks/main/csharp-101/09-Combining%20Branches%20and%20Loops.ipynb,ntbk.io,csharp101-notebook09
11 | vscode://ms-dotnettools.dotnet-interactive-vscode/openNotebook?url=https://raw.githubusercontent.com/dotnet/csharp-notebooks/main/csharp-101/10-Arrays%2C%20Lists%2C%20and%20Collections.ipynb,ntbk.io,csharp101-notebook10
12 | vscode://ms-dotnettools.dotnet-interactive-vscode/openNotebook?url=https://raw.githubusercontent.com/dotnet/csharp-notebooks/main/csharp-101/11-%20Search%2C%20Sort%2C%20and%20Index%20Lists.ipynb,ntbk.io,csharp101-notebook11
13 | vscode://ms-dotnettools.dotnet-interactive-vscode/openNotebook?url=https://raw.githubusercontent.com/dotnet/csharp-notebooks/main/csharp-101/12-Lists%20of%20Other%20Types.ipynb,ntbk.io,csharp101-notebook12
14 | vscode://ms-dotnettools.dotnet-interactive-vscode/openNotebook?url=https://raw.githubusercontent.com/dotnet/csharp-notebooks/main/csharp-101/13-Objects%20and%20Classes.ipynb,ntbk.io,csharp101-notebook13
15 | vscode://ms-dotnettools.dotnet-interactive-vscode/openNotebook?url=https://raw.githubusercontent.com/dotnet/csharp-notebooks/main/csharp-101/14-Methods%20and%20Members.ipynb,ntbk.io,csharp101-notebook14
16 | vscode://ms-dotnettools.dotnet-interactive-vscode/openNotebook?url=https://raw.githubusercontent.com/dotnet/csharp-notebooks/main/csharp-101/15-Methods%20and%20Exceptions.ipynb,ntbk.io,csharp101-notebook15
17 |
--------------------------------------------------------------------------------
/machine-learning/data/iris-train.tsv:
--------------------------------------------------------------------------------
1 | Label Sepal length Sepal width Petal length Petal width
2 | setosa 5.4 3.7 1.5 0.2
3 | setosa 4.8 3.4 1.6 0.2
4 | setosa 4.8 3 1.4 0.1
5 | setosa 4.3 3 1.1 0.1
6 | setosa 5.8 4 1.2 0.2
7 | setosa 5.7 4.4 1.5 0.4
8 | setosa 5.4 3.9 1.3 0.4
9 | setosa 5.1 3.5 1.4 0.3
10 | setosa 5.7 3.8 1.7 0.3
11 | setosa 5.1 3.8 1.5 0.3
12 | setosa 5.4 3.4 1.7 0.2
13 | setosa 5.1 3.7 1.5 0.4
14 | setosa 4.6 3.6 1 0.2
15 | setosa 5.1 3.3 1.7 0.5
16 | setosa 4.8 3.4 1.9 0.2
17 | setosa 5 3 1.6 0.2
18 | setosa 5 3.4 1.6 0.4
19 | setosa 5.2 3.5 1.5 0.2
20 | setosa 5.2 3.4 1.4 0.2
21 | setosa 4.7 3.2 1.6 0.2
22 | setosa 4.8 3.1 1.6 0.2
23 | setosa 5.4 3.4 1.5 0.4
24 | setosa 5.2 4.1 1.5 0.1
25 | setosa 5.5 4.2 1.4 0.2
26 | setosa 4.9 3.1 1.5 0.1
27 | setosa 5 3.2 1.2 0.2
28 | setosa 5.5 3.5 1.3 0.2
29 | setosa 4.9 3.1 1.5 0.1
30 | setosa 4.4 3 1.3 0.2
31 | setosa 5.1 3.4 1.5 0.2
32 | setosa 5 3.5 1.3 0.3
33 | setosa 4.5 2.3 1.3 0.3
34 | setosa 4.4 3.2 1.3 0.2
35 | setosa 5 3.5 1.6 0.6
36 | setosa 5.1 3.8 1.9 0.4
37 | setosa 4.8 3 1.4 0.3
38 | setosa 5.1 3.8 1.6 0.2
39 | setosa 4.6 3.2 1.4 0.2
40 | setosa 5.3 3.7 1.5 0.2
41 | setosa 5 3.3 1.4 0.2
42 | versicolor 5 2 3.5 1
43 | versicolor 5.9 3 4.2 1.5
44 | versicolor 6 2.2 4 1
45 | versicolor 6.1 2.9 4.7 1.4
46 | versicolor 5.6 2.9 3.6 1.3
47 | versicolor 6.7 3.1 4.4 1.4
48 | versicolor 5.6 3 4.5 1.5
49 | versicolor 5.8 2.7 4.1 1
50 | versicolor 6.2 2.2 4.5 1.5
51 | versicolor 5.6 2.5 3.9 1.1
52 | versicolor 5.9 3.2 4.8 1.8
53 | versicolor 6.1 2.8 4 1.3
54 | versicolor 6.3 2.5 4.9 1.5
55 | versicolor 6.1 2.8 4.7 1.2
56 | versicolor 6.4 2.9 4.3 1.3
57 | versicolor 6.6 3 4.4 1.4
58 | versicolor 6.8 2.8 4.8 1.4
59 | versicolor 6.7 3 5 1.7
60 | versicolor 6 2.9 4.5 1.5
61 | versicolor 5.7 2.6 3.5 1
62 | versicolor 5.5 2.4 3.8 1.1
63 | versicolor 5.5 2.4 3.7 1
64 | versicolor 5.8 2.7 3.9 1.2
65 | versicolor 6 2.7 5.1 1.6
66 | versicolor 5.4 3 4.5 1.5
67 | versicolor 6 3.4 4.5 1.6
68 | versicolor 6.7 3.1 4.7 1.5
69 | versicolor 6.3 2.3 4.4 1.3
70 | versicolor 5.6 3 4.1 1.3
71 | versicolor 5.5 2.5 4 1.3
72 | versicolor 5.5 2.6 4.4 1.2
73 | versicolor 6.1 3 4.6 1.4
74 | versicolor 5.8 2.6 4 1.2
75 | versicolor 5 2.3 3.3 1
76 | versicolor 5.6 2.7 4.2 1.3
77 | versicolor 5.7 3 4.2 1.2
78 | versicolor 5.7 2.9 4.2 1.3
79 | versicolor 6.2 2.9 4.3 1.3
80 | versicolor 5.1 2.5 3 1.1
81 | versicolor 5.7 2.8 4.1 1.3
82 | virginica 6.5 3.2 5.1 2
83 | virginica 6.4 2.7 5.3 1.9
84 | virginica 6.8 3 5.5 2.1
85 | virginica 5.7 2.5 5 2
86 | virginica 5.8 2.8 5.1 2.4
87 | virginica 6.4 3.2 5.3 2.3
88 | virginica 6.5 3 5.5 1.8
89 | virginica 7.7 3.8 6.7 2.2
90 | virginica 7.7 2.6 6.9 2.3
91 | virginica 6 2.2 5 1.5
92 | virginica 6.9 3.2 5.7 2.3
93 | virginica 5.6 2.8 4.9 2
94 | virginica 7.7 2.8 6.7 2
95 | virginica 6.3 2.7 4.9 1.8
96 | virginica 6.7 3.3 5.7 2.1
97 | virginica 7.2 3.2 6 1.8
98 | virginica 6.2 2.8 4.8 1.8
99 | virginica 6.1 3 4.9 1.8
100 | virginica 6.4 2.8 5.6 2.1
101 | virginica 7.2 3 5.8 1.6
102 | virginica 7.4 2.8 6.1 1.9
103 | virginica 7.9 3.8 6.4 2
104 | virginica 6.4 2.8 5.6 2.2
105 | virginica 6.3 2.8 5.1 1.5
106 | virginica 6.1 2.6 5.6 1.4
107 | virginica 7.7 3 6.1 2.3
108 | virginica 6.3 3.4 5.6 2.4
109 | virginica 6.4 3.1 5.5 1.8
110 | virginica 6 3 4.8 1.8
111 | virginica 6.9 3.1 5.4 2.1
112 | virginica 6.7 3.1 5.6 2.4
113 | virginica 6.9 3.1 5.1 2.3
114 | virginica 5.8 2.7 5.1 1.9
115 | virginica 6.8 3.2 5.9 2.3
116 | virginica 6.7 3.3 5.7 2.5
117 | virginica 6.7 3 5.2 2.3
118 | virginica 6.3 2.5 5 1.9
119 | virginica 6.5 3 5.2 2
120 | virginica 6.2 3.4 5.4 2.3
121 | virginica 5.9 3 5.1 1.8
122 |
--------------------------------------------------------------------------------
/csharp-101/09-Combining Branches and Loops.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# **挑战:分支和循环结合**\n",
8 | "\n",
9 | "观看该模块的教学视频 [C# 101 video](https://www.youtube.com/watch?v=qK7tUpaOXi8&list=PLdo4fOcmZ0oVxKLQCHpiUWun7vlJJvUiN&index=11) \n",
10 | "\n",
11 | "这是一个挑战:\n",
12 | ">\n",
13 | "> 看看你是否可以编写 C# 代码来找出所有能从 1 到 20 能被 3 整除的整数总和。\n",
14 | ">\n",
15 | "首先,在下面的这个笔记本、Visual Studio 或 Visual Studio Code 中自行尝试。"
16 | ]
17 | },
18 | {
19 | "cell_type": "code",
20 | "execution_count": null,
21 | "metadata": {
22 | "dotnet_interactive": {
23 | "language": "csharp"
24 | },
25 | "vscode": {
26 | "languageId": "dotnet-interactive.csharp"
27 | }
28 | },
29 | "outputs": [
30 | {
31 | "name": "stdout",
32 | "output_type": "stream",
33 | "text": [
34 | "Challenge\r\n"
35 | ]
36 | }
37 | ],
38 | "source": [
39 | "Console.WriteLine(\"Challenge\");"
40 | ]
41 | },
42 | {
43 | "cell_type": "markdown",
44 | "metadata": {},
45 | "source": [
46 | "## **技巧和窍门**\n",
47 | "\n",
48 | "- `%` 运算符为您提供除法运算的余数。\n",
49 | "- `if` 语句为您提供了判断一个数字是否应该是总和的一部分的条件。\n",
50 | "- `for` 循环可以帮助您对所有数字 1 到 20 重复一系列步骤。\n",
51 | "- 得到一个奇怪的答案? 尝试对您的变量进行一些打印语句,以查看它们是否发生了意外变化。\n",
52 | "\n",
53 | "## **检查你的答案**\n",
54 | "\n",
55 | "你的最终答案应该是 63。\n",
56 | "\n",
57 | "## **得到帮助**\n",
58 | "\n",
59 | "感觉卡住了?\n",
60 | "\n",
61 | "- 观看 [视频](https://www.youtube.com/watch?v=qK7tUpaOXi8&list=PLdo4fOcmZ0oVxKLQCHpiUWun7vlJJvUiN&index=11),看看有人解决了这个问题。 一旦你感觉到它,试着自己暂停和完成代码!\n",
62 | "- 检查您的 [答案](https://github.com/dotnet/samples/blob/main/csharp/branches-quickstart/Program.cs#L87-L95)。"
63 | ]
64 | },
65 | {
66 | "cell_type": "markdown",
67 | "metadata": {},
68 | "source": [
69 | "# **进阶学习**\n",
70 | "\n",
71 | "> [⏩ 下一个学习模块 - 数组、列表和集合](https://github.com/kinfey/csharp-notebooks/blob/main/csharp-101/10-Arrays%2C%20Lists%2C%20and%20Collections.ipynb)\n",
72 | ">\n",
73 | "> [⏪ 上一个学习模块 - 什么是循环?](https://github.com/kinfey/csharp-notebooks/blob/main/csharp-101/08-What%20Are%20Loops.ipynb)\n",
74 | ">\n",
75 | "> [观看教学视频](https://www.youtube.com/watch?v=qK7tUpaOXi8&list=PLdo4fOcmZ0oVxKLQCHpiUWun7vlJJvUiN&index=11)\n",
76 | ">\n",
77 | "> [文档: C# 条件语句](https://aka.ms/CSharp.If)\n",
78 | ">\n",
79 | "> [文档: C# 循环语句](https://aka.ms/CSharp.Loop)\n",
80 | ">\n",
81 | "> [从头学起: 什么是 C# ?](https://www.youtube.com/watch?v=BM4CHBmAPh4&list=PLdo4fOcmZ0oVxKLQCHpiUWun7vlJJvUiN&index=1)"
82 | ]
83 | },
84 | {
85 | "cell_type": "markdown",
86 | "metadata": {},
87 | "source": [
88 | "# **其他资源**\n",
89 | "\n",
90 | "你可以从以下链接中获取\n",
91 | "> [其他 101 系列的教学视频](https://aka.ms/Videos.dotNET)\n",
92 | ">\n",
93 | "> [Microsoft Learn](https://aka.ms/Learn.dotNET)\n",
94 | ">\n",
95 | "> [C# 文档](https://aka.ms/Docs.CSharp)"
96 | ]
97 | }
98 | ],
99 | "metadata": {
100 | "kernelspec": {
101 | "display_name": ".NET (C#)",
102 | "language": "C#",
103 | "name": ".net-csharp"
104 | },
105 | "language_info": {
106 | "file_extension": ".cs",
107 | "mimetype": "text/x-csharp",
108 | "name": "C#",
109 | "pygments_lexer": "csharp",
110 | "version": "8.0"
111 | }
112 | },
113 | "nbformat": 4,
114 | "nbformat_minor": 4
115 | }
116 |
--------------------------------------------------------------------------------
/notebook-getting-started/01-What are Notebooks.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "## **什么是 Notebooks?**\n",
8 | "Notebooks 是将代码(C#、F#、Python 等)、输出、可视化视图以及文档(Markdown)全部综合在一起的交互式工具。\n",
9 | "\n",
10 | "## **Notebooks 的应用场景在哪里?**\n",
11 | "Notebooks 常用于统计、数据科学和机器学习的场景。 这些场景中 Notebooks 作为一些尝试,修改以及查看输出的工具。 通常用在数据科学和机器学习的实验性或探索性的工作中。\n",
12 | "\n",
13 | "## **我们要如何开始?**\n",
14 | "点击 \"Play\" 按钮  运行当前 Code Cell 内容或点击 \"Run All\"  运行当前 Code Cell 以下的所有 Code Cells。"
15 | ]
16 | },
17 | {
18 | "cell_type": "code",
19 | "execution_count": null,
20 | "metadata": {
21 | "dotnet_interactive": {
22 | "language": "csharp"
23 | },
24 | "vscode": {
25 | "languageId": "dotnet-interactive.csharp"
26 | }
27 | },
28 | "outputs": [
29 | {
30 | "name": "stdout",
31 | "output_type": "stream",
32 | "text": [
33 | "Hello Notebooks!\n"
34 | ]
35 | }
36 | ],
37 | "source": [
38 | "Console.WriteLine(\"Hello Notebooks!\");"
39 | ]
40 | },
41 | {
42 | "cell_type": "markdown",
43 | "metadata": {},
44 | "source": [
45 | "要添加更多 Code Cell ,您可以将鼠标悬停在 Code Cell 的上方或下方,再点击显示的添加按钮 .\n",
46 | "\n",
47 | "快捷键支持: [请参考快捷键使用的 NoteBooks ](https://raw.githubusercontent.com/JakeRadMSFT/csharp-notebooks/main/notebook-getting-started/REF-VS%20Keyboard%20Shortcuts.ipynb)"
48 | ]
49 | },
50 | {
51 | "cell_type": "markdown",
52 | "metadata": {},
53 | "source": [
54 | "## **Code Cells**\n",
55 | "\n",
56 | "Code Cells 具有 C# 的所有强大功能。 下面是执行两行 Code Cells 的简单示例,显示了如何访问 Code Cells 和传递变量值。\n",
57 | "\n",
58 | "大家可以尝试在第二个 Code Cell 中多次点击 \"Play\"!"
59 | ]
60 | },
61 | {
62 | "cell_type": "code",
63 | "execution_count": null,
64 | "metadata": {
65 | "dotnet_interactive": {
66 | "language": "csharp"
67 | },
68 | "vscode": {
69 | "languageId": "dotnet-interactive.csharp"
70 | }
71 | },
72 | "outputs": [
73 | {
74 | "data": {
75 | "text/html": [
76 | "
5
"
77 | ]
78 | },
79 | "metadata": {},
80 | "output_type": "display_data"
81 | }
82 | ],
83 | "source": [
84 | "var x = 5;\n",
85 | "x"
86 | ]
87 | },
88 | {
89 | "cell_type": "code",
90 | "execution_count": null,
91 | "metadata": {
92 | "dotnet_interactive": {
93 | "language": "csharp"
94 | },
95 | "vscode": {
96 | "languageId": "dotnet-interactive.csharp"
97 | }
98 | },
99 | "outputs": [
100 | {
101 | "data": {
102 | "text/html": [
103 | "45
"
104 | ]
105 | },
106 | "metadata": {},
107 | "output_type": "display_data"
108 | }
109 | ],
110 | "source": [
111 | "x = x + 10;\n",
112 | "x"
113 | ]
114 | },
115 | {
116 | "cell_type": "markdown",
117 | "metadata": {},
118 | "source": [
119 | "想更深入学习 Code Cells 的知识可以直接点击访问该 NoteBooks - [Code Cells](https://github.com/JakeRadMSFT/csharp-notebooks/blob/main/notebook-getting-started/02-Code%20Cells.ipynb)"
120 | ]
121 | },
122 | {
123 | "cell_type": "markdown",
124 | "metadata": {},
125 | "source": [
126 | "## **Markdown Cells**\n",
127 | "\n",
128 | "Markdown Cells 是文档格式的单元格 , 每个 Markdown Cell 都有编辑和可视化模式\n",
129 | "\n",
130 | "要进入编辑模式,选中相关的 Markdown Cell ,点击 “pencil” 按钮  \n",
131 | "\n",
132 | "完成编辑后,点击 \"勾\" 按钮查看你修改的内容  "
133 | ]
134 | },
135 | {
136 | "cell_type": "markdown",
137 | "metadata": {},
138 | "source": [
139 | "想深入了解 Markdown Cells 相关的内容请点击 - [Markdown Cells](https://github.com/JakeRadMSFT/csharp-notebooks/blob/main/notebook-getting-started/03-Markdown%20Cells.ipynb)"
140 | ]
141 | }
142 | ],
143 | "metadata": {
144 | "kernelspec": {
145 | "display_name": ".NET (C#)",
146 | "language": "C#",
147 | "name": ".net-csharp"
148 | },
149 | "language_info": {
150 | "file_extension": ".cs",
151 | "mimetype": "text/x-csharp",
152 | "name": "C#",
153 | "pygments_lexer": "csharp",
154 | "version": "9.0"
155 | },
156 | "orig_nbformat": 4
157 | },
158 | "nbformat": 4,
159 | "nbformat_minor": 2
160 | }
161 |
--------------------------------------------------------------------------------
/notebook-getting-started/03-Markdown Cells.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# **Markdown Cells**\n",
8 | "\n",
9 | "Markdown 单元可以与代码单元混合,将 Notebooks 变成教程,或者只是为一段代码提供说明。 如需完整的 Markdown 文档集,请查看 [markdownguide.org](https://www.markdownguide.org/)\n",
10 | "\n",
11 | "点击以下 Markdown Cells 的编辑按钮查看相关功能的表示方式  \n"
12 | ]
13 | },
14 | {
15 | "cell_type": "markdown",
16 | "metadata": {},
17 | "source": [
18 | "# **标题**\n",
19 | "# H1 \n",
20 | "## H2 \n",
21 | "### H3 \n",
22 | "#### H4 \n",
23 | "##### H5 \n",
24 | "###### H6 "
25 | ]
26 | },
27 | {
28 | "cell_type": "markdown",
29 | "metadata": {},
30 | "source": [
31 | "# **段落**\n",
32 | "\n",
33 | "这是段落中的一行。\n",
34 | "\n",
35 | "这是下一段!"
36 | ]
37 | },
38 | {
39 | "cell_type": "markdown",
40 | "metadata": {},
41 | "source": [
42 | "# **换行符**\n",
43 | "一行末尾的两个空格有效。 \n",
44 | "第二行。"
45 | ]
46 | },
47 | {
48 | "cell_type": "markdown",
49 | "metadata": {},
50 | "source": [
51 | "# 重点提示\n",
52 | "这是 **加粗文本**. \n",
53 | "这是 *斜体文本*. \n",
54 | "这是 ~~删除线文本~~. \n",
55 | "这是 ==突出显示的文本==. \n",
56 | "这是水的表示方式 - H~2~0 \n",
57 | "这是 x * x 的表示方式 - X^2^\n"
58 | ]
59 | },
60 | {
61 | "cell_type": "markdown",
62 | "metadata": {},
63 | "source": [
64 | "# 块引用\n",
65 | "\n",
66 | "> 所有这些文本都将被引用。\n",
67 | ">\n",
68 | "> 这将在同一个块引用中。\n",
69 | ">\n",
70 | ">> 这将是一个嵌套的块引用。"
71 | ]
72 | },
73 | {
74 | "cell_type": "markdown",
75 | "metadata": {},
76 | "source": [
77 | "# **列表***\n",
78 | "\n",
79 | "## **有序列表**\n",
80 | "\n",
81 | "1. First item\n",
82 | "1. Second item\n",
83 | "1. Third item\n",
84 | "1. Fourth item\n",
85 | "\n",
86 | "## **无序列表**\n",
87 | "- First item\n",
88 | "- Second item\n",
89 | "- Third item\n",
90 | "- Fourth item\n",
91 | "\n",
92 | "## **嵌套列表**\n",
93 | "\n",
94 | "1. First item\n",
95 | " - First item\n",
96 | " - Second item\n",
97 | " - Third item\n",
98 | " - Fourth item\n",
99 | "1. Second item\n",
100 | "1. Third item\n",
101 | "1. Fourth item"
102 | ]
103 | },
104 | {
105 | "cell_type": "markdown",
106 | "metadata": {},
107 | "source": [
108 | "# **代码**\n",
109 | "\n",
110 | "`var x = 5;`\n",
111 | "\n",
112 | "To output text try `Console.WriteLine`\n",
113 | "\n",
114 | "```\n",
115 | "{\n",
116 | " \"firstName\": \"Hello\",\n",
117 | " \"lastName\": \"World\",\n",
118 | "}\n",
119 | "```"
120 | ]
121 | },
122 | {
123 | "cell_type": "markdown",
124 | "metadata": {},
125 | "source": [
126 | "# **水平规则**\n",
127 | "\n",
128 | "***\n",
129 | "---\n",
130 | "________________"
131 | ]
132 | },
133 | {
134 | "cell_type": "markdown",
135 | "metadata": {},
136 | "source": [
137 | "# **超链接**\n",
138 | "\n",
139 | "[This Notebook](https://github.com/JakeRadMSFT/csharp-notebooks/blob/main/notebook-getting-started/03-Markdown%20Cells.ipynb)"
140 | ]
141 | },
142 | {
143 | "cell_type": "markdown",
144 | "metadata": {},
145 | "source": [
146 | "# **图片**\n",
147 | "\n",
148 | "Play Button: "
149 | ]
150 | },
151 | {
152 | "cell_type": "markdown",
153 | "metadata": {},
154 | "source": [
155 | "# **表格**\n",
156 | "\n",
157 | "| Column 1 (Aligned Left) | Column 2 (Aligned Center) | Column 3 (Aligned Right) |\n",
158 | "| :--- | :----: | ---: |\n",
159 | "| Row 1 | Value | Value |\n",
160 | "| Row 2 | Value | Value |"
161 | ]
162 | }
163 | ],
164 | "metadata": {
165 | "kernelspec": {
166 | "display_name": ".NET (C#)",
167 | "language": "C#",
168 | "name": ".net-csharp"
169 | },
170 | "language_info": {
171 | "file_extension": ".cs",
172 | "mimetype": "text/x-csharp",
173 | "name": "C#",
174 | "pygments_lexer": "csharp",
175 | "version": "8.0"
176 | }
177 | },
178 | "nbformat": 4,
179 | "nbformat_minor": 4
180 | }
181 |
--------------------------------------------------------------------------------
/csharp-101/06-Numbers and Decimals.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# **小数类型介绍**\n",
8 | "\n",
9 | "观看该模块的教学视频 [C# 101 video](https://www.youtube.com/watch?v=kdKcpF9roeU&list=PLdo4fOcmZ0oVxKLQCHpiUWun7vlJJvUiN&index=7)"
10 | ]
11 | },
12 | {
13 | "cell_type": "markdown",
14 | "metadata": {},
15 | "source": [
16 | "## **Decimal 类型**\n",
17 | "\n",
18 | "`Decimal` 类型类似于 `double`s。 它们没有那么大的范围,但它们确实具有更高的精度。\n",
19 | "\n",
20 | "> 看看十进制类型的范围是多少?"
21 | ]
22 | },
23 | {
24 | "cell_type": "code",
25 | "execution_count": null,
26 | "metadata": {
27 | "dotnet_interactive": {
28 | "language": "csharp"
29 | },
30 | "vscode": {
31 | "languageId": "dotnet-interactive.csharp"
32 | }
33 | },
34 | "outputs": [
35 | {
36 | "name": "stdout",
37 | "output_type": "stream",
38 | "text": [
39 | "The range of the decimal type is -79228162514264337593543950335 to 79228162514264337593543950335\r\n"
40 | ]
41 | }
42 | ],
43 | "source": [
44 | "decimal min = decimal.MinValue;\n",
45 | "decimal max = decimal.MaxValue;\n",
46 | "Console.WriteLine($\"The range of the decimal type is {min} to {max}\");"
47 | ]
48 | },
49 | {
50 | "cell_type": "markdown",
51 | "metadata": {},
52 | "source": [
53 | "> doubles 和 decimals 如何比较精度?"
54 | ]
55 | },
56 | {
57 | "cell_type": "code",
58 | "execution_count": null,
59 | "metadata": {
60 | "dotnet_interactive": {
61 | "language": "csharp"
62 | },
63 | "vscode": {
64 | "languageId": "dotnet-interactive.csharp"
65 | }
66 | },
67 | "outputs": [
68 | {
69 | "name": "stdout",
70 | "output_type": "stream",
71 | "text": [
72 | "0.3333333333333333\r\n",
73 | "0.3333333333333333333333333333\r\n"
74 | ]
75 | }
76 | ],
77 | "source": [
78 | "double a = 1.0;\n",
79 | "double b = 3.0;\n",
80 | "Console.WriteLine(a / b);\n",
81 | "\n",
82 | "decimal c = 1.0M;\n",
83 | "decimal d = 3.0M;\n",
84 | "Console.WriteLine(c / d);"
85 | ]
86 | },
87 | {
88 | "cell_type": "markdown",
89 | "metadata": {},
90 | "source": [
91 | "您可以看到 decimals 的精度高于 double。"
92 | ]
93 | },
94 | {
95 | "cell_type": "markdown",
96 | "metadata": {},
97 | "source": [
98 | "# **Playground:动动手**\n",
99 | "\n",
100 | "Play around with what you've learned! Here's some starting ideas:\n",
101 | "\n",
102 | "> 你能找到半径为 2.5 英寸的圆的面积吗?\n",
103 | ">\n",
104 | "> 当您更改数字类型(例如 int、short 和 decimal)时,答案会是什么样子。\n",
105 | ">\n",
106 | "> 提示:您可以将 `Math.PI` 写为 pi"
107 | ]
108 | },
109 | {
110 | "cell_type": "code",
111 | "execution_count": null,
112 | "metadata": {
113 | "dotnet_interactive": {
114 | "language": "csharp"
115 | },
116 | "vscode": {
117 | "languageId": "dotnet-interactive.csharp"
118 | }
119 | },
120 | "outputs": [
121 | {
122 | "name": "stdout",
123 | "output_type": "stream",
124 | "text": [
125 | "Playground\r\n"
126 | ]
127 | }
128 | ],
129 | "source": [
130 | "Console.WriteLine(\"Playground\");"
131 | ]
132 | },
133 | {
134 | "cell_type": "markdown",
135 | "metadata": {},
136 | "source": [
137 | "# **进阶学习**\n",
138 | "\n",
139 | "There are plenty more resources out there to learn!\n",
140 | "> [⏩ 下一个学习模块 - 分支 (条件语句) ](https://github.com/kinfey/csharp-notebooks/blob/main/csharp-101/07-Branches%20(if).ipynb)\n",
141 | ">\n",
142 | "> [⏪ 上一个学习模块 - 双精度类型介绍 ](https://github.com/kinfey/csharp-notebooks/blob/main/csharp-101/05-Numbers%20and%20Integer%20Precision.ipynb)\n",
143 | ">\n",
144 | "> [观看教学视频](https://www.youtube.com/watch?v=jEE0pWTq54U&list=PLdo4fOcmZ0oVxKLQCHpiUWun7vlJJvUiN&index=5)\n",
145 | ">\n",
146 | "> [文档: C# 整数和浮点数](https://aka.ms/CSharp.Numbers)\n",
147 | ">\n",
148 | "> [从头学起: 什么是 C# ?](https://www.youtube.com/watch?v=BM4CHBmAPh4&list=PLdo4fOcmZ0oVxKLQCHpiUWun7vlJJvUiN&index=1)"
149 | ]
150 | },
151 | {
152 | "cell_type": "markdown",
153 | "metadata": {},
154 | "source": [
155 | "# **其他资源**\n",
156 | "\n",
157 | "你可以从以下链接中获取\n",
158 | "> [其他 101 系列的教学视频](https://aka.ms/Videos.dotNET)\n",
159 | ">\n",
160 | "> [Microsoft Learn](https://aka.ms/Learn.dotNET)\n",
161 | ">\n",
162 | "> [C# 文档](https://aka.ms/Docs.CSharp)"
163 | ]
164 | }
165 | ],
166 | "metadata": {
167 | "kernelspec": {
168 | "display_name": ".NET (C#)",
169 | "language": "C#",
170 | "name": ".net-csharp"
171 | },
172 | "language_info": {
173 | "file_extension": ".cs",
174 | "mimetype": "text/x-csharp",
175 | "name": "C#",
176 | "pygments_lexer": "csharp",
177 | "version": "8.0"
178 | }
179 | },
180 | "nbformat": 4,
181 | "nbformat_minor": 4
182 | }
183 |
--------------------------------------------------------------------------------
/machine-learning/data/titanic-submission.csv:
--------------------------------------------------------------------------------
1 | PassengerId,Survived
2 | 892,0
3 | 893,0
4 | 894,0
5 | 895,0
6 | 896,1
7 | 897,0
8 | 898,1
9 | 899,0
10 | 900,1
11 | 901,0
12 | 902,0
13 | 903,0
14 | 904,1
15 | 905,0
16 | 906,1
17 | 907,1
18 | 908,0
19 | 909,0
20 | 910,1
21 | 911,1
22 | 912,0
23 | 913,1
24 | 914,1
25 | 915,1
26 | 916,1
27 | 917,0
28 | 918,1
29 | 919,0
30 | 920,0
31 | 921,0
32 | 922,0
33 | 923,0
34 | 924,1
35 | 925,1
36 | 926,0
37 | 927,0
38 | 928,0
39 | 929,0
40 | 930,0
41 | 931,0
42 | 932,0
43 | 933,0
44 | 934,0
45 | 935,1
46 | 936,1
47 | 937,0
48 | 938,0
49 | 939,0
50 | 940,1
51 | 941,0
52 | 942,0
53 | 943,0
54 | 944,1
55 | 945,1
56 | 946,0
57 | 947,0
58 | 948,0
59 | 949,0
60 | 950,0
61 | 951,1
62 | 952,0
63 | 953,0
64 | 954,0
65 | 955,1
66 | 956,1
67 | 957,1
68 | 958,0
69 | 959,0
70 | 960,1
71 | 961,1
72 | 962,1
73 | 963,0
74 | 964,0
75 | 965,0
76 | 966,1
77 | 967,1
78 | 968,0
79 | 969,1
80 | 970,0
81 | 971,1
82 | 972,1
83 | 973,1
84 | 974,0
85 | 975,0
86 | 976,0
87 | 977,0
88 | 978,0
89 | 979,1
90 | 980,1
91 | 981,1
92 | 982,1
93 | 983,0
94 | 984,1
95 | 985,0
96 | 986,0
97 | 987,0
98 | 988,1
99 | 989,0
100 | 990,1
101 | 991,0
102 | 992,1
103 | 993,0
104 | 994,0
105 | 995,0
106 | 996,1
107 | 997,0
108 | 998,0
109 | 999,0
110 | 1000,0
111 | 1001,0
112 | 1002,0
113 | 1003,1
114 | 1004,1
115 | 1005,1
116 | 1006,1
117 | 1007,0
118 | 1008,0
119 | 1009,1
120 | 1010,1
121 | 1011,1
122 | 1012,1
123 | 1013,0
124 | 1014,1
125 | 1015,0
126 | 1016,0
127 | 1017,1
128 | 1018,0
129 | 1019,1
130 | 1020,0
131 | 1021,0
132 | 1022,0
133 | 1023,0
134 | 1024,0
135 | 1025,0
136 | 1026,0
137 | 1027,0
138 | 1028,0
139 | 1029,0
140 | 1030,0
141 | 1031,0
142 | 1032,0
143 | 1033,1
144 | 1034,0
145 | 1035,0
146 | 1036,1
147 | 1037,0
148 | 1038,1
149 | 1039,0
150 | 1040,0
151 | 1041,1
152 | 1042,1
153 | 1043,0
154 | 1044,0
155 | 1045,1
156 | 1046,0
157 | 1047,0
158 | 1048,1
159 | 1049,0
160 | 1050,0
161 | 1051,1
162 | 1052,1
163 | 1053,1
164 | 1054,1
165 | 1055,0
166 | 1056,0
167 | 1057,1
168 | 1058,1
169 | 1059,0
170 | 1060,1
171 | 1061,1
172 | 1062,0
173 | 1063,0
174 | 1064,0
175 | 1065,0
176 | 1066,0
177 | 1067,1
178 | 1068,1
179 | 1069,0
180 | 1070,1
181 | 1071,1
182 | 1072,0
183 | 1073,0
184 | 1074,1
185 | 1075,0
186 | 1076,1
187 | 1077,0
188 | 1078,1
189 | 1079,0
190 | 1080,0
191 | 1081,0
192 | 1082,0
193 | 1083,0
194 | 1084,1
195 | 1085,0
196 | 1086,1
197 | 1087,0
198 | 1088,1
199 | 1089,1
200 | 1090,0
201 | 1091,0
202 | 1092,1
203 | 1093,1
204 | 1094,0
205 | 1095,1
206 | 1096,0
207 | 1097,0
208 | 1098,1
209 | 1099,0
210 | 1100,1
211 | 1101,0
212 | 1102,0
213 | 1103,0
214 | 1104,0
215 | 1105,1
216 | 1106,0
217 | 1107,0
218 | 1108,1
219 | 1109,0
220 | 1110,1
221 | 1111,0
222 | 1112,1
223 | 1113,0
224 | 1114,1
225 | 1115,0
226 | 1116,1
227 | 1117,1
228 | 1118,0
229 | 1119,1
230 | 1120,0
231 | 1121,0
232 | 1122,0
233 | 1123,1
234 | 1124,0
235 | 1125,0
236 | 1126,0
237 | 1127,0
238 | 1128,0
239 | 1129,0
240 | 1130,1
241 | 1131,1
242 | 1132,1
243 | 1133,1
244 | 1134,0
245 | 1135,0
246 | 1136,1
247 | 1137,0
248 | 1138,1
249 | 1139,0
250 | 1140,1
251 | 1141,1
252 | 1142,1
253 | 1143,0
254 | 1144,0
255 | 1145,0
256 | 1146,0
257 | 1147,0
258 | 1148,0
259 | 1149,0
260 | 1150,1
261 | 1151,0
262 | 1152,0
263 | 1153,0
264 | 1154,1
265 | 1155,1
266 | 1156,0
267 | 1157,0
268 | 1158,0
269 | 1159,0
270 | 1160,1
271 | 1161,0
272 | 1162,0
273 | 1163,0
274 | 1164,1
275 | 1165,1
276 | 1166,0
277 | 1167,1
278 | 1168,0
279 | 1169,0
280 | 1170,0
281 | 1171,0
282 | 1172,0
283 | 1173,1
284 | 1174,1
285 | 1175,1
286 | 1176,1
287 | 1177,0
288 | 1178,0
289 | 1179,0
290 | 1180,0
291 | 1181,0
292 | 1182,1
293 | 1183,1
294 | 1184,0
295 | 1185,0
296 | 1186,0
297 | 1187,0
298 | 1188,1
299 | 1189,0
300 | 1190,0
301 | 1191,0
302 | 1192,0
303 | 1193,0
304 | 1194,0
305 | 1195,0
306 | 1196,1
307 | 1197,1
308 | 1198,1
309 | 1199,1
310 | 1200,0
311 | 1201,0
312 | 1202,0
313 | 1203,0
314 | 1204,0
315 | 1205,1
316 | 1206,1
317 | 1207,1
318 | 1208,0
319 | 1209,0
320 | 1210,0
321 | 1211,0
322 | 1212,0
323 | 1213,0
324 | 1214,0
325 | 1215,0
326 | 1216,1
327 | 1217,0
328 | 1218,1
329 | 1219,0
330 | 1220,0
331 | 1221,0
332 | 1222,1
333 | 1223,0
334 | 1224,0
335 | 1225,1
336 | 1226,0
337 | 1227,0
338 | 1228,0
339 | 1229,0
340 | 1230,0
341 | 1231,1
342 | 1232,0
343 | 1233,0
344 | 1234,0
345 | 1235,1
346 | 1236,1
347 | 1237,1
348 | 1238,0
349 | 1239,0
350 | 1240,0
351 | 1241,1
352 | 1242,1
353 | 1243,0
354 | 1244,0
355 | 1245,0
356 | 1246,1
357 | 1247,0
358 | 1248,1
359 | 1249,0
360 | 1250,0
361 | 1251,1
362 | 1252,0
363 | 1253,1
364 | 1254,1
365 | 1255,0
366 | 1256,1
367 | 1257,0
368 | 1258,0
369 | 1259,0
370 | 1260,1
371 | 1261,0
372 | 1262,0
373 | 1263,1
374 | 1264,0
375 | 1265,0
376 | 1266,1
377 | 1267,1
378 | 1268,0
379 | 1269,0
380 | 1270,0
381 | 1271,1
382 | 1272,0
383 | 1273,0
384 | 1274,1
385 | 1275,1
386 | 1276,0
387 | 1277,1
388 | 1278,0
389 | 1279,0
390 | 1280,0
391 | 1281,0
392 | 1282,0
393 | 1283,1
394 | 1284,1
395 | 1285,0
396 | 1286,0
397 | 1287,1
398 | 1288,0
399 | 1289,1
400 | 1290,0
401 | 1291,0
402 | 1292,1
403 | 1293,0
404 | 1294,1
405 | 1295,0
406 | 1296,0
407 | 1297,0
408 | 1298,0
409 | 1299,0
410 | 1300,1
411 | 1301,0
412 | 1302,1
413 | 1303,1
414 | 1304,0
415 | 1305,0
416 | 1306,1
417 | 1307,0
418 | 1308,0
419 | 1309,1
420 |
--------------------------------------------------------------------------------
/csharp-101/03-Searching Strings.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# **查找字符串**\n",
8 | "\n",
9 | "观看该模块的教学视频 [C# 101 video](https://www.youtube.com/watch?v=JL30gSE3WaQ&list=PLdo4fOcmZ0oVxKLQCHpiUWun7vlJJvUiN&index=4)"
10 | ]
11 | },
12 | {
13 | "cell_type": "markdown",
14 | "metadata": {},
15 | "source": [
16 | "## **包含**\n",
17 | "\n",
18 | "您的字符串中是否包含另一个字符串? 您可以使用 `Contains` 来找出答案!\n",
19 | "`Contains` 方法返回一个 *boolean*。 这是一种由关键字 `bool` 表示的类型,它可以包含两个值:`true` 或 `false`。 在这种情况下,当找到寻找的字符串时,该方法返回“true”,如果没有找到,则返回“false”。\n",
20 | "> 运行以下代码。\n",
21 | ">\n",
22 | "> 有什么会或不会被包含?\n",
23 | ">\n",
24 | "> 有没有特别的情况?\n",
25 | ">\n",
26 | "> 你能存储 `Contains` 方法的返回值吗> 记住结果的类型是 `bool`。"
27 | ]
28 | },
29 | {
30 | "cell_type": "code",
31 | "execution_count": null,
32 | "metadata": {
33 | "dotnet_interactive": {
34 | "language": "csharp"
35 | },
36 | "vscode": {
37 | "languageId": "dotnet-interactive.csharp"
38 | }
39 | },
40 | "outputs": [
41 | {
42 | "name": "stdout",
43 | "output_type": "stream",
44 | "text": [
45 | "True\r\n",
46 | "False\r\n"
47 | ]
48 | }
49 | ],
50 | "source": [
51 | "string songLyrics = \"You say goodbye, and I say hello\";\n",
52 | "Console.WriteLine(songLyrics.Contains(\"goodbye\"));\n",
53 | "Console.WriteLine(songLyrics.Contains(\"greetings\"));"
54 | ]
55 | },
56 | {
57 | "cell_type": "markdown",
58 | "metadata": {},
59 | "source": [
60 | "## **开头与结尾的检查**\n",
61 | "\n",
62 | "`StartsWith` 和 `EndsWith` 是类似于 `Contains` 的方法,但更具体。 它们会告诉您字符串是否以您正在检查的字符串开头或结尾。 它与 `Contains` 具有相同的结构,即:`bigstring.StartsWith(substring)`\n",
63 | "> 在下面的代码中,尝试搜索该行以查看它是以“you”还是“I”开头的。\n",
64 | "> 接下来看看代码是以“hello”还是“goodbye”结尾的。"
65 | ]
66 | },
67 | {
68 | "cell_type": "code",
69 | "execution_count": null,
70 | "metadata": {
71 | "dotnet_interactive": {
72 | "language": "csharp"
73 | },
74 | "vscode": {
75 | "languageId": "dotnet-interactive.csharp"
76 | }
77 | },
78 | "outputs": [],
79 | "source": [
80 | "string songLyrics = \"You say goodbye, and I say hello\";"
81 | ]
82 | },
83 | {
84 | "cell_type": "markdown",
85 | "metadata": {},
86 | "source": [
87 | "# **Playground:动动手**\n",
88 | "\n",
89 | "练习一下:\n",
90 | "> 有哪些行包含了\"hello\"?\n",
91 | "> 哪些行以“你”开头?\n",
92 | "> 哪些行以“否”结尾?\n",
93 | "> 回想上一个模块。 你能把一些行全大写,一些行全小写吗?\n",
94 | "> 如果你改变大小写,这对“Contains”有什么影响?"
95 | ]
96 | },
97 | {
98 | "cell_type": "code",
99 | "execution_count": null,
100 | "metadata": {
101 | "dotnet_interactive": {
102 | "language": "csharp"
103 | },
104 | "vscode": {
105 | "languageId": "dotnet-interactive.csharp"
106 | }
107 | },
108 | "outputs": [
109 | {
110 | "name": "stdout",
111 | "output_type": "stream",
112 | "text": [
113 | "Playground\r\n"
114 | ]
115 | }
116 | ],
117 | "source": [
118 | "Console.WriteLine(\"Playground\");\n",
119 | "String line1 = \"You say yes, I say no\";\n",
120 | "String line2 = \"You say stop and I say go, go, go\";\n",
121 | "String line3 = \"Oh, no\";\n",
122 | "String line4 = \"You say goodbye and I say hello\";\n",
123 | "String line5 = \"Hello, hello\";\n",
124 | "String line6 = \"I don't know why you say goodbye, I say hello\";"
125 | ]
126 | },
127 | {
128 | "cell_type": "markdown",
129 | "metadata": {},
130 | "source": [
131 | "# **进阶学习**\n",
132 | "\n",
133 | "有非常多的资源给大家学习,不要错过!\n",
134 | "> [⏩ 下一个学习模块 - 整形介绍](https://github.com/kinfey/csharp-notebooks/blob/main/csharp-101/04-Numbers%20and%20Integer%20Math.ipynb)\n",
135 | ">\n",
136 | "> [⏪ 上一个学习模块 - 字符串基础](https://github.com/kinfey/csharp-notebooks/blob/main/csharp-101/02-The%20Basics%20of%20Strings.ipynb)\n",
137 | ">\n",
138 | "> [观看教学视频](https://www.youtube.com/watch?v=JL30gSE3WaQ&list=PLdo4fOcmZ0oVxKLQCHpiUWun7vlJJvUiN&index=4)\n",
139 | ">\n",
140 | "> [文档: C# 介绍](https://docs.microsoft.com/dotnet/csharp/tour-of-csharp/tutorials/hello-world?WT.mc_id=csharpnotebook-35129-website)\n",
141 | ">\n",
142 | "> [从头学起: 什么是 C# ?](https://www.youtube.com/watch?v=BM4CHBmAPh4&list=PLdo4fOcmZ0oVxKLQCHpiUWun7vlJJvUiN&index=1)"
143 | ]
144 | },
145 | {
146 | "cell_type": "markdown",
147 | "metadata": {},
148 | "source": [
149 | "# **其他资源**\n",
150 | "\n",
151 | "你可以从以下链接中获取\n",
152 | "> [其他 101 系列的教学视频](https://aka.ms/Videos.dotNET)\n",
153 | ">\n",
154 | "> [Microsoft Learn](https://aka.ms/Learn.dotNET)\n",
155 | ">\n",
156 | "> [C# 文档](https://aka.ms/Docs.CSharp)"
157 | ]
158 | }
159 | ],
160 | "metadata": {
161 | "kernelspec": {
162 | "display_name": ".NET (C#)",
163 | "language": "C#",
164 | "name": ".net-csharp"
165 | },
166 | "language_info": {
167 | "file_extension": ".cs",
168 | "mimetype": "text/x-csharp",
169 | "name": "C#",
170 | "pygments_lexer": "csharp",
171 | "version": "8.0"
172 | }
173 | },
174 | "nbformat": 4,
175 | "nbformat_minor": 4
176 | }
177 |
--------------------------------------------------------------------------------
/notebook-getting-started/02-Code Cells.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# **Code Cells 介绍**\n",
8 | " \n",
9 | "这个 notebok 主要涵盖利用 Code Cells 更新输出、引用 NuGet 等场景\n",
10 | "\n",
11 | "要学习 C# 请访问我们的 C# 101 教程 - [第一个学习模块 - Hello World](https://ntbk.io/csharp101-notebook01)!"
12 | ]
13 | },
14 | {
15 | "cell_type": "markdown",
16 | "metadata": {},
17 | "source": [
18 | "### **引用 NuGets** "
19 | ]
20 | },
21 | {
22 | "cell_type": "code",
23 | "execution_count": 1,
24 | "metadata": {
25 | "dotnet_interactive": {
26 | "language": "csharp"
27 | },
28 | "vscode": {
29 | "languageId": "dotnet-interactive.csharp"
30 | }
31 | },
32 | "outputs": [
33 | {
34 | "data": {
35 | "text/html": [
36 | ""
37 | ]
38 | },
39 | "execution_count": 1,
40 | "metadata": {},
41 | "output_type": "execute_result"
42 | }
43 | ],
44 | "source": [
45 | "#r \"nuget:System.Text.Json\""
46 | ]
47 | },
48 | {
49 | "cell_type": "markdown",
50 | "metadata": {},
51 | "source": [
52 | "学习更多内容 - [Nuget 概述](https://github.com/dotnet/interactive/blob/main/docs/nuget-overview.md)"
53 | ]
54 | },
55 | {
56 | "cell_type": "markdown",
57 | "metadata": {},
58 | "source": [
59 | "## **引用 Assemblies**"
60 | ]
61 | },
62 | {
63 | "cell_type": "code",
64 | "execution_count": 1,
65 | "metadata": {
66 | "dotnet_interactive": {
67 | "language": "csharp"
68 | },
69 | "vscode": {
70 | "languageId": "dotnet-interactive.csharp"
71 | }
72 | },
73 | "outputs": [],
74 | "source": [
75 | "#r \"\""
76 | ]
77 | },
78 | {
79 | "cell_type": "markdown",
80 | "metadata": {},
81 | "source": [
82 | "## **显示和更新值**"
83 | ]
84 | },
85 | {
86 | "cell_type": "markdown",
87 | "metadata": {},
88 | "source": [
89 | "通过 Code Cells 显示值有几种方法\n",
90 | "\n",
91 | "### **Console.WriteLine**\n",
92 | "\n",
93 | "您可以像使用控制台应用程序一样使用 Console.WriteLine,并且显示输出结果。"
94 | ]
95 | },
96 | {
97 | "cell_type": "code",
98 | "execution_count": null,
99 | "metadata": {
100 | "dotnet_interactive": {
101 | "language": "csharp"
102 | },
103 | "vscode": {
104 | "languageId": "dotnet-interactive.csharp"
105 | }
106 | },
107 | "outputs": [
108 | {
109 | "name": "stdout",
110 | "output_type": "stream",
111 | "text": [
112 | "Hello Console.WriteLine\n"
113 | ]
114 | }
115 | ],
116 | "source": [
117 | "Console.WriteLine(\"Hello Console.WriteLine\");"
118 | ]
119 | },
120 | {
121 | "cell_type": "markdown",
122 | "metadata": {},
123 | "source": [
124 | "### **把值放在 Code Cell 的最后一行**\n",
125 | "如果 Code Cell 的最后一行是变量、对象或文字,那么它的值将被显示。"
126 | ]
127 | },
128 | {
129 | "cell_type": "code",
130 | "execution_count": 1,
131 | "metadata": {
132 | "dotnet_interactive": {
133 | "language": "csharp"
134 | },
135 | "vscode": {
136 | "languageId": "dotnet-interactive.csharp"
137 | }
138 | },
139 | "outputs": [
140 | {
141 | "data": {
142 | "text/plain": [
143 | "This will work!"
144 | ]
145 | },
146 | "execution_count": 1,
147 | "metadata": {},
148 | "output_type": "execute_result"
149 | }
150 | ],
151 | "source": [
152 | "\"This will work!\""
153 | ]
154 | },
155 | {
156 | "cell_type": "code",
157 | "execution_count": 1,
158 | "metadata": {
159 | "dotnet_interactive": {
160 | "language": "csharp"
161 | },
162 | "vscode": {
163 | "languageId": "dotnet-interactive.csharp"
164 | }
165 | },
166 | "outputs": [
167 | {
168 | "data": {
169 | "text/plain": [
170 | "This will work too"
171 | ]
172 | },
173 | "execution_count": 1,
174 | "metadata": {},
175 | "output_type": "execute_result"
176 | }
177 | ],
178 | "source": [
179 | "var x = \"This will work too\";\n",
180 | "x"
181 | ]
182 | },
183 | {
184 | "cell_type": "markdown",
185 | "metadata": {},
186 | "source": [
187 | "### **内置显示功能**\n",
188 | "使用内置的显示功能是另一种选择,它允许您更新显示的值。 这是在长时间运行的任务期间显示和更新信息的最好方法。"
189 | ]
190 | },
191 | {
192 | "cell_type": "code",
193 | "execution_count": 1,
194 | "metadata": {
195 | "dotnet_interactive": {
196 | "language": "csharp"
197 | },
198 | "vscode": {
199 | "languageId": "dotnet-interactive.csharp"
200 | }
201 | },
202 | "outputs": [
203 | {
204 | "data": {
205 | "text/html": [
206 | "10
"
207 | ]
208 | },
209 | "execution_count": 1,
210 | "metadata": {},
211 | "output_type": "execute_result"
212 | }
213 | ],
214 | "source": [
215 | "var displayedValue = 0.Display();\n",
216 | "\n",
217 | "for (int x = 0; x<=10; x++)\n",
218 | "{\n",
219 | "\tawait Task.Delay(1000);\n",
220 | "\tdisplayedValue.Update(x);\n",
221 | "}"
222 | ]
223 | }
224 | ],
225 | "metadata": {
226 | "kernelspec": {
227 | "display_name": ".NET (C#)",
228 | "language": "C#",
229 | "name": ".net-csharp"
230 | },
231 | "language_info": {
232 | "file_extension": ".cs",
233 | "mimetype": "text/x-csharp",
234 | "name": "C#",
235 | "pygments_lexer": "csharp",
236 | "version": "8.0"
237 | }
238 | },
239 | "nbformat": 4,
240 | "nbformat_minor": 4
241 | }
242 |
--------------------------------------------------------------------------------
/csharp-101/12-Lists of Other Types.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# **其他类型列表**\n",
8 | "\n",
9 | "观看该模块的教学视频 [C# 101 video](https://www.youtube.com/watch?v=oIQdb93xewE&list=PLdo4fOcmZ0oVxKLQCHpiUWun7vlJJvUiN&index=14) \n",
10 | "\n",
11 | "你一直在练习字符串列表,但你可以列出任何东西! 这是一个数字示例。\n",
12 | "\n",
13 | "## **斐波那契数列**\n",
14 | "\n",
15 | "斐波那契是一个很酷的数列。 它将最后两个数字相加得到下一个数字。 你从 1 和 1 开始\n",
16 | "1 + 1 = 2 (1, 1, 2)\n",
17 | "1 + 2 = 3 (1, 1, 2, 3)\n",
18 | "2 + 3 = 5 (1, 1, 2, 3, 5)\n",
19 | "3 + 5 = 8 (1, 1, 2, 3, 5, 8)\n",
20 | "等等。 自然界中有很多东西都遵循这个数字序列,如果你想查找的话,还有很多很酷的东西!\n",
21 | "\n",
22 | "> 从基数开始:这是一个只有 1、1 的列表。 运行它,看看会发生什么。"
23 | ]
24 | },
25 | {
26 | "cell_type": "code",
27 | "execution_count": null,
28 | "metadata": {
29 | "dotnet_interactive": {
30 | "language": "csharp"
31 | },
32 | "vscode": {
33 | "languageId": "dotnet-interactive.csharp"
34 | }
35 | },
36 | "outputs": [
37 | {
38 | "name": "stdout",
39 | "output_type": "stream",
40 | "text": [
41 | "1\r\n",
42 | "1\r\n"
43 | ]
44 | }
45 | ],
46 | "source": [
47 | "var fibonacciNumbers = new List {1, 1};\n",
48 | "\n",
49 | "foreach (var item in fibonacciNumbers)\n",
50 | " Console.WriteLine(item);"
51 | ]
52 | },
53 | {
54 | "cell_type": "markdown",
55 | "metadata": {},
56 | "source": [
57 | "现在,您不希望只有 1,1! 你想要更多的序列。 在此代码中,您使用列表的最后两个数字,将它们加在一起形成下一个数字,然后将其添加到列表中。\n",
58 | "\n",
59 | "> 运行代码进行尝试。"
60 | ]
61 | },
62 | {
63 | "cell_type": "code",
64 | "execution_count": null,
65 | "metadata": {
66 | "dotnet_interactive": {
67 | "language": "csharp"
68 | },
69 | "vscode": {
70 | "languageId": "dotnet-interactive.csharp"
71 | }
72 | },
73 | "outputs": [
74 | {
75 | "name": "stdout",
76 | "output_type": "stream",
77 | "text": [
78 | "1\r\n",
79 | "1\r\n",
80 | "2\r\n"
81 | ]
82 | }
83 | ],
84 | "source": [
85 | "var fibonacciNumbers = new List {1, 1}; // Starting the list off with the basics\n",
86 | "\n",
87 | "var previous = fibonacciNumbers[fibonacciNumbers.Count - 1]; // Take the last number in the list\n",
88 | "var previous2 = fibonacciNumbers[fibonacciNumbers.Count - 2]; // Take the second to last number in the list\n",
89 | "\n",
90 | "fibonacciNumbers.Add(previous + previous2); // Add the previous numbers together, and attach the sum to the end of the list\n",
91 | "\n",
92 | "foreach (var item in fibonacciNumbers) // Print out the list\n",
93 | " Console.WriteLine(item);"
94 | ]
95 | },
96 | {
97 | "cell_type": "markdown",
98 | "metadata": {},
99 | "source": [
100 | "## **Count -1**\n",
101 | "\n",
102 | "为什么需要执行 `fibonacciNumbers.Count -1` 来获取列表的最后一个数字? 好吧,`Count` 告诉你列表中有多少项目。 但是,项目的索引从零开始。 因此,如果您的列表中只有一个项目,则计数将为 1,但该项目的索引将为 0。最后一项的索引和计数始终为一个。"
103 | ]
104 | },
105 | {
106 | "cell_type": "markdown",
107 | "metadata": {},
108 | "source": [
109 | "# **挑战一下:求斐波那契数列的第 20 个数字**\n",
110 | "\n",
111 | "我们已经为您提供了处理斐波那契的代码库。 你能列出前 20 个斐波那契数列吗?\n",
112 | "\n",
113 | "> 制作并打印包含前 20 个斐波那契数字的列表。"
114 | ]
115 | },
116 | {
117 | "cell_type": "code",
118 | "execution_count": null,
119 | "metadata": {
120 | "dotnet_interactive": {
121 | "language": "csharp"
122 | },
123 | "vscode": {
124 | "languageId": "dotnet-interactive.csharp"
125 | }
126 | },
127 | "outputs": [
128 | {
129 | "name": "stdout",
130 | "output_type": "stream",
131 | "text": [
132 | "Challenge\r\n"
133 | ]
134 | }
135 | ],
136 | "source": [
137 | "Console.WriteLine(\"Challenge\");"
138 | ]
139 | },
140 | {
141 | "cell_type": "markdown",
142 | "metadata": {},
143 | "source": [
144 | "## **技巧和窍门**\n",
145 | "\n",
146 | "- 最终数字应为 6765。\n",
147 | "- 你能做一个“for”循环吗? 一个“foreach”循环? 一个`while`循环? 您更喜欢哪种循环,哪种更有用?\n",
148 | "- 你接近了,但是一个数字吗? 这是一个非常普遍的问题! 请记住,`>` 和 `>=` 是相似的,但它们最终是相互分离的。 试着测试一下\n",
149 | "- 请记住,您已经从列表中的两个项目开始。\n",
150 | "- 遇到问题? 观看此学习模块 [C# 101 视频](https://www.youtube.com/watch?v=oIQdb93xewE&list=PLdo4fOcmZ0oVxKLQCHpiUWun7vlJJvUiN&index=14)。 一旦你有了一个想法,试着暂停一下,然后先尝试运行一下,再继续看其他的。"
151 | ]
152 | },
153 | {
154 | "cell_type": "markdown",
155 | "metadata": {},
156 | "source": [
157 | "# **进阶学习**\n",
158 | "\n",
159 | "\n",
160 | "> [⏩ 下一个学习模块 - 对象和类 ](https://github.com/kinfey/csharp-notebooks/blob/main/csharp-101/13-Objects%20and%20Classes.ipynb)\n",
161 | ">\n",
162 | "> [⏪ 上一个学习模块 - 搜索、排序和索引列表](https://github.com/kinfey/csharp-notebooks/blob/main/csharp-101/11-%20Search%2C%20Sort%2C%20and%20Index%20Lists.ipynb)\n",
163 | ">\n",
164 | "> [观看教学视频](https://www.youtube.com/watch?v=oIQdb93xewE&list=PLdo4fOcmZ0oVxKLQCHpiUWun7vlJJvUiN&index=14)\n",
165 | ">\n",
166 | "> [文档: 数组、列表和集合](https://aka.ms/CSharp.List)\n",
167 | ">\n",
168 | "> [从头学起: 什么是 C# ?](https://www.youtube.com/watch?v=BM4CHBmAPh4&list=PLdo4fOcmZ0oVxKLQCHpiUWun7vlJJvUiN&index=1)"
169 | ]
170 | },
171 | {
172 | "cell_type": "markdown",
173 | "metadata": {},
174 | "source": [
175 | "# **其他资源**\n",
176 | "\n",
177 | "你可以从以下链接中获取\n",
178 | "> [其他 101 系列的教学视频](https://aka.ms/Videos.dotNET)\n",
179 | ">\n",
180 | "> [Microsoft Learn](https://aka.ms/Learn.dotNET)\n",
181 | ">\n",
182 | "> [C# 文档](https://aka.ms/Docs.CSharp)"
183 | ]
184 | }
185 | ],
186 | "metadata": {
187 | "kernelspec": {
188 | "display_name": ".NET (C#)",
189 | "language": "C#",
190 | "name": ".net-csharp"
191 | },
192 | "language_info": {
193 | "file_extension": ".cs",
194 | "mimetype": "text/x-csharp",
195 | "name": "C#",
196 | "pygments_lexer": "csharp",
197 | "version": "8.0"
198 | }
199 | },
200 | "nbformat": 4,
201 | "nbformat_minor": 4
202 | }
203 |
--------------------------------------------------------------------------------
/csharp-101/11- Search, Sort, and Index Lists.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# **搜索、排序和索引列表**\n",
8 | "\n",
9 | "观看该模块的教学视频 [C# 101 video](https://www.youtube.com/watch?v=NJ5ghiutzfY&list=PLdo4fOcmZ0oVxKLQCHpiUWun7vlJJvUiN&index=13) "
10 | ]
11 | },
12 | {
13 | "cell_type": "markdown",
14 | "metadata": {},
15 | "source": [
16 | "## **搜索**\n",
17 | "\n",
18 | "在上一个笔记本中,您学习了如何查找存储在特定索引处的项目。 现在,给定一个项目,找出它的索引。\n",
19 | "\n",
20 | "> 运行代码\n",
21 | ">\n",
22 | "> 索菲亚的索引是多少?\n",
23 | ">\n",
24 | "> “斯科特”的索引是什麼?"
25 | ]
26 | },
27 | {
28 | "cell_type": "code",
29 | "execution_count": null,
30 | "metadata": {
31 | "dotnet_interactive": {
32 | "language": "csharp"
33 | },
34 | "vscode": {
35 | "languageId": "dotnet-interactive.csharp"
36 | }
37 | },
38 | "outputs": [
39 | {
40 | "name": "stdout",
41 | "output_type": "stream",
42 | "text": [
43 | "Found Ana at 1\r\n"
44 | ]
45 | }
46 | ],
47 | "source": [
48 | "using System;\n",
49 | "using System.Collections.Generic;\n",
50 | "var names = new List { \"Sophia\", \"Ana\", \"Jayme\", \"Bill\" };\n",
51 | "string name = \"Ana\";\n",
52 | "var index = names.IndexOf(name);\n",
53 | "Console.WriteLine($\"Found {name} at {index}\");"
54 | ]
55 | },
56 | {
57 | "cell_type": "markdown",
58 | "metadata": {},
59 | "source": [
60 | "## **返回 -1 是什么意思**\n",
61 | "\n",
62 | "如果 `IndexOf()` 返回 -1,则意味着它无法在列表中找到该项目。 事实上,你可以做一些 if 语句来解决找不到项目的问题:\n",
63 | "\n",
64 | "> 运行代码。\n",
65 | ">\n",
66 | "> 尝试几个不同的名称。"
67 | ]
68 | },
69 | {
70 | "cell_type": "code",
71 | "execution_count": null,
72 | "metadata": {
73 | "dotnet_interactive": {
74 | "language": "csharp"
75 | },
76 | "vscode": {
77 | "languageId": "dotnet-interactive.csharp"
78 | }
79 | },
80 | "outputs": [
81 | {
82 | "name": "stdout",
83 | "output_type": "stream",
84 | "text": [
85 | "Scott not found\r\n"
86 | ]
87 | }
88 | ],
89 | "source": [
90 | "var names = new List { \"Sophia\", \"Ana\", \"Jayme\", \"Bill\" };\n",
91 | "string name = \"Scott\";\n",
92 | "var index = names.IndexOf(name);\n",
93 | "if(index == -1){\n",
94 | " Console.WriteLine($\"{name} not found\");\n",
95 | "} else {\n",
96 | " Console.WriteLine($\"Found {names[index]} at {index}\");\n",
97 | "}"
98 | ]
99 | },
100 | {
101 | "cell_type": "markdown",
102 | "metadata": {},
103 | "source": [
104 | "## **排序**\n",
105 | "\n",
106 | "到目前为止,您只是按随机顺序输入名称。 但有时对列表进行排序会很好。 `Sort()` 获取一个列表并对其进行组织。 它查看变量类型并以它所能看到的最合理的方式组织 - 如果是字符串,它会按字母顺序排序,如果是数字,它会从最小到最大组织。\n",
107 | "\n",
108 | "注意你不需要写`sortedList = names.Sort()`,你只需要写`names.Sort()`。 `Sort()` 更改列表本身,您不必将操作保存到新对象。\n",
109 | "\n",
110 | "> 运行代码!\n",
111 | ">\n",
112 | "> 随意添加任何其他名称以查看它们是否被排序。"
113 | ]
114 | },
115 | {
116 | "cell_type": "code",
117 | "execution_count": null,
118 | "metadata": {
119 | "dotnet_interactive": {
120 | "language": "csharp"
121 | },
122 | "vscode": {
123 | "languageId": "dotnet-interactive.csharp"
124 | }
125 | },
126 | "outputs": [
127 | {
128 | "name": "stdout",
129 | "output_type": "stream",
130 | "text": [
131 | "Pre Sorting:\r\n",
132 | "Sophia\r\n",
133 | "Ana\r\n",
134 | "Jayme\r\n",
135 | "Bill\r\n",
136 | "\r\n",
137 | "Post Sorting:\r\n",
138 | "Ana\r\n",
139 | "Bill\r\n",
140 | "Jayme\r\n",
141 | "Sophia\r\n"
142 | ]
143 | }
144 | ],
145 | "source": [
146 | "var names = new List { \"Sophia\", \"Ana\", \"Jayme\", \"Bill\" };\n",
147 | "Console.WriteLine(\"Pre Sorting:\");\n",
148 | "foreach(var name in names )\n",
149 | "{\n",
150 | " Console.WriteLine(name);\n",
151 | "}\n",
152 | "\n",
153 | "names.Sort();\n",
154 | "\n",
155 | "Console.WriteLine();\n",
156 | "Console.WriteLine(\"Post Sorting:\");\n",
157 | "foreach(var name in names )\n",
158 | "{\n",
159 | " Console.WriteLine(name);\n",
160 | "}"
161 | ]
162 | },
163 | {
164 | "cell_type": "markdown",
165 | "metadata": {},
166 | "source": [
167 | "# **Playground:动动手**\n",
168 | "\n",
169 | "> 列出杂货清单,然后分类! “胡萝卜”的索引是多少?\n",
170 | ">\n",
171 | "> 尝试制作一个数字列表! 它们是否按照您期望的方式排序?\n",
172 | ">\n",
173 | "> 打印出您制作的列表。"
174 | ]
175 | },
176 | {
177 | "cell_type": "code",
178 | "execution_count": null,
179 | "metadata": {
180 | "dotnet_interactive": {
181 | "language": "csharp"
182 | },
183 | "vscode": {
184 | "languageId": "dotnet-interactive.csharp"
185 | }
186 | },
187 | "outputs": [
188 | {
189 | "name": "stdout",
190 | "output_type": "stream",
191 | "text": [
192 | "Playground\r\n"
193 | ]
194 | }
195 | ],
196 | "source": [
197 | "Console.WriteLine(\"Playground\");"
198 | ]
199 | },
200 | {
201 | "cell_type": "markdown",
202 | "metadata": {},
203 | "source": [
204 | "# **进阶学习**\n",
205 | "\n",
206 | "\n",
207 | "> [⏩ 下一个学习模块 - 其他类型列表](https://github.com/kinfey/csharp-notebooks/blob/main/csharp-101/12-Lists%20of%20Other%20Types.ipynb)\n",
208 | ">\n",
209 | "> [⏪ 上一个学习模块 - 数组、列表和集合](https://github.com/kinfey/csharp-notebooks/blob/main/csharp-101/10-Arrays%2C%20Lists%2C%20and%20Collections.ipynb)\n",
210 | ">\n",
211 | "> [观看教学视频](https://www.youtube.com/watch?v=NJ5ghiutzfY&list=PLdo4fOcmZ0oVxKLQCHpiUWun7vlJJvUiN&index=13)\n",
212 | ">\n",
213 | "> [文档: 数组、列表和集合](https://aka.ms/CSharp.List)\n",
214 | ">\n",
215 | "> [从头学起: 什么是 C# ?](https://www.youtube.com/watch?v=BM4CHBmAPh4&list=PLdo4fOcmZ0oVxKLQCHpiUWun7vlJJvUiN&index=1)"
216 | ]
217 | },
218 | {
219 | "cell_type": "markdown",
220 | "metadata": {},
221 | "source": [
222 | "# **其他资源**\n",
223 | "\n",
224 | "你可以从以下链接中获取\n",
225 | "> [其他 101 系列的教学视频](https://aka.ms/Videos.dotNET)\n",
226 | ">\n",
227 | "> [Microsoft Learn](https://aka.ms/Learn.dotNET)\n",
228 | ">\n",
229 | "> [C# 文档](https://aka.ms/Docs.CSharp)"
230 | ]
231 | }
232 | ],
233 | "metadata": {
234 | "kernelspec": {
235 | "display_name": ".NET (C#)",
236 | "language": "C#",
237 | "name": ".net-csharp"
238 | },
239 | "language_info": {
240 | "file_extension": ".cs",
241 | "mimetype": "text/x-csharp",
242 | "name": "C#",
243 | "pygments_lexer": "csharp",
244 | "version": "8.0"
245 | }
246 | },
247 | "nbformat": 4,
248 | "nbformat_minor": 4
249 | }
250 |
--------------------------------------------------------------------------------
/csharp-101/01-Hello World.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# **Hello World ,你的第一个 C# 程序**\n",
8 | "\n",
9 | "观看该模块的教学视频 [C# 101 video](https://www.youtube.com/watch?v=KT2VR7m19So&list=PLdo4fOcmZ0oVxKLQCHpiUWun7vlJJvUiN&index=2) \n",
10 | "\n",
11 | "## **通过 Notebooks 将会学习到什么?**\n",
12 | "\n",
13 | "这些 Notebooks 可以帮助你学习到 C# 编程的技巧,具体要求\n",
14 | "\n",
15 | "- 独立运行完成这些 Notebooks。\n",
16 | "- 通过观看 C# 101 视频边看边练。\n",
17 | "- 利用这些 Notebooks 提及到的内容在 Visual Studio 中编写自己的代码。\n",
18 | "\n",
19 | "## **什么是 C# ?**\n",
20 | "\n",
21 | "C# 是一种功能强大且使用广泛的编程语言,可用于制作网站、游戏、移动应用程序、桌面应用程序、机器学习、云计算、大数据等。 C# 是 .NET 平台的一部分,其中包括所有应用程序库。 我们一起来学习 C#\n",
22 | "\n",
23 | "## **C#: Hello World**\n",
24 | "\n",
25 | "编写你的第一个 C# 程序! 它将字符串“Hello World”输出到控制台。\n",
26 | "> 将鼠标悬停在以下代码上。 在左侧,应该会出现一个小的 “Play” 图标。 单击它,代码将会被执行!"
27 | ]
28 | },
29 | {
30 | "cell_type": "code",
31 | "execution_count": null,
32 | "metadata": {
33 | "dotnet_interactive": {
34 | "language": "csharp"
35 | },
36 | "vscode": {
37 | "languageId": "dotnet-interactive.csharp"
38 | }
39 | },
40 | "outputs": [
41 | {
42 | "name": "stdout",
43 | "output_type": "stream",
44 | "text": [
45 | "Hello World!\n"
46 | ]
47 | }
48 | ],
49 | "source": [
50 | "Console.WriteLine(\"Hello World!\");"
51 | ]
52 | },
53 | {
54 | "cell_type": "markdown",
55 | "metadata": {},
56 | "source": [
57 | "`Console.WriteLine` 是一种用于将消息打印到文本控制台的方法。 在这个例子中,将把“Hello World”输出。\n",
58 | "\n",
59 | "# **声明和使用变量**\n",
60 | "\n",
61 | "**variable** 是一个符号,可用于运行具有不同值的相同代码。 例如,您可以声明一个名为 `aFriend` 的新变量,您可以将其与 `Console.WriteLine` 一起使用去输出字符串。 可以通过使用`string`类型或使用`var`关键字来声明这个变量,`var`会自动找出对应类型。\n",
62 | "\n",
63 | "> 继续运行以下代码以查看 **Jayme** 的输出。\n",
64 | ">\n",
65 | "> 接下来,更改变量中的名称并再次运行它以查看不同的内容。"
66 | ]
67 | },
68 | {
69 | "cell_type": "code",
70 | "execution_count": null,
71 | "metadata": {
72 | "dotnet_interactive": {
73 | "language": "csharp"
74 | },
75 | "vscode": {
76 | "languageId": "dotnet-interactive.csharp"
77 | }
78 | },
79 | "outputs": [
80 | {
81 | "name": "stdout",
82 | "output_type": "stream",
83 | "text": [
84 | "Jayme\r\n"
85 | ]
86 | }
87 | ],
88 | "source": [
89 | "var aFriend = \"Jayme\";\n",
90 | "Console.WriteLine(aFriend);"
91 | ]
92 | },
93 | {
94 | "cell_type": "markdown",
95 | "metadata": {},
96 | "source": [
97 | "# **组合字符串**\n",
98 | "\n",
99 | "您可能已经注意到最后一个代码块中缺少“Hello”一词。 您可以通过使用 `+` 将多个字符串组合在一起来创建一个输出到控制台的新字符串来修复它。\n",
100 | "\n",
101 | "> 运行代码写出Hello的欢迎词!"
102 | ]
103 | },
104 | {
105 | "cell_type": "code",
106 | "execution_count": null,
107 | "metadata": {
108 | "dotnet_interactive": {
109 | "language": "csharp"
110 | },
111 | "vscode": {
112 | "languageId": "dotnet-interactive.csharp"
113 | }
114 | },
115 | "outputs": [
116 | {
117 | "name": "stdout",
118 | "output_type": "stream",
119 | "text": [
120 | "Hello Jayme!\r\n"
121 | ]
122 | }
123 | ],
124 | "source": [
125 | "Console.WriteLine(\"Hello \" + aFriend + \"!\");"
126 | ]
127 | },
128 | {
129 | "cell_type": "markdown",
130 | "metadata": {},
131 | "source": [
132 | "# **字符串插值**\n",
133 | "\n",
134 | "您刚刚使用 `+` 从 **variable** 和 **constant** 构建了一个新字符串。 有一个更好的方法来做到这一点,将变量放在 `{` 和 `}` 之间,告诉 C# 用变量的值替换该文本。 这称为**字符串插值**。 然后,您可以在开始引号之前添加一个 `$` 以启用字符串的字符串插值。"
135 | ]
136 | },
137 | {
138 | "cell_type": "code",
139 | "execution_count": null,
140 | "metadata": {
141 | "dotnet_interactive": {
142 | "language": "csharp"
143 | },
144 | "vscode": {
145 | "languageId": "dotnet-interactive.csharp"
146 | }
147 | },
148 | "outputs": [
149 | {
150 | "name": "stdout",
151 | "output_type": "stream",
152 | "text": [
153 | "Hello string interpolation!\r\n"
154 | ]
155 | }
156 | ],
157 | "source": [
158 | "aFriend = \"string interpolation\";\n",
159 | "Console.WriteLine($\"Hello {aFriend}!\");"
160 | ]
161 | },
162 | {
163 | "cell_type": "markdown",
164 | "metadata": {},
165 | "source": [
166 | "恭喜您!您刚刚成功创建了您的第一个 C# 应用程序,并了解了如何将字符串与字符串插值相结合的方法。"
167 | ]
168 | },
169 | {
170 | "cell_type": "markdown",
171 | "metadata": {},
172 | "source": [
173 | "# **Playground:动动手**\n",
174 | "\n",
175 | "每个模块最后都会有一个小“Playground”的内容,让您尝试自己编写代码。\n",
176 | "\n",
177 | "尝试打印单词和变量! 这里有一些提示可以尝试:\n",
178 | "> 打印个人座右铭。\n",
179 | ">\n",
180 | "> 用你最喜欢的食物做一些变量,然后写一个涉及它们的小故事。\n",
181 | ">\n",
182 | "> **挑战一下**\n",
183 | ">\n",
184 | "> 制作你自己的疯狂图书馆! 做一些动词、名词等变量,然后在你写故事时使用它们。 让朋友决定每个变量的值,然后读给他们笑!"
185 | ]
186 | },
187 | {
188 | "cell_type": "code",
189 | "execution_count": null,
190 | "metadata": {
191 | "dotnet_interactive": {
192 | "language": "csharp"
193 | },
194 | "vscode": {
195 | "languageId": "dotnet-interactive.csharp"
196 | }
197 | },
198 | "outputs": [
199 | {
200 | "name": "stdout",
201 | "output_type": "stream",
202 | "text": [
203 | "Playground\r\n"
204 | ]
205 | }
206 | ],
207 | "source": [
208 | "Console.WriteLine(\"Playground\");"
209 | ]
210 | },
211 | {
212 | "cell_type": "markdown",
213 | "metadata": {},
214 | "source": [
215 | "# **进阶学习**\n",
216 | "\n",
217 | "有非常多的资源给大家学习,不要错过!\n",
218 | ">> [⏩ 下一个学习模块 - 字符串基础](https://github.com/kinfey/csharp-notebooks/blob/main/csharp-101/02-The%20Basics%20of%20Strings.ipynb)\n",
219 | ">\n",
220 | "> [教学视频](https://www.youtube.com/watch?v=KT2VR7m19So&list=PLdo4fOcmZ0oVxKLQCHpiUWun7vlJJvUiN&index=2)\n",
221 | ">\n",
222 | "> [文档:C# 介绍](https://aka.ms/CSTutorials.HelloWorld)"
223 | ]
224 | },
225 | {
226 | "cell_type": "markdown",
227 | "metadata": {},
228 | "source": [
229 | "# **其他资源**\n",
230 | "\n",
231 | "你可以从以下链接中获取\n",
232 | "> [其他 101 系列的教学视频](https://aka.ms/Videos.dotNET)\n",
233 | ">\n",
234 | "> [Microsoft Learn](https://aka.ms/Learn.dotNET)\n",
235 | ">\n",
236 | "> [C# 文档](https://aka.ms/Docs.CSharp)"
237 | ]
238 | }
239 | ],
240 | "metadata": {
241 | "kernelspec": {
242 | "display_name": ".NET (C#)",
243 | "language": "C#",
244 | "name": ".net-csharp"
245 | },
246 | "language_info": {
247 | "file_extension": ".cs",
248 | "mimetype": "text/x-csharp",
249 | "name": "C#",
250 | "pygments_lexer": "csharp",
251 | "version": "8.0"
252 | }
253 | },
254 | "nbformat": 4,
255 | "nbformat_minor": 4
256 | }
257 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | ## Ignore Visual Studio temporary files, build results, and
2 | ## files generated by popular Visual Studio add-ons.
3 | ##
4 | ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
5 |
6 | # User-specific files
7 | *.rsuser
8 | *.suo
9 | *.user
10 | *.userosscache
11 | *.sln.docstates
12 |
13 | # User-specific files (MonoDevelop/Xamarin Studio)
14 | *.userprefs
15 |
16 | # Mono auto generated files
17 | mono_crash.*
18 |
19 | # Build results
20 | [Dd]ebug/
21 | [Dd]ebugPublic/
22 | [Rr]elease/
23 | [Rr]eleases/
24 | x64/
25 | x86/
26 | [Aa][Rr][Mm]/
27 | [Aa][Rr][Mm]64/
28 | bld/
29 | [Bb]in/
30 | [Oo]bj/
31 | [Ll]og/
32 | [Ll]ogs/
33 |
34 | # Visual Studio 2015/2017 cache/options directory
35 | .vs/
36 | # Uncomment if you have tasks that create the project's static files in wwwroot
37 | #wwwroot/
38 |
39 | # Visual Studio 2017 auto generated files
40 | Generated\ Files/
41 |
42 | # MSTest test Results
43 | [Tt]est[Rr]esult*/
44 | [Bb]uild[Ll]og.*
45 |
46 | # NUnit
47 | *.VisualState.xml
48 | TestResult.xml
49 | nunit-*.xml
50 |
51 | # Build Results of an ATL Project
52 | [Dd]ebugPS/
53 | [Rr]eleasePS/
54 | dlldata.c
55 |
56 | # Benchmark Results
57 | BenchmarkDotNet.Artifacts/
58 |
59 | # .NET Core
60 | project.lock.json
61 | project.fragment.lock.json
62 | artifacts/
63 |
64 | # StyleCop
65 | StyleCopReport.xml
66 |
67 | # Files built by Visual Studio
68 | *_i.c
69 | *_p.c
70 | *_h.h
71 | *.ilk
72 | *.meta
73 | *.obj
74 | *.iobj
75 | *.pch
76 | *.pdb
77 | *.ipdb
78 | *.pgc
79 | *.pgd
80 | *.rsp
81 | *.sbr
82 | *.tlb
83 | *.tli
84 | *.tlh
85 | *.tmp
86 | *.tmp_proj
87 | *_wpftmp.csproj
88 | *.log
89 | *.vspscc
90 | *.vssscc
91 | .builds
92 | *.pidb
93 | *.svclog
94 | *.scc
95 |
96 | # Chutzpah Test files
97 | _Chutzpah*
98 |
99 | # Visual C++ cache files
100 | ipch/
101 | *.aps
102 | *.ncb
103 | *.opendb
104 | *.opensdf
105 | *.sdf
106 | *.cachefile
107 | *.VC.db
108 | *.VC.VC.opendb
109 |
110 | # Visual Studio profiler
111 | *.psess
112 | *.vsp
113 | *.vspx
114 | *.sap
115 |
116 | # Visual Studio Trace Files
117 | *.e2e
118 |
119 | # TFS 2012 Local Workspace
120 | $tf/
121 |
122 | # Guidance Automation Toolkit
123 | *.gpState
124 |
125 | # ReSharper is a .NET coding add-in
126 | _ReSharper*/
127 | *.[Rr]e[Ss]harper
128 | *.DotSettings.user
129 |
130 | # TeamCity is a build add-in
131 | _TeamCity*
132 |
133 | # DotCover is a Code Coverage Tool
134 | *.dotCover
135 |
136 | # AxoCover is a Code Coverage Tool
137 | .axoCover/*
138 | !.axoCover/settings.json
139 |
140 | # Visual Studio code coverage results
141 | *.coverage
142 | *.coveragexml
143 |
144 | # NCrunch
145 | _NCrunch_*
146 | .*crunch*.local.xml
147 | nCrunchTemp_*
148 |
149 | # MightyMoose
150 | *.mm.*
151 | AutoTest.Net/
152 |
153 | # Web workbench (sass)
154 | .sass-cache/
155 |
156 | # Installshield output folder
157 | [Ee]xpress/
158 |
159 | # DocProject is a documentation generator add-in
160 | DocProject/buildhelp/
161 | DocProject/Help/*.HxT
162 | DocProject/Help/*.HxC
163 | DocProject/Help/*.hhc
164 | DocProject/Help/*.hhk
165 | DocProject/Help/*.hhp
166 | DocProject/Help/Html2
167 | DocProject/Help/html
168 |
169 | # Click-Once directory
170 | publish/
171 |
172 | # Publish Web Output
173 | *.[Pp]ublish.xml
174 | *.azurePubxml
175 | # Note: Comment the next line if you want to checkin your web deploy settings,
176 | # but database connection strings (with potential passwords) will be unencrypted
177 | *.pubxml
178 | *.publishproj
179 |
180 | # Microsoft Azure Web App publish settings. Comment the next line if you want to
181 | # checkin your Azure Web App publish settings, but sensitive information contained
182 | # in these scripts will be unencrypted
183 | PublishScripts/
184 |
185 | # NuGet Packages
186 | *.nupkg
187 | # NuGet Symbol Packages
188 | *.snupkg
189 | # The packages folder can be ignored because of Package Restore
190 | **/[Pp]ackages/*
191 | # except build/, which is used as an MSBuild target.
192 | !**/[Pp]ackages/build/
193 | # Uncomment if necessary however generally it will be regenerated when needed
194 | #!**/[Pp]ackages/repositories.config
195 | # NuGet v3's project.json files produces more ignorable files
196 | *.nuget.props
197 | *.nuget.targets
198 |
199 | # Microsoft Azure Build Output
200 | csx/
201 | *.build.csdef
202 |
203 | # Microsoft Azure Emulator
204 | ecf/
205 | rcf/
206 |
207 | # Windows Store app package directories and files
208 | AppPackages/
209 | BundleArtifacts/
210 | Package.StoreAssociation.xml
211 | _pkginfo.txt
212 | *.appx
213 | *.appxbundle
214 | *.appxupload
215 |
216 | # Visual Studio cache files
217 | # files ending in .cache can be ignored
218 | *.[Cc]ache
219 | # but keep track of directories ending in .cache
220 | !?*.[Cc]ache/
221 |
222 | # Others
223 | ClientBin/
224 | ~$*
225 | *~
226 | *.dbmdl
227 | *.dbproj.schemaview
228 | *.jfm
229 | *.pfx
230 | *.publishsettings
231 | orleans.codegen.cs
232 |
233 | # Including strong name files can present a security risk
234 | # (https://github.com/github/gitignore/pull/2483#issue-259490424)
235 | #*.snk
236 |
237 | # Since there are multiple workflows, uncomment next line to ignore bower_components
238 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
239 | #bower_components/
240 |
241 | # RIA/Silverlight projects
242 | Generated_Code/
243 |
244 | # Backup & report files from converting an old project file
245 | # to a newer Visual Studio version. Backup files are not needed,
246 | # because we have git ;-)
247 | _UpgradeReport_Files/
248 | Backup*/
249 | UpgradeLog*.XML
250 | UpgradeLog*.htm
251 | ServiceFabricBackup/
252 | *.rptproj.bak
253 |
254 | # SQL Server files
255 | *.mdf
256 | *.ldf
257 | *.ndf
258 |
259 | # Business Intelligence projects
260 | *.rdl.data
261 | *.bim.layout
262 | *.bim_*.settings
263 | *.rptproj.rsuser
264 | *- [Bb]ackup.rdl
265 | *- [Bb]ackup ([0-9]).rdl
266 | *- [Bb]ackup ([0-9][0-9]).rdl
267 |
268 | # Microsoft Fakes
269 | FakesAssemblies/
270 |
271 | # GhostDoc plugin setting file
272 | *.GhostDoc.xml
273 |
274 | # Node.js Tools for Visual Studio
275 | .ntvs_analysis.dat
276 | node_modules/
277 |
278 | # Visual Studio 6 build log
279 | *.plg
280 |
281 | # Visual Studio 6 workspace options file
282 | *.opt
283 |
284 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
285 | *.vbw
286 |
287 | # Visual Studio LightSwitch build output
288 | **/*.HTMLClient/GeneratedArtifacts
289 | **/*.DesktopClient/GeneratedArtifacts
290 | **/*.DesktopClient/ModelManifest.xml
291 | **/*.Server/GeneratedArtifacts
292 | **/*.Server/ModelManifest.xml
293 | _Pvt_Extensions
294 |
295 | # Paket dependency manager
296 | .paket/paket.exe
297 | paket-files/
298 |
299 | # FAKE - F# Make
300 | .fake/
301 |
302 | # CodeRush personal settings
303 | .cr/personal
304 |
305 | # Python Tools for Visual Studio (PTVS)
306 | __pycache__/
307 | *.pyc
308 |
309 | # Cake - Uncomment if you are using it
310 | # tools/**
311 | # !tools/packages.config
312 |
313 | # Tabs Studio
314 | *.tss
315 |
316 | # Telerik's JustMock configuration file
317 | *.jmconfig
318 |
319 | # BizTalk build output
320 | *.btp.cs
321 | *.btm.cs
322 | *.odx.cs
323 | *.xsd.cs
324 |
325 | # OpenCover UI analysis results
326 | OpenCover/
327 |
328 | # Azure Stream Analytics local run output
329 | ASALocalRun/
330 |
331 | # MSBuild Binary and Structured Log
332 | *.binlog
333 |
334 | # NVidia Nsight GPU debugger configuration file
335 | *.nvuser
336 |
337 | # MFractors (Xamarin productivity tool) working folder
338 | .mfractor/
339 |
340 | # Local History for Visual Studio
341 | .localhistory/
342 |
343 | # BeatPulse healthcheck temp database
344 | healthchecksdb
345 |
346 | # Backup folder for Package Reference Convert tool in Visual Studio 2017
347 | MigrationBackup/
348 |
349 | # Ionide (cross platform F# VS Code tools) working folder
350 | .ionide/
351 |
--------------------------------------------------------------------------------
/csharp-101/07-Branches (if).ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# **分支 ( if 语句)**\n",
8 | "\n",
9 | "观看该模块的教学视频 [C# 101 video](https://www.youtube.com/watch?v=y4OTe8LSokg&list=PLdo4fOcmZ0oVxKLQCHpiUWun7vlJJvUiN&index=8) "
10 | ]
11 | },
12 | {
13 | "cell_type": "markdown",
14 | "metadata": {},
15 | "source": [
16 | "## **if 语句基础**\n",
17 | "\n",
18 | "if 语句帮助做出决定。\n",
19 | "\n",
20 | "> 试试我们的第一个 if 语句:"
21 | ]
22 | },
23 | {
24 | "cell_type": "code",
25 | "execution_count": null,
26 | "metadata": {
27 | "dotnet_interactive": {
28 | "language": "csharp"
29 | },
30 | "vscode": {
31 | "languageId": "dotnet-interactive.csharp"
32 | }
33 | },
34 | "outputs": [
35 | {
36 | "name": "stdout",
37 | "output_type": "stream",
38 | "text": [
39 | "The answer is greater than 10.\r\n"
40 | ]
41 | }
42 | ],
43 | "source": [
44 | "int a = 5;\n",
45 | "int b = 6;\n",
46 | "if (a + b > 10)\n",
47 | " Console.WriteLine(\"The answer is greater than 10.\");"
48 | ]
49 | },
50 | {
51 | "cell_type": "markdown",
52 | "metadata": {},
53 | "source": [
54 | "换句话说,这个 if 语句是说“如果 a 加 b 大于 10,则写下'答案大于 10'”这一行。\n",
55 | "> 如果 a + b 小于 10 会怎样? 试着编辑前面的代码看看。\n",
56 | "\n",
57 | "什么都没发生吗? 那太棒了! 由于不满足 if 语句的**条件**(a + b 大于 10),因此代码没有进入 if 语句,因此没有可打印的内容。"
58 | ]
59 | },
60 | {
61 | "cell_type": "markdown",
62 | "metadata": {},
63 | "source": [
64 | "## **条件是什么?**\n",
65 | "\n",
66 | "`条件` 是`if` 后面括号中的语句。 “条件”是一个布尔值,这意味着它必须返回真或假。 这意味着使用诸如`>`、`<`、`<=`、`>=`或`==`之类的符号。\n",
67 | "> 练习布尔语句。 尝试一些不同的符号和数字来查看答案。"
68 | ]
69 | },
70 | {
71 | "cell_type": "code",
72 | "execution_count": null,
73 | "metadata": {
74 | "dotnet_interactive": {
75 | "language": "csharp"
76 | },
77 | "vscode": {
78 | "languageId": "dotnet-interactive.csharp"
79 | }
80 | },
81 | "outputs": [
82 | {
83 | "name": "stdout",
84 | "output_type": "stream",
85 | "text": [
86 | "This condition is False\r\n"
87 | ]
88 | }
89 | ],
90 | "source": [
91 | "bool outcome = 3 > 5;\n",
92 | "Console.WriteLine(\"This condition is \" + outcome);"
93 | ]
94 | },
95 | {
96 | "cell_type": "markdown",
97 | "metadata": {},
98 | "source": [
99 | "## **Else 语句**\n",
100 | "\n",
101 | "之前,如果不满足 `if` 语句的条件,则跳过整个 if 语句。 但是,如果您希望在这两种情况下都发生一些事情怎么办? `else` 是条件结果为假时发生的情况。\n",
102 | "\n",
103 | "> 运行此代码并更改条件几次以查看不同的结果。"
104 | ]
105 | },
106 | {
107 | "cell_type": "code",
108 | "execution_count": null,
109 | "metadata": {
110 | "dotnet_interactive": {
111 | "language": "csharp"
112 | },
113 | "vscode": {
114 | "languageId": "dotnet-interactive.csharp"
115 | }
116 | },
117 | "outputs": [
118 | {
119 | "name": "stdout",
120 | "output_type": "stream",
121 | "text": [
122 | "The answer is not greater than 10\r\n"
123 | ]
124 | }
125 | ],
126 | "source": [
127 | "int a = 5;\n",
128 | "int b = 3;\n",
129 | "if (a + b > 10)\n",
130 | " Console.WriteLine(\"The answer is greater than 10\");\n",
131 | "else\n",
132 | " Console.WriteLine(\"The answer is not greater than 10\");"
133 | ]
134 | },
135 | {
136 | "cell_type": "markdown",
137 | "metadata": {},
138 | "source": [
139 | "## **多行 if 语句**\n",
140 | "\n",
141 | "如果您想在 `if` 语句中使用更复杂的代码怎么办? 太好了,只需在您想要完成的内容周围添加 { } 即可。\n",
142 | "\n",
143 | "> 试试看! 运行以下代码。"
144 | ]
145 | },
146 | {
147 | "cell_type": "code",
148 | "execution_count": null,
149 | "metadata": {
150 | "dotnet_interactive": {
151 | "language": "csharp"
152 | },
153 | "vscode": {
154 | "languageId": "dotnet-interactive.csharp"
155 | }
156 | },
157 | "outputs": [
158 | {
159 | "name": "stdout",
160 | "output_type": "stream",
161 | "text": [
162 | "The answer is not greater than 10\r\n",
163 | "Or the first number is not equal to the second\r\n"
164 | ]
165 | }
166 | ],
167 | "source": [
168 | "int c = 4;\n",
169 | "if ((a + b + c > 10) && (a == b))\n",
170 | "{\n",
171 | " Console.WriteLine(\"The answer is greater than 10\");\n",
172 | " Console.WriteLine(\"And the first number is equal to the second\");\n",
173 | "}\n",
174 | "else\n",
175 | "{\n",
176 | " Console.WriteLine(\"The answer is not greater than 10\");\n",
177 | " Console.WriteLine(\"Or the first number is not equal to the second\");\n",
178 | "}"
179 | ]
180 | },
181 | {
182 | "cell_type": "markdown",
183 | "metadata": {},
184 | "source": [
185 | "`&&` 表示“和”。 这是一种连接多个条件的方法。 您也可以使用 `||` 作为“或”。\n",
186 | "\n",
187 | " 上面的“if”条件检查将 a、b 和 c 相加大于 10 并且 a 等于 b。 如果两者都为真,则进入 `if` 语句; 否则,它进入 `else` 部分。"
188 | ]
189 | },
190 | {
191 | "cell_type": "markdown",
192 | "metadata": {},
193 | "source": [
194 | "# **Playground:动动手**\n",
195 | "\n",
196 | "> 尝试用“或”符号代替前面代码中的“和”。 你需要做什么才能得到真与假?\n",
197 | ">\n",
198 | "> 如果将 if 语句放在 if 语句(嵌套的 if 语句)中会怎样?\n",
199 | ">\n",
200 | "> 你能画出 if 语句的流程吗? 嵌套 if 语句?"
201 | ]
202 | },
203 | {
204 | "cell_type": "code",
205 | "execution_count": null,
206 | "metadata": {
207 | "dotnet_interactive": {
208 | "language": "csharp"
209 | },
210 | "vscode": {
211 | "languageId": "dotnet-interactive.csharp"
212 | }
213 | },
214 | "outputs": [
215 | {
216 | "name": "stdout",
217 | "output_type": "stream",
218 | "text": [
219 | "Playground\r\n"
220 | ]
221 | }
222 | ],
223 | "source": [
224 | "Console.WriteLine(\"Playground\");"
225 | ]
226 | },
227 | {
228 | "cell_type": "markdown",
229 | "metadata": {},
230 | "source": [
231 | "# **进阶学习**\n",
232 | "\n",
233 | "> [⏩ 下一个学习模块 - 什么是循环](https://github.com/kinfey/csharp-notebooks/blob/main/csharp-101/08-What%20Are%20Loops.ipynb)\n",
234 | ">\n",
235 | "> [⏪ 上一个学习模块 - 小数类型介绍 ](https://github.com/kinfey/csharp-notebooks/blob/main/csharp-101/06-Numbers%20and%20Decimals.ipynb)\n",
236 | ">\n",
237 | "> [观看教学视频](https://www.youtube.com/watch?v=KT2VR7m19So&list=PLdo4fOcmZ0oVxKLQCHpiUWun7vlJJvUiN&index=2)\n",
238 | ">、\n",
239 | "> [文档: C# 条件语句](https://aka.ms/CSharp.If)\n",
240 | ">\n",
241 | "> [从头学起: 什么是 C# ?](https://www.youtube.com/watch?v=BM4CHBmAPh4&list=PLdo4fOcmZ0oVxKLQCHpiUWun7vlJJvUiN&index=1)"
242 | ]
243 | },
244 | {
245 | "cell_type": "markdown",
246 | "metadata": {},
247 | "source": [
248 | "# **其他资源**\n",
249 | "\n",
250 | "你可以从以下链接中获取\n",
251 | "> [其他 101 系列的教学视频](https://aka.ms/Videos.dotNET)\n",
252 | ">\n",
253 | "> [Microsoft Learn](https://aka.ms/Learn.dotNET)\n",
254 | ">\n",
255 | "> [C# 文档](https://aka.ms/Docs.CSharp)"
256 | ]
257 | }
258 | ],
259 | "metadata": {
260 | "kernelspec": {
261 | "display_name": ".NET (C#)",
262 | "language": "C#",
263 | "name": ".net-csharp"
264 | },
265 | "language_info": {
266 | "file_extension": ".cs",
267 | "mimetype": "text/x-csharp",
268 | "name": "C#",
269 | "pygments_lexer": "csharp",
270 | "version": "8.0"
271 | }
272 | },
273 | "nbformat": 4,
274 | "nbformat_minor": 4
275 | }
276 |
--------------------------------------------------------------------------------
/csharp-101/08-What Are Loops.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# **什么是循环?**\n",
8 | "观看该模块的教学视频 [C# 101 video](https://www.youtube.com/watch?v=z31m5Up_gSQ&list=PLdo4fOcmZ0oVxKLQCHpiUWun7vlJJvUiN&index=10) "
9 | ]
10 | },
11 | {
12 | "cell_type": "markdown",
13 | "metadata": {},
14 | "source": [
15 | "循环是一种重复动作多次的方式。 您可以使用 `while` 来执行此操作。\n",
16 | "> 尝试第一个循环:"
17 | ]
18 | },
19 | {
20 | "cell_type": "code",
21 | "execution_count": null,
22 | "metadata": {
23 | "dotnet_interactive": {
24 | "language": "csharp"
25 | },
26 | "vscode": {
27 | "languageId": "dotnet-interactive.csharp"
28 | }
29 | },
30 | "outputs": [
31 | {
32 | "name": "stdout",
33 | "output_type": "stream",
34 | "text": [
35 | "Hello World! The counter is 0\r\n",
36 | "Hello World! The counter is 1\r\n",
37 | "Hello World! The counter is 2\r\n",
38 | "Hello World! The counter is 3\r\n",
39 | "Hello World! The counter is 4\r\n",
40 | "Hello World! The counter is 5\r\n",
41 | "Hello World! The counter is 6\r\n",
42 | "Hello World! The counter is 7\r\n",
43 | "Hello World! The counter is 8\r\n",
44 | "Hello World! The counter is 9\r\n"
45 | ]
46 | }
47 | ],
48 | "source": [
49 | "int counter = 0;\n",
50 | "while (counter < 10)\n",
51 | "{\n",
52 | " Console.WriteLine($\"Hello World! The counter is {counter}\");\n",
53 | " counter++;\n",
54 | "}"
55 | ]
56 | },
57 | {
58 | "cell_type": "markdown",
59 | "metadata": {},
60 | "source": [
61 | "那么这里发生了什么? `while` 检查条件('counter < 10')是否为真。如果是,它会通过循环。然后再次检查。它将继续循环,直到条件为假。\n",
62 | "在找出分支和循环时,将代码放入人类语言会很有帮助。这段代码说:“将计数器设置为 0。当计数器小于 10 时,打印‘Hello World!计数器是 {counter}’,然后将计数器加 1”。\n",
63 | "\n",
64 | "## ++\n",
65 | "\n",
66 | "`++` 是一种快速添加变量的方法。你也可以用`--`来做同样的事情,它从变量中减去一。\n",
67 | "\n",
68 | "## **无限循环**\n",
69 | "\n",
70 | "很容易造成无限循环。 **编者注:您不能告诉他们创建无限循环,因为笔记本永远不会自行停止**如果您遇到无限循环,您有两种选择:您可以随时退出程序,或者可以按CTRL+C 结束。\n",
71 | "\n",
72 | "> 挑战一下:您不能在此笔记本上显示,因为代码不会自行捕捉,但作为挑战,请尝试在 Visual Studio 中进行无限循环!"
73 | ]
74 | },
75 | {
76 | "cell_type": "markdown",
77 | "metadata": {},
78 | "source": [
79 | "## **do**\n",
80 | "\n",
81 | "你也可以用 `do` 做一个循环。\n",
82 | "> 试试下面的代码,看看它和 `while` 循环之间是否有什么不同。"
83 | ]
84 | },
85 | {
86 | "cell_type": "code",
87 | "execution_count": null,
88 | "metadata": {
89 | "dotnet_interactive": {
90 | "language": "csharp"
91 | },
92 | "vscode": {
93 | "languageId": "dotnet-interactive.csharp"
94 | }
95 | },
96 | "outputs": [
97 | {
98 | "name": "stdout",
99 | "output_type": "stream",
100 | "text": [
101 | "Hello World! The counter is 0\r\n",
102 | "Hello World! The counter is 1\r\n",
103 | "Hello World! The counter is 2\r\n",
104 | "Hello World! The counter is 3\r\n",
105 | "Hello World! The counter is 4\r\n",
106 | "Hello World! The counter is 5\r\n",
107 | "Hello World! The counter is 6\r\n",
108 | "Hello World! The counter is 7\r\n",
109 | "Hello World! The counter is 8\r\n",
110 | "Hello World! The counter is 9\r\n"
111 | ]
112 | }
113 | ],
114 | "source": [
115 | "int counter = 0;\n",
116 | "do\n",
117 | "{\n",
118 | " Console.WriteLine($\"Hello World! The counter is {counter}\");\n",
119 | " counter++;\n",
120 | "} while (counter < 10);"
121 | ]
122 | },
123 | {
124 | "cell_type": "markdown",
125 | "metadata": {},
126 | "source": [
127 | "似乎没有什么不同\n",
128 | "\n",
129 | "> 尝试在两个代码上将条件更改为 `(counter < 0)`。 会发生什么呢?\n",
130 | "\n",
131 | "在 `while` 循环中,什么都不会被打印出来,但在 `do` 循环中,你会得到一个打印输出。 `do` 循环首先执行操作,然后检查条件。 相反,`while` 循环首先检查条件,然后执行操作。"
132 | ]
133 | },
134 | {
135 | "cell_type": "markdown",
136 | "metadata": {},
137 | "source": [
138 | "## **for 循环**\n",
139 | "\n",
140 | "`for` 是最常见的循环之一。 \n",
141 | "> 在您了解代码的所有细节之前,运行以下 for 循环以查看它是否正常工作:"
142 | ]
143 | },
144 | {
145 | "cell_type": "code",
146 | "execution_count": null,
147 | "metadata": {
148 | "dotnet_interactive": {
149 | "language": "csharp"
150 | },
151 | "vscode": {
152 | "languageId": "dotnet-interactive.csharp"
153 | }
154 | },
155 | "outputs": [
156 | {
157 | "name": "stdout",
158 | "output_type": "stream",
159 | "text": [
160 | "Hello World! The counter is 0\r\n",
161 | "Hello World! The counter is 1\r\n",
162 | "Hello World! The counter is 2\r\n",
163 | "Hello World! The counter is 3\r\n",
164 | "Hello World! The counter is 4\r\n",
165 | "Hello World! The counter is 5\r\n",
166 | "Hello World! The counter is 6\r\n",
167 | "Hello World! The counter is 7\r\n",
168 | "Hello World! The counter is 8\r\n",
169 | "Hello World! The counter is 9\r\n"
170 | ]
171 | }
172 | ],
173 | "source": [
174 | "for (int counter = 0; counter < 10; counter++)\n",
175 | "{\n",
176 | " Console.WriteLine($\"Hello World! The counter is {counter}\");\n",
177 | "}"
178 | ]
179 | },
180 | {
181 | "cell_type": "markdown",
182 | "metadata": {},
183 | "source": [
184 | "### **括号里是什么?**\n",
185 | "\n",
186 | "`for` 循环括号中包含三个部分:`int counter = 0`、`counter < 10` 和 `counter++`。\n",
187 | "您可以将它们视为起点、终点和步长。\n",
188 | "`int counter = 0` 只是设置计数器。 你从 0 开始。\n",
189 | "`counter < 10` 是在每个循环开始时检查的条件。 一旦条件为假(在这种情况下,一旦计数器不小于 10),循环就完成并且代码继续运行。\n",
190 | "`counter++` 将 counter 加一,离终点更近了一步。 该步骤在每个循环结束时执行。\n",
191 | "> 尝试弄乱 `for` 循环设置。 它是如何变化的?"
192 | ]
193 | },
194 | {
195 | "cell_type": "markdown",
196 | "metadata": {},
197 | "source": [
198 | "# **Playground:动动手**\n",
199 | "\n",
200 | "> 做一个从 10 倒数的循环。\n",
201 | ">\n",
202 | "> 做一个向前计数乘以 2 的循环。\n",
203 | ">\n",
204 | "> 做一个从 7 到 22 的循环。\n",
205 | ">\n",
206 | "> 附加:使用三种循环方式进行上述操作。"
207 | ]
208 | },
209 | {
210 | "cell_type": "code",
211 | "execution_count": null,
212 | "metadata": {
213 | "dotnet_interactive": {
214 | "language": "csharp"
215 | },
216 | "vscode": {
217 | "languageId": "dotnet-interactive.csharp"
218 | }
219 | },
220 | "outputs": [
221 | {
222 | "name": "stdout",
223 | "output_type": "stream",
224 | "text": [
225 | "Playground\r\n"
226 | ]
227 | }
228 | ],
229 | "source": [
230 | "Console.WriteLine(\"Playground\");"
231 | ]
232 | },
233 | {
234 | "cell_type": "markdown",
235 | "metadata": {},
236 | "source": [
237 | "# **进阶学习**\n",
238 | "\n",
239 | "\n",
240 | "> [⏩ 上一个学习模块 - 分支和循环结合](https://github.com/kinfey/csharp-notebooks/blob/main/csharp-101/09-Combining%20Branches%20and%20Loops.ipynb)\n",
241 | ">\n",
242 | "> [⏪ 下一个学习模块 - 分支 ( if 语句)](https://github.com/kinfey/csharp-notebooks/blob/main/csharp-101/07-Branches%20(if).ipynb)\n",
243 | ">\n",
244 | "> [观看教学视频](https://www.youtube.com/watch?v=z31m5Up_gSQ&list=PLdo4fOcmZ0oVxKLQCHpiUWun7vlJJvUiN&index=10)\n",
245 | ">\n",
246 | "> [文档: C# 循环语句](https://aka.ms/CSharp.Loop)\n",
247 | ">\n",
248 | "> [从头学起: 什么是 C# ?](https://www.youtube.com/watch?v=BM4CHBmAPh4&list=PLdo4fOcmZ0oVxKLQCHpiUWun7vlJJvUiN&index=1)\n",
249 | ">\n",
250 | "\n",
251 | "# **其他资源**\n",
252 | "\n",
253 | "你可以从以下链接中获取\n",
254 | "> [其他 101 系列的教学视频](https://aka.ms/Videos.dotNET)\n",
255 | ">\n",
256 | "> [Microsoft Learn](https://aka.ms/Learn.dotNET)\n",
257 | ">\n",
258 | "> [C# 文档](https://aka.ms/Docs.CSharp)"
259 | ]
260 | }
261 | ],
262 | "metadata": {
263 | "kernelspec": {
264 | "display_name": ".NET (C#)",
265 | "language": "C#",
266 | "name": ".net-csharp"
267 | },
268 | "language_info": {
269 | "file_extension": ".cs",
270 | "mimetype": "text/x-csharp",
271 | "name": "C#",
272 | "pygments_lexer": "csharp",
273 | "version": "8.0"
274 | }
275 | },
276 | "nbformat": 4,
277 | "nbformat_minor": 4
278 | }
279 |
--------------------------------------------------------------------------------
/csharp-101/02-The Basics of Strings.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# **字符串基础**\n",
8 | "\n",
9 | "观看该模块的教学视频 [C# 101 video](https://www.youtube.com/watch?v=JSpC7Cz64h0&list=PLdo4fOcmZ0oVxKLQCHpiUWun7vlJJvUiN&index=3)\n",
10 | "\n",
11 | "## **什么是字符串**?\n",
12 | "\n",
13 | "字符串是一个字符序列。 一个方便的比喻是友谊手镯,您可以通过把字母串在一起去命名。"
14 | ]
15 | },
16 | {
17 | "cell_type": "markdown",
18 | "metadata": {},
19 | "source": [
20 | "## **字符串和字符串文字**\n",
21 | "\n",
22 | "`firstFriend` 和 `secondFriend` 是字符串的变量。 `Console.WriteLine` 中的行也是一个字符串。 这是一个**字符串文字**。 字符串文字是表示常量字符串的文本。\n",
23 | "\n",
24 | "> 用下面的代码试试。 按 \"Play\",看看会发生什么。\n",
25 | ">\n",
26 | "> 接下来,尝试更改变量以查看不同的名称。"
27 | ]
28 | },
29 | {
30 | "cell_type": "code",
31 | "execution_count": null,
32 | "metadata": {
33 | "dotnet_interactive": {
34 | "language": "csharp"
35 | },
36 | "vscode": {
37 | "languageId": "dotnet-interactive.csharp"
38 | }
39 | },
40 | "outputs": [
41 | {
42 | "name": "stdout",
43 | "output_type": "stream",
44 | "text": [
45 | "My friends are Maria and Sophia\r\n"
46 | ]
47 | }
48 | ],
49 | "source": [
50 | "string firstFriend = \"Maria\";\n",
51 | "string secondFriend = \"Sophia\";\n",
52 | "Console.WriteLine($\"My friends are {firstFriend} and {secondFriend}\");"
53 | ]
54 | },
55 | {
56 | "cell_type": "markdown",
57 | "metadata": {},
58 | "source": [
59 | "## **字符串属性**\n",
60 | "\n",
61 | "随着您对字符串的更多的了解,您会发现字符串不仅仅是字母的集合。 您可以使用 `Length` 找到字符串的长度。 `Length` 是字符串的**属性**,它返回该字符串中的字符数。\n",
62 | "\n",
63 | "> 试试看朋友的名字有多长:"
64 | ]
65 | },
66 | {
67 | "cell_type": "code",
68 | "execution_count": null,
69 | "metadata": {
70 | "dotnet_interactive": {
71 | "language": "csharp"
72 | },
73 | "vscode": {
74 | "languageId": "dotnet-interactive.csharp"
75 | }
76 | },
77 | "outputs": [
78 | {
79 | "name": "stdout",
80 | "output_type": "stream",
81 | "text": [
82 | "The name Maria has 5 letters.\r\n",
83 | "The name Sophia has 6 letters.\r\n"
84 | ]
85 | }
86 | ],
87 | "source": [
88 | "Console.WriteLine($\"The name {firstFriend} has {firstFriend.Length} letters.\");\n",
89 | "Console.WriteLine($\"The name {secondFriend} has {secondFriend.Length} letters.\");"
90 | ]
91 | },
92 | {
93 | "cell_type": "markdown",
94 | "metadata": {},
95 | "source": [
96 | "# **字符串方法**\n",
97 | "\n",
98 | "## **前导和尾随空格**\n",
99 | "\n",
100 | "假设您的字符串有您不想显示的前导或尾随空格(也称为**空白**)。 您想修剪字符串中的空格。 `Trim` 方法和相关方法 `TrimStart` 和 `TrimEnd` 完成这项工作。 您可以使用这些方法来删除前导和尾随空格。\n",
101 | "\n",
102 | "> 在下面的代码中进行调整。 括号可以帮助您查看字符串包含的所有空白区域。\n"
103 | ]
104 | },
105 | {
106 | "cell_type": "code",
107 | "execution_count": null,
108 | "metadata": {
109 | "dotnet_interactive": {
110 | "language": "csharp"
111 | },
112 | "vscode": {
113 | "languageId": "dotnet-interactive.csharp"
114 | }
115 | },
116 | "outputs": [
117 | {
118 | "name": "stdout",
119 | "output_type": "stream",
120 | "text": [
121 | "[ Hello World! ]\r\n",
122 | "[Hello World! ]\r\n",
123 | "[ Hello World!]\r\n",
124 | "[Hello World!]\r\n"
125 | ]
126 | }
127 | ],
128 | "source": [
129 | "string greeting = \" Hello World! \";\n",
130 | "Console.WriteLine($\"[{greeting}]\");\n",
131 | "\n",
132 | "string trimmedGreeting = greeting.TrimStart();\n",
133 | "Console.WriteLine($\"[{trimmedGreeting}]\");\n",
134 | "\n",
135 | "trimmedGreeting = greeting.TrimEnd();\n",
136 | "Console.WriteLine($\"[{trimmedGreeting}]\");\n",
137 | "\n",
138 | "trimmedGreeting = greeting.Trim();\n",
139 | "Console.WriteLine($\"[{trimmedGreeting}]\");"
140 | ]
141 | },
142 | {
143 | "cell_type": "markdown",
144 | "metadata": {},
145 | "source": [
146 | "## **替换**\n",
147 | "\n",
148 | "您还可以将子字符串替换为其他值。 例如,在下面的代码中,您可以使用“Hello World!” 并将“Hello”替换为“Greetings”,制作“Greetings World!”\n",
149 | "\n",
150 | "> 动动手,你还能用什么来代替“Hello”?"
151 | ]
152 | },
153 | {
154 | "cell_type": "code",
155 | "execution_count": null,
156 | "metadata": {
157 | "dotnet_interactive": {
158 | "language": "csharp"
159 | },
160 | "vscode": {
161 | "languageId": "dotnet-interactive.csharp"
162 | }
163 | },
164 | "outputs": [
165 | {
166 | "name": "stdout",
167 | "output_type": "stream",
168 | "text": [
169 | "Hello World!\r\n",
170 | "Greetings World!\r\n"
171 | ]
172 | }
173 | ],
174 | "source": [
175 | "string sayHello = \"Hello World!\";\n",
176 | "Console.WriteLine(sayHello);\n",
177 | "sayHello = sayHello.Replace(\"Hello\", \"Greetings\");\n",
178 | "Console.WriteLine(sayHello);"
179 | ]
180 | },
181 | {
182 | "cell_type": "markdown",
183 | "metadata": {},
184 | "source": [
185 | "## **大小写转换**\n",
186 | "\n",
187 | "有时您需要您的字符串全部为大写或全部小写。 `ToUpper` 和 `ToLower` 就是这样做的。\n",
188 | "> 下面的例子似乎有点混乱。 你能把它改成“whisper”全是小写,“shout”全是大写吗?"
189 | ]
190 | },
191 | {
192 | "cell_type": "code",
193 | "execution_count": null,
194 | "metadata": {
195 | "dotnet_interactive": {
196 | "language": "csharp"
197 | },
198 | "vscode": {
199 | "languageId": "dotnet-interactive.csharp"
200 | }
201 | },
202 | "outputs": [
203 | {
204 | "name": "stdout",
205 | "output_type": "stream",
206 | "text": [
207 | "WHISPER\r\n",
208 | "shout\r\n"
209 | ]
210 | }
211 | ],
212 | "source": [
213 | "Console.WriteLine(\"WhiSPer\".ToUpper());\n",
214 | "Console.WriteLine(\"sHoUt\".ToLower());"
215 | ]
216 | },
217 | {
218 | "cell_type": "markdown",
219 | "metadata": {},
220 | "source": [
221 | "# **Playground:动动手**\n",
222 | "\n",
223 | "练习一下:\n",
224 | "> 创建三个变量代表三个人的姓名。\n",
225 | ">\n",
226 | "> 找出第一个人名字的长度,第二个人的名字转换为全部大写,第三个人的名字转换为全部小写。\n",
227 | ">\n",
228 | "> “supercalifragilisticexpialidocious”中含有多少个字母?\n",
229 | ">\n",
230 | "> 字符串通过“ friendship bracelet ”调用 Trim 方法时取出了多少个字符? Trim 会把中间的控件替换掉吗?\n",
231 | ">"
232 | ]
233 | },
234 | {
235 | "cell_type": "code",
236 | "execution_count": null,
237 | "metadata": {
238 | "dotnet_interactive": {
239 | "language": "csharp"
240 | },
241 | "vscode": {
242 | "languageId": "dotnet-interactive.csharp"
243 | }
244 | },
245 | "outputs": [
246 | {
247 | "name": "stdout",
248 | "output_type": "stream",
249 | "text": [
250 | "Playground\r\n",
251 | "supercalifragilisticexpialidocious\r\n",
252 | " friendship bracelet \r\n"
253 | ]
254 | }
255 | ],
256 | "source": [
257 | "Console.WriteLine(\"Playground\");\n",
258 | "Console.WriteLine(\"supercalifragilisticexpialidocious\");\n",
259 | "Console.WriteLine(\" friendship bracelet \");"
260 | ]
261 | },
262 | {
263 | "cell_type": "markdown",
264 | "metadata": {},
265 | "source": [
266 | "# **进阶学习**\n",
267 | "\n",
268 | "有非常多的资源给大家学习,不要错过!\n",
269 | "> [⏩ 下一个学习模块 - 查找字符串](https://github.com/kinfey/csharp-notebooks/blob/main/csharp-101/03-Searching%20Strings.ipynb)\n",
270 | ">\n",
271 | "> [⏪ 上一个学习模块 - Hello World](https://github.com/kinfey/csharp-notebooks/blob/main/csharp-101/01-Hello%20World.ipynb)\n",
272 | ">\n",
273 | "> [观看教学视频](https://www.youtube.com/watch?v=JSpC7Cz64h0&list=PLdo4fOcmZ0oVxKLQCHpiUWun7vlJJvUiN&index=3)\n",
274 | ">\n",
275 | "> [文档:C# 介绍](https://aka.ms/CSTutorials.HelloWorld)\n",
276 | ">\n",
277 | "> [从头学起: 什么是 C# ?](https://www.youtube.com/watch?v=BM4CHBmAPh4&list=PLdo4fOcmZ0oVxKLQCHpiUWun7vlJJvUiN&index=1)"
278 | ]
279 | },
280 | {
281 | "cell_type": "markdown",
282 | "metadata": {},
283 | "source": [
284 | "# **其他资源**\n",
285 | "\n",
286 | "你可以从以下链接中获取\n",
287 | "> [其他 101 系列的教学视频](https://aka.ms/Videos.dotNET)\n",
288 | ">\n",
289 | "> [Microsoft Learn](https://aka.ms/Learn.dotNET)\n",
290 | ">\n",
291 | "> [C# 文档](https://aka.ms/Docs.CSharp)"
292 | ]
293 | }
294 | ],
295 | "metadata": {
296 | "kernelspec": {
297 | "display_name": ".NET (C#)",
298 | "language": "C#",
299 | "name": ".net-csharp"
300 | },
301 | "language_info": {
302 | "file_extension": ".cs",
303 | "mimetype": "text/x-csharp",
304 | "name": "C#",
305 | "pygments_lexer": "csharp",
306 | "version": "8.0"
307 | }
308 | },
309 | "nbformat": 4,
310 | "nbformat_minor": 4
311 | }
312 |
--------------------------------------------------------------------------------
/csharp-101/04-Numbers and Integer Math.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# **整型介绍**\n",
8 | "\n",
9 | "观看该模块的教学视频 [C# 101 video] (https://www.youtube.com/watch?v=jEE0pWTq54U&list=PLdo4fOcmZ0oVxKLQCHpiUWun7vlJJvUiN&index=5)."
10 | ]
11 | },
12 | {
13 | "cell_type": "markdown",
14 | "metadata": {},
15 | "source": [
16 | "## **整型计算**\n",
17 | "\n",
18 | "您在下面定义了一些“整数”。 “整数”是正整数或负整数。\n",
19 | "> 在运行代码之前,c 应该是什么?"
20 | ]
21 | },
22 | {
23 | "cell_type": "markdown",
24 | "metadata": {},
25 | "source": [
26 | "## **加法**"
27 | ]
28 | },
29 | {
30 | "cell_type": "code",
31 | "execution_count": null,
32 | "metadata": {
33 | "dotnet_interactive": {
34 | "language": "csharp"
35 | },
36 | "vscode": {
37 | "languageId": "dotnet-interactive.csharp"
38 | }
39 | },
40 | "outputs": [
41 | {
42 | "name": "stdout",
43 | "output_type": "stream",
44 | "text": [
45 | "24\r\n"
46 | ]
47 | }
48 | ],
49 | "source": [
50 | "int a = 18;\n",
51 | "int b = 6;\n",
52 | "int c = a + b;\n",
53 | "Console.WriteLine(c);"
54 | ]
55 | },
56 | {
57 | "cell_type": "markdown",
58 | "metadata": {},
59 | "source": [
60 | "## **减法**"
61 | ]
62 | },
63 | {
64 | "cell_type": "code",
65 | "execution_count": null,
66 | "metadata": {
67 | "dotnet_interactive": {
68 | "language": "csharp"
69 | },
70 | "vscode": {
71 | "languageId": "dotnet-interactive.csharp"
72 | }
73 | },
74 | "outputs": [
75 | {
76 | "name": "stdout",
77 | "output_type": "stream",
78 | "text": [
79 | "12\r\n"
80 | ]
81 | }
82 | ],
83 | "source": [
84 | "int c = a - b;\n",
85 | "Console.WriteLine(c);"
86 | ]
87 | },
88 | {
89 | "cell_type": "markdown",
90 | "metadata": {},
91 | "source": [
92 | "## **乘法**"
93 | ]
94 | },
95 | {
96 | "cell_type": "code",
97 | "execution_count": null,
98 | "metadata": {
99 | "dotnet_interactive": {
100 | "language": "csharp"
101 | },
102 | "vscode": {
103 | "languageId": "dotnet-interactive.csharp"
104 | }
105 | },
106 | "outputs": [
107 | {
108 | "name": "stdout",
109 | "output_type": "stream",
110 | "text": [
111 | "108\r\n"
112 | ]
113 | }
114 | ],
115 | "source": [
116 | "int c = a * b;\n",
117 | "Console.WriteLine(c);"
118 | ]
119 | },
120 | {
121 | "cell_type": "markdown",
122 | "metadata": {},
123 | "source": [
124 | "## **除法**"
125 | ]
126 | },
127 | {
128 | "cell_type": "code",
129 | "execution_count": null,
130 | "metadata": {
131 | "dotnet_interactive": {
132 | "language": "csharp"
133 | },
134 | "vscode": {
135 | "languageId": "dotnet-interactive.csharp"
136 | }
137 | },
138 | "outputs": [
139 | {
140 | "name": "stdout",
141 | "output_type": "stream",
142 | "text": [
143 | "3\r\n"
144 | ]
145 | }
146 | ],
147 | "source": [
148 | "int c = a / b;\n",
149 | "Console.WriteLine(c);"
150 | ]
151 | },
152 | {
153 | "cell_type": "markdown",
154 | "metadata": {},
155 | "source": [
156 | "# **运算顺序**\n",
157 | "\n",
158 | "C# 在数学方面遵循运算顺序。 也就是说,先乘除后加减。\n",
159 | "> 如果 C# 不遵循运算顺序,而是从左到右进行数学运算,计算会是什么结果呢?"
160 | ]
161 | },
162 | {
163 | "cell_type": "code",
164 | "execution_count": null,
165 | "metadata": {
166 | "dotnet_interactive": {
167 | "language": "csharp"
168 | },
169 | "vscode": {
170 | "languageId": "dotnet-interactive.csharp"
171 | }
172 | },
173 | "outputs": [
174 | {
175 | "name": "stdout",
176 | "output_type": "stream",
177 | "text": [
178 | "13\r\n"
179 | ]
180 | }
181 | ],
182 | "source": [
183 | "int a = 5;\n",
184 | "int b = 4;\n",
185 | "int c = 2;\n",
186 | "int d = a + b * c;\n",
187 | "Console.WriteLine(d);"
188 | ]
189 | },
190 | {
191 | "cell_type": "markdown",
192 | "metadata": {},
193 | "source": [
194 | "## **使用括号**\n",
195 | "\n",
196 | "您还可以通过将括号括在您想要先完成的任何事情上来强制执行不同的顺序\n",
197 | "> 试试看"
198 | ]
199 | },
200 | {
201 | "cell_type": "code",
202 | "execution_count": null,
203 | "metadata": {
204 | "dotnet_interactive": {
205 | "language": "csharp"
206 | },
207 | "vscode": {
208 | "languageId": "dotnet-interactive.csharp"
209 | }
210 | },
211 | "outputs": [
212 | {
213 | "name": "stdout",
214 | "output_type": "stream",
215 | "text": [
216 | "18\r\n"
217 | ]
218 | }
219 | ],
220 | "source": [
221 | "int d = (a + b) * c;\n",
222 | "Console.WriteLine(d);"
223 | ]
224 | },
225 | {
226 | "cell_type": "markdown",
227 | "metadata": {},
228 | "source": [
229 | "您可以根据需要使计算变得既长又复杂。\n",
230 | "> 你能让这条公式更复杂吗?"
231 | ]
232 | },
233 | {
234 | "cell_type": "code",
235 | "execution_count": null,
236 | "metadata": {
237 | "dotnet_interactive": {
238 | "language": "csharp"
239 | },
240 | "vscode": {
241 | "languageId": "dotnet-interactive.csharp"
242 | }
243 | },
244 | "outputs": [
245 | {
246 | "name": "stdout",
247 | "output_type": "stream",
248 | "text": [
249 | "25\r\n"
250 | ]
251 | }
252 | ],
253 | "source": [
254 | "int d = (a + b) - 6 * c + (12 * 4) / 3 + 12;\n",
255 | "Console.WriteLine(d);"
256 | ]
257 | },
258 | {
259 | "cell_type": "markdown",
260 | "metadata": {},
261 | "source": [
262 | "## **全部整型计算结果还是整型**\n",
263 | "\n",
264 | "整型数学将始终产生整型。 这意味着即使计算中应该产生小数或分数,答案也会被截断为整数。\n",
265 | "> 看看下面真正的答案是什么?"
266 | ]
267 | },
268 | {
269 | "cell_type": "code",
270 | "execution_count": null,
271 | "metadata": {
272 | "dotnet_interactive": {
273 | "language": "csharp"
274 | },
275 | "vscode": {
276 | "languageId": "dotnet-interactive.csharp"
277 | }
278 | },
279 | "outputs": [
280 | {
281 | "name": "stdout",
282 | "output_type": "stream",
283 | "text": [
284 | "3\r\n"
285 | ]
286 | }
287 | ],
288 | "source": [
289 | "int a = 7;\n",
290 | "int b = 4;\n",
291 | "int c = 3;\n",
292 | "int d = (a + b) / c;\n",
293 | "Console.WriteLine(d);"
294 | ]
295 | },
296 | {
297 | "cell_type": "markdown",
298 | "metadata": {},
299 | "source": [
300 | "# **Playground:动动手**\n",
301 | "\n",
302 | "> 你有任何需要数学的家庭作业或项目吗? 尝试使用代码代替计算器!\n",
303 | ">\n",
304 | "> 整型如何舍入? \n",
305 | ">\n",
306 | "> 操作顺序如何运作? "
307 | ]
308 | },
309 | {
310 | "cell_type": "code",
311 | "execution_count": null,
312 | "metadata": {
313 | "dotnet_interactive": {
314 | "language": "csharp"
315 | },
316 | "vscode": {
317 | "languageId": "dotnet-interactive.csharp"
318 | }
319 | },
320 | "outputs": [
321 | {
322 | "name": "stdout",
323 | "output_type": "stream",
324 | "text": [
325 | "Playground\r\n"
326 | ]
327 | }
328 | ],
329 | "source": [
330 | "Console.WriteLine(\"Playground\");"
331 | ]
332 | },
333 | {
334 | "cell_type": "markdown",
335 | "metadata": {},
336 | "source": [
337 | "# **进阶学习**\n",
338 | "\n",
339 | "有非常多的资源给大家学习,不要错过!\n",
340 | "> [⏩ 下一个学习模块 - 双精度类型介绍](https://github.com/kinfey/csharp-notebooks/blob/main/csharp-101/05-Numbers%20and%20Integer%20Precision.ipynb)\n",
341 | ">\n",
342 | "> [⏪ 上一个学习模块 - 查找字符串](https://github.com/kinfey/csharp-notebooks/blob/main/csharp-101/03-Searching%20Strings.ipynb)\n",
343 | ">\n",
344 | "> [观看教学视频](https://www.youtube.com/watch?v=jEE0pWTq54U&list=PLdo4fOcmZ0oVxKLQCHpiUWun7vlJJvUiN&index=5)\n",
345 | ">\n",
346 | "> [文档: C# 整数和浮点数](https://aka.ms/CSharp.Numbers)\n",
347 | ">\n",
348 | "> [从头学起: 什么是 C# ?](https://www.youtube.com/watch?v=BM4CHBmAPh4&list=PLdo4fOcmZ0oVxKLQCHpiUWun7vlJJvUiN&index=1)"
349 | ]
350 | },
351 | {
352 | "cell_type": "markdown",
353 | "metadata": {},
354 | "source": [
355 | "# **其他资源**\n",
356 | "\n",
357 | "你可以从以下链接中获取\n",
358 | "> [其他 101 系列的教学视频](https://aka.ms/Videos.dotNET)\n",
359 | ">\n",
360 | "> [Microsoft Learn](https://aka.ms/Learn.dotNET)\n",
361 | ">\n",
362 | "> [C# 文档](https://aka.ms/Docs.CSharp)"
363 | ]
364 | }
365 | ],
366 | "metadata": {
367 | "kernelspec": {
368 | "display_name": ".NET (C#)",
369 | "language": "C#",
370 | "name": ".net-csharp"
371 | },
372 | "language_info": {
373 | "file_extension": ".cs",
374 | "mimetype": "text/x-csharp",
375 | "name": "C#",
376 | "pygments_lexer": "csharp",
377 | "version": "8.0"
378 | }
379 | },
380 | "nbformat": 4,
381 | "nbformat_minor": 4
382 | }
383 |
--------------------------------------------------------------------------------
/csharp-101/05-Numbers and Integer Precision.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# **双精度类型介绍**\n",
8 | "\n",
9 | "观看该模块的教学视频 [C# 101 video](https://www.youtube.com/watch?v=31EmPADtv4w&list=PLdo4fOcmZ0oVxKLQCHpiUWun7vlJJvUiN&index=6) \n",
10 | "\n",
11 | "就像您在上一个模块中学到的那样,在使用整数进行数学运算时,您只会得到整数,没有小数或分数。 这些数字被“truncated截断”,这只是意味着剩余部分被截断。 您可以使用余数运算符 `%` 找到余数。 余数是除法问题的剩余量。\n",
12 | "> 让我们试试吧!"
13 | ]
14 | },
15 | {
16 | "cell_type": "code",
17 | "execution_count": null,
18 | "metadata": {
19 | "dotnet_interactive": {
20 | "language": "csharp"
21 | },
22 | "vscode": {
23 | "languageId": "dotnet-interactive.csharp"
24 | }
25 | },
26 | "outputs": [
27 | {
28 | "name": "stdout",
29 | "output_type": "stream",
30 | "text": [
31 | "quotient: 3\r\n",
32 | "remainder: 2\r\n"
33 | ]
34 | }
35 | ],
36 | "source": [
37 | "int a = 7;\n",
38 | "int b = 4;\n",
39 | "int c = 3;\n",
40 | "int d = (a + b) / c;\n",
41 | "int e = (a + b) % c;\n",
42 | "Console.WriteLine($\"quotient: {d}\");\n",
43 | "Console.WriteLine($\"remainder: {e}\");"
44 | ]
45 | },
46 | {
47 | "cell_type": "markdown",
48 | "metadata": {},
49 | "source": [
50 | "3 是商,2 是余数\n",
51 | "\n",
52 | "## **最小和最大整型大小**\n",
53 | "\n",
54 | "由于整型在编码中的结构方式,它们的大小是有限制的。\n",
55 | "> 通过运行以下代码找出结果!"
56 | ]
57 | },
58 | {
59 | "cell_type": "code",
60 | "execution_count": null,
61 | "metadata": {
62 | "dotnet_interactive": {
63 | "language": "csharp"
64 | },
65 | "vscode": {
66 | "languageId": "dotnet-interactive.csharp"
67 | }
68 | },
69 | "outputs": [
70 | {
71 | "name": "stdout",
72 | "output_type": "stream",
73 | "text": [
74 | "The range of integers is -2147483648 to 2147483647\r\n"
75 | ]
76 | }
77 | ],
78 | "source": [
79 | "int max = int.MaxValue;\n",
80 | "int min = int.MinValue;\n",
81 | "Console.WriteLine($\"The range of integers is {min} to {max}\");"
82 | ]
83 | },
84 | {
85 | "cell_type": "markdown",
86 | "metadata": {},
87 | "source": [
88 | "这仍然是一个很大的范围!\n",
89 | "> 但是如果你试图超越会发生什么?"
90 | ]
91 | },
92 | {
93 | "cell_type": "code",
94 | "execution_count": null,
95 | "metadata": {
96 | "dotnet_interactive": {
97 | "language": "csharp"
98 | },
99 | "vscode": {
100 | "languageId": "dotnet-interactive.csharp"
101 | }
102 | },
103 | "outputs": [
104 | {
105 | "name": "stdout",
106 | "output_type": "stream",
107 | "text": [
108 | "An example of overflow: -2147483646\r\n"
109 | ]
110 | }
111 | ],
112 | "source": [
113 | "int what = max + 3;\n",
114 | "Console.WriteLine($\"An example of overflow: {what}\");"
115 | ]
116 | },
117 | {
118 | "cell_type": "markdown",
119 | "metadata": {},
120 | "source": [
121 | "这个本该很大的数字,现在已经接近最小值了! 这是因为“溢出”“包裹”,回到最小值,然后继续计数。\n",
122 | "\n",
123 | "## **Double 类型**\n",
124 | "\n",
125 | "Double 是数字表达的另一种类型。 他们可以保持浮点数。\n",
126 | "> 从头开始重复相同的代码,看看 double 的不同之处。"
127 | ]
128 | },
129 | {
130 | "cell_type": "code",
131 | "execution_count": null,
132 | "metadata": {
133 | "dotnet_interactive": {
134 | "language": "csharp"
135 | },
136 | "vscode": {
137 | "languageId": "dotnet-interactive.csharp"
138 | }
139 | },
140 | "outputs": [
141 | {
142 | "name": "stdout",
143 | "output_type": "stream",
144 | "text": [
145 | "3.6666666666666665\r\n"
146 | ]
147 | }
148 | ],
149 | "source": [
150 | "double a = 7;\n",
151 | "double b = 4;\n",
152 | "double c = 3;\n",
153 | "double d = (a + b) / c;\n",
154 | "Console.WriteLine(d);"
155 | ]
156 | },
157 | {
158 | "cell_type": "markdown",
159 | "metadata": {},
160 | "source": [
161 | "> 这里有一个更复杂的表达式可以尝试:"
162 | ]
163 | },
164 | {
165 | "cell_type": "code",
166 | "execution_count": null,
167 | "metadata": {
168 | "dotnet_interactive": {
169 | "language": "csharp"
170 | },
171 | "vscode": {
172 | "languageId": "dotnet-interactive.csharp"
173 | }
174 | },
175 | "outputs": [
176 | {
177 | "name": "stdout",
178 | "output_type": "stream",
179 | "text": [
180 | "5.25\r\n"
181 | ]
182 | }
183 | ],
184 | "source": [
185 | "double a = 19;\n",
186 | "double b = 23;\n",
187 | "double c = 8;\n",
188 | "double d = (a + b) / c;\n",
189 | "Console.WriteLine(d);"
190 | ]
191 | },
192 | {
193 | "cell_type": "markdown",
194 | "metadata": {},
195 | "source": [
196 | "> 找出 double 的范围:"
197 | ]
198 | },
199 | {
200 | "cell_type": "code",
201 | "execution_count": null,
202 | "metadata": {
203 | "dotnet_interactive": {
204 | "language": "csharp"
205 | },
206 | "vscode": {
207 | "languageId": "dotnet-interactive.csharp"
208 | }
209 | },
210 | "outputs": [
211 | {
212 | "name": "stdout",
213 | "output_type": "stream",
214 | "text": [
215 | "The range of double is -1.7976931348623157E+308 to 1.7976931348623157E+308\r\n"
216 | ]
217 | }
218 | ],
219 | "source": [
220 | "double max = double.MaxValue;\n",
221 | "double min = double.MinValue;\n",
222 | "Console.WriteLine($\"The range of double is {min} to {max}\");"
223 | ]
224 | },
225 | {
226 | "cell_type": "markdown",
227 | "metadata": {},
228 | "source": [
229 | "这是相当大的! 比整型大得多。\n",
230 | "\n",
231 | "当然,double 并不完美。 他们也有四舍五入的错误。\n",
232 | "> 看看这个四舍五入:"
233 | ]
234 | },
235 | {
236 | "cell_type": "code",
237 | "execution_count": null,
238 | "metadata": {
239 | "dotnet_interactive": {
240 | "language": "csharp"
241 | },
242 | "vscode": {
243 | "languageId": "dotnet-interactive.csharp"
244 | }
245 | },
246 | "outputs": [
247 | {
248 | "name": "stdout",
249 | "output_type": "stream",
250 | "text": [
251 | "0.3333333333333333\r\n"
252 | ]
253 | }
254 | ],
255 | "source": [
256 | "double third = 1.0 / 3.0;\n",
257 | "Console.WriteLine(third);"
258 | ]
259 | },
260 | {
261 | "cell_type": "markdown",
262 | "metadata": {},
263 | "source": [
264 | "从技术上讲,转换为十进制的 1/3 应该是 3 无限重复,但这在编码中不实用。 不过,如果您正在处理极其精确的变量,请注意这一点。"
265 | ]
266 | },
267 | {
268 | "cell_type": "markdown",
269 | "metadata": {},
270 | "source": [
271 | "# **Playground:动动手**\n",
272 | "\n",
273 | "\n",
274 | "> 有需要做数学的作业或项目吗? 尝试使用代码代替计算器。\n",
275 | ">\n",
276 | "> 月球距离地球 238,855 英里。 如果您在编码问题中使用到月球的距离,您需要使用整型还是 double 型? 如果你用英寸来测量呢? 太阳呢? 它距离我们 92,955,828 英里。\n",
277 | ">\n",
278 | "> 如何用混合分数格式打印出除法问题?"
279 | ]
280 | },
281 | {
282 | "cell_type": "code",
283 | "execution_count": null,
284 | "metadata": {
285 | "dotnet_interactive": {
286 | "language": "csharp"
287 | },
288 | "vscode": {
289 | "languageId": "dotnet-interactive.csharp"
290 | }
291 | },
292 | "outputs": [
293 | {
294 | "name": "stdout",
295 | "output_type": "stream",
296 | "text": [
297 | "Playground\r\n"
298 | ]
299 | }
300 | ],
301 | "source": [
302 | "Console.WriteLine(\"Playground\");"
303 | ]
304 | },
305 | {
306 | "cell_type": "markdown",
307 | "metadata": {},
308 | "source": [
309 | "# **进阶学习**\n",
310 | "\n",
311 | "> [⏩ 下一个学习模块 - 小数类型介绍](https://github.com/kinfey/csharp-notebooks/blob/main/csharp-101/06-Numbers%20and%20Decimals.ipynb)\n",
312 | ">\n",
313 | "> [⏪ 上一个学习模块 - 整型介绍](https://github.com/kinfey/csharp-notebooks/blob/main/csharp-101/04-Numbers%20and%20Integer%20Math.ipynb)\n",
314 | ">\n",
315 | "> [观看教学视频](https://www.youtube.com/watch?v=jEE0pWTq54U&list=PLdo4fOcmZ0oVxKLQCHpiUWun7vlJJvUiN&index=5)\n",
316 | ">\n",
317 | "> [文档: C# 整数和浮点数](https://aka.ms/CSharp.Numbers)\n",
318 | ">\n",
319 | "> [从头学起: 什么是 C# ?](https://www.youtube.com/watch?v=BM4CHBmAPh4&list=PLdo4fOcmZ0oVxKLQCHpiUWun7vlJJvUiN&index=1)"
320 | ]
321 | },
322 | {
323 | "cell_type": "markdown",
324 | "metadata": {},
325 | "source": [
326 | "# **其他资源**\n",
327 | "\n",
328 | "你可以从以下链接中获取\n",
329 | "> [其他 101 系列的教学视频](https://aka.ms/Videos.dotNET)\n",
330 | ">\n",
331 | "> [Microsoft Learn](https://aka.ms/Learn.dotNET)\n",
332 | ">\n",
333 | "> [C# 文档](https://aka.ms/Docs.CSharp)"
334 | ]
335 | }
336 | ],
337 | "metadata": {
338 | "kernelspec": {
339 | "display_name": ".NET (C#)",
340 | "language": "C#",
341 | "name": ".net-csharp"
342 | },
343 | "language_info": {
344 | "file_extension": ".cs",
345 | "mimetype": "text/x-csharp",
346 | "name": "C#",
347 | "pygments_lexer": "csharp",
348 | "version": "8.0"
349 | }
350 | },
351 | "nbformat": 4,
352 | "nbformat_minor": 4
353 | }
354 |
--------------------------------------------------------------------------------
/csharp-101/10-Arrays, Lists, and Collections.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# **数组、列表和集合**\n",
8 | "\n",
9 | "观看该模块的教学视频 [C# 101 video](https://www.youtube.com/watch?v=qLeF_wpnVto&list=PLdo4fOcmZ0oVxKLQCHpiUWun7vlJJvUiN&index=12) "
10 | ]
11 | },
12 | {
13 | "cell_type": "markdown",
14 | "metadata": {},
15 | "source": [
16 | "数组、列表和集合非常有用。 尝试查看列表:\n",
17 | "> 运行以下代码。 它打印出您的预期吗?"
18 | ]
19 | },
20 | {
21 | "cell_type": "code",
22 | "execution_count": null,
23 | "metadata": {
24 | "dotnet_interactive": {
25 | "language": "csharp"
26 | },
27 | "vscode": {
28 | "languageId": "dotnet-interactive.csharp"
29 | }
30 | },
31 | "outputs": [
32 | {
33 | "name": "stdout",
34 | "output_type": "stream",
35 | "text": [
36 | "Hello !\r\n",
37 | "Hello ANA!\r\n",
38 | "Hello FELIPE!\r\n"
39 | ]
40 | }
41 | ],
42 | "source": [
43 | "using System;\n",
44 | "using System.Collections.Generic;\n",
45 | "\n",
46 | "var names = new List { \"\", \"Ana\", \"Felipe\" };\n",
47 | "foreach (var name in names)\n",
48 | "{\n",
49 | " Console.WriteLine($\"Hello {name.ToUpper()}!\");\n",
50 | "}"
51 | ]
52 | },
53 | {
54 | "cell_type": "markdown",
55 | "metadata": {},
56 | "source": [
57 | "## **那么这段代码是什么意思呢?**\n",
58 | "\n",
59 | "- **System.collections.Generic**:这是一个包含列表的命名空间。 如果您不告诉代码您正在使用它,则每次要使用列表时都必须写“Systems.Collections.Generic.List”。 这节省了一些打字!\n",
60 | "- **var**:当你有一个变量时你设定的,但不关心变量类型是什么。\n",
61 | "- **List**:这意味着您正在制作一个字符串列表。 代替 `string`,您可以放入 `int`、`double` 或任何其他变量。\n",
62 | "- **foreach**:这是另一个 for 循环! 它遍历列表中的每个项目。\n",
63 | "- **名字中的名字**:这是很多人喜欢的风格。 `names` 是包含复数名称的整个列表。 `name` 是 `names` 中的一个单独的项目。"
64 | ]
65 | },
66 | {
67 | "cell_type": "markdown",
68 | "metadata": {},
69 | "source": [
70 | "## **替代方法**\n",
71 | "\n",
72 | "前面的代码比下面的代码更易于人类阅读,但下面的代码有一些更容易识别的代码。\n",
73 | "这些实际上只是编写相同代码的两种不同风格。 你可以选择你更为习惯的方式\n",
74 | "> 运行以下代码。\n",
75 | ">\n",
76 | "> 你能在两种不同的方法之间识别出相似的代码部分吗?\n",
77 | ">\n",
78 | "> 你更喜欢哪种方法?"
79 | ]
80 | },
81 | {
82 | "cell_type": "code",
83 | "execution_count": null,
84 | "metadata": {
85 | "dotnet_interactive": {
86 | "language": "csharp"
87 | },
88 | "vscode": {
89 | "languageId": "dotnet-interactive.csharp"
90 | }
91 | },
92 | "outputs": [
93 | {
94 | "name": "stdout",
95 | "output_type": "stream",
96 | "text": [
97 | "Hello \r\n",
98 | "Hello ANA\r\n",
99 | "Hello FELIPE\r\n"
100 | ]
101 | }
102 | ],
103 | "source": [
104 | "using System;\n",
105 | "using System.Collections.Generic;\n",
106 | "\n",
107 | "var names = new List { \"\", \"Ana\", \"Felipe\" };\n",
108 | "for (int i = 0;i < names.Count; i++)\n",
109 | "{\n",
110 | " Console.WriteLine($\"Hello {names[i].ToUpper()}\");\n",
111 | "}"
112 | ]
113 | },
114 | {
115 | "cell_type": "markdown",
116 | "metadata": {},
117 | "source": [
118 | "## **添加**\n",
119 | "\n",
120 | "您可以很容易地将名称添加到列表中。 列表有方法 `Add()`,它将一个新项目添加到列表的末尾。\n",
121 | "> 运行代码。\n",
122 | ">\n",
123 | "> 然后尝试添加您自己的名字。"
124 | ]
125 | },
126 | {
127 | "cell_type": "code",
128 | "execution_count": null,
129 | "metadata": {
130 | "dotnet_interactive": {
131 | "language": "csharp"
132 | },
133 | "vscode": {
134 | "languageId": "dotnet-interactive.csharp"
135 | }
136 | },
137 | "outputs": [
138 | {
139 | "name": "stdout",
140 | "output_type": "stream",
141 | "text": [
142 | "Hello !\r\n",
143 | "Hello ANA!\r\n",
144 | "Hello FELIPE!\r\n",
145 | "Hello SOPHIA!\r\n"
146 | ]
147 | }
148 | ],
149 | "source": [
150 | "var names = new List { \"\", \"Ana\", \"Felipe\" };\n",
151 | "\n",
152 | "names.Add(\"Sophia\");\n",
153 | "\n",
154 | "foreach (var name in names)\n",
155 | "{\n",
156 | " Console.WriteLine($\"Hello {name.ToUpper()}!\");\n",
157 | "}"
158 | ]
159 | },
160 | {
161 | "cell_type": "markdown",
162 | "metadata": {},
163 | "source": [
164 | "## **移除**\n",
165 | "\n",
166 | "您还可以删除名称。 试试看:\n",
167 | "\n",
168 | "> 运行代码。\n",
169 | ">\n",
170 | "> 然后选择要删除的名称。\n",
171 | ">\n",
172 | "> 当您尝试删除不存在的东西时会发生什么?"
173 | ]
174 | },
175 | {
176 | "cell_type": "code",
177 | "execution_count": null,
178 | "metadata": {
179 | "dotnet_interactive": {
180 | "language": "csharp"
181 | },
182 | "vscode": {
183 | "languageId": "dotnet-interactive.csharp"
184 | }
185 | },
186 | "outputs": [
187 | {
188 | "name": "stdout",
189 | "output_type": "stream",
190 | "text": [
191 | "Hello ANA\r\n",
192 | "Hello FELIPE\r\n"
193 | ]
194 | }
195 | ],
196 | "source": [
197 | "var names = new List { \"\", \"Ana\", \"Felipe\" };\n",
198 | "\n",
199 | "names.Remove(\"\");\n",
200 | "\n",
201 | "for (int i = 0;i < names.Count; i++)\n",
202 | "{\n",
203 | " Console.WriteLine($\"Hello {names[i].ToUpper()}\");\n",
204 | "}"
205 | ]
206 | },
207 | {
208 | "cell_type": "markdown",
209 | "metadata": {},
210 | "source": [
211 | "## **打印特定项目**\n",
212 | "\n",
213 | "如果您不想打印所有怎么办? 如果你只想打印一个怎么办? 这就是括号的用武之地。\n",
214 | "> 运行代码。\n",
215 | ">\n",
216 | "> 尝试打印列表中的不同位置。\n",
217 | ">\n",
218 | "> 您需要 0 还是 1 来打印列表中的第一项?"
219 | ]
220 | },
221 | {
222 | "cell_type": "code",
223 | "execution_count": null,
224 | "metadata": {
225 | "dotnet_interactive": {
226 | "language": "csharp"
227 | },
228 | "vscode": {
229 | "languageId": "dotnet-interactive.csharp"
230 | }
231 | },
232 | "outputs": [
233 | {
234 | "name": "stdout",
235 | "output_type": "stream",
236 | "text": [
237 | "Sophia\r\n"
238 | ]
239 | }
240 | ],
241 | "source": [
242 | "var names = new List { \"\", \"Sophia\", \"Felipe\" };\n",
243 | "Console.WriteLine(names[1]);"
244 | ]
245 | },
246 | {
247 | "cell_type": "markdown",
248 | "metadata": {},
249 | "source": [
250 | "Don't forget that lists are \"0\" based. The first spot is the \"0th\" spot."
251 | ]
252 | },
253 | {
254 | "cell_type": "markdown",
255 | "metadata": {},
256 | "source": [
257 | "# **Playground:动动手**\n",
258 | "\n",
259 | "> 列出您需要的杂货清单,称为“groceries”。\n",
260 | ">\n",
261 | "> 你能打印出“buy\\!”吗? 每个项目?\n",
262 | ">\n",
263 | "> 清单的第三项是什么? 这和“groceries[3]”一样吗?\n",
264 | ">\n",
265 | "> 添加“牙膏”。\n",
266 | ">\n",
267 | "> 删除您最不喜欢的项目。\n",
268 | ">\n",
269 | "> 现在名单上的第三个是什么?"
270 | ]
271 | },
272 | {
273 | "cell_type": "code",
274 | "execution_count": null,
275 | "metadata": {
276 | "dotnet_interactive": {
277 | "language": "csharp"
278 | },
279 | "vscode": {
280 | "languageId": "dotnet-interactive.csharp"
281 | }
282 | },
283 | "outputs": [
284 | {
285 | "name": "stdout",
286 | "output_type": "stream",
287 | "text": [
288 | "Playground\r\n"
289 | ]
290 | }
291 | ],
292 | "source": [
293 | "Console.WriteLine(\"Playground\");"
294 | ]
295 | },
296 | {
297 | "cell_type": "markdown",
298 | "metadata": {},
299 | "source": [
300 | "# **进阶学习**\n",
301 | "\n",
302 | "> [⏩ 下一个学习模块 - 搜索、排序和索引列表](https://github.com/kinfey/csharp-notebooks/blob/main/csharp-101/11-%20Search%2C%20Sort%2C%20and%20Index%20Lists.ipynb)\n",
303 | ">\n",
304 | "> [⏪ 上一个学习模块 - 分支和循环结合](https://github.com/kinfey/csharp-notebooks/blob/main/csharp-101/09-Combining%20Branches%20and%20Loops.ipynb)\n",
305 | ">\n",
306 | "> [观看视频](https://www.youtube.com/watch?v=qLeF_wpnVto&list=PLdo4fOcmZ0oVxKLQCHpiUWun7vlJJvUiN&index=12)\n",
307 | ">\n",
308 | "> [文档: 数组、列表和集合](https://aka.ms/CSharp.List)\n",
309 | ">\n",
310 | "> [从头学起: 什么是 C# ?](https://www.youtube.com/watch?v=BM4CHBmAPh4&list=PLdo4fOcmZ0oVxKLQCHpiUWun7vlJJvUiN&index=1)"
311 | ]
312 | },
313 | {
314 | "cell_type": "markdown",
315 | "metadata": {},
316 | "source": [
317 | "# **其他资源**\n",
318 | "\n",
319 | "你可以从以下链接中获取\n",
320 | "> [其他 101 系列的教学视频](https://aka.ms/Videos.dotNET)\n",
321 | ">\n",
322 | "> [Microsoft Learn](https://aka.ms/Learn.dotNET)\n",
323 | ">\n",
324 | "> [C# 文档](https://aka.ms/Docs.CSharp)"
325 | ]
326 | }
327 | ],
328 | "metadata": {
329 | "kernelspec": {
330 | "display_name": ".NET (C#)",
331 | "language": "C#",
332 | "name": ".net-csharp"
333 | },
334 | "language_info": {
335 | "file_extension": ".cs",
336 | "mimetype": "text/x-csharp",
337 | "name": "C#",
338 | "pygments_lexer": "csharp",
339 | "version": "8.0"
340 | }
341 | },
342 | "nbformat": 4,
343 | "nbformat_minor": 4
344 | }
345 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # **.NET Interactive Notebooks for C#**
2 |
3 | 欢迎来到 .NET interactive notebooks for C# , 这是全新的 C# 学习体验。
4 |
5 | ## **环境安装**
6 |
7 | ### **VS Code**
8 | 1. 下载 .NET Coding Pack for VS Code for [Windows](https://aka.ms/dotnet-coding-pack-win) 或 [macOS](https://aka.ms/dotnet-coding-pack-mac).
9 | 2. 安装插件 [.NET Interactive Notebooks](https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.dotnet-interactive-vscode) extension.
10 |
11 | ### **Visual Studio**
12 | 1. 下载和安装 [Visual Studio 2022](https://visualstudio.microsoft.com/downloads/)
13 | 2. 下载和安装 [Notebook Editor Extension](https://marketplace.visualstudio.com/items?itemName=MLNET.notebook)
14 |
15 | 更多的信息和学习资源可以访问 [Learn to code C#](https://dotnet.microsoft.com/learntocode).
16 |
17 |
18 | ## **Notebooks 基础学习**
19 |
20 | | # | 主题 | GitHub 链接 |
21 | |---|-------------------------------|-----------------------|
22 | 1| Notebooks 介绍 | [01 Notebook 介绍](https://github.com/kinfey/csharp-notebooks/blob/main/notebook-getting-started/01-What%20are%20Notebooks.ipynb) |
23 | 2| Code Cells 介绍 | [02 Code Cells 介绍](https://github.com/kinfey/csharp-notebooks/blob/main/notebook-getting-started/02-Code%20Cells.ipynb) |
24 | 3| Markdown Cells 介绍 | [03 Markdown Cells 介绍](https://github.com/kinfey/csharp-notebooks/blob/main/notebook-getting-started/01-What%20are%20Notebooks.ipynb) |
25 | REF| VS Notebook 编辑器快捷键介绍 | [VS Notebook 编辑器快捷键](https://github.com/kinfey/csharp-notebooks/blob/main/notebook-getting-started/REF-VS%20Keyboard%20Shortcuts.ipynb) |
26 |
27 | ## **C# 101**
28 |
29 | 下载或 clone 此 repo 并在 VS Code 中打开 “csharp-101” 文件夹以开始使用 C# 101 相关 Notebooks 。 或者可以点击下面的 Notebook 的任意链接可以启动 VS Code 中打开它!
30 |
31 | | # | 主题 | Github 链接 | 视频链接 | 文档 |
32 | |---|-------------------------------|-----------------------|------------|---------------|
33 | 1 | Hello World | [01 Notebook](https://github.com/kinfey/csharp-notebooks/blob/main/csharp-101/01-Hello%20World.ipynb) | [01 Video](https://www.youtube.com/watch?v=KT2VR7m19So&list=PLdo4fOcmZ0oVxKLQCHpiUWun7vlJJvUiN&index=2) | [C# 介绍](https://aka.ms/CSharp.HelloWorld)
34 | 2 | 字符串基础 | [02 Notebook](https://github.com/kinfey/csharp-notebooks/blob/main/csharp-101/02-The%20Basics%20of%20Strings.ipynb) | [02 Video](https://www.youtube.com/watch?v=JSpC7Cz64h0&list=PLdo4fOcmZ0oVxKLQCHpiUWun7vlJJvUiN&index=3) | [C# 介绍](https://aka.ms/CSharp.HelloWorld)
35 | 3 | 查找字符串 | [03 Notebook](https://github.com/kinfey/csharp-notebooks/blob/main/csharp-101/03-Searching%20Strings.ipynb) | [03 Video](https://www.youtube.com/watch?v=JL30gSE3WaQ&list=PLdo4fOcmZ0oVxKLQCHpiUWun7vlJJvUiN&index=4) | [C# 介绍](https://aka.ms/CSharp.HelloWorld)
36 | 4 | 整型介绍 | [04 Notebook](https://github.com/kinfey/csharp-notebooks/blob/main/csharp-101/04-Numbers%20and%20Integer%20Math.ipynb) | [04 Video](https://www.youtube.com/watch?v=jEE0pWTq54U&list=PLdo4fOcmZ0oVxKLQCHpiUWun7vlJJvUiN&index=5) | [C# 中的数值类型](https://aka.ms/CSharp.Numbers)
37 | 5 | 双精度类型介绍 | [05 Notebook](https://github.com/kinfey/csharp-notebooks/blob/main/csharp-101/05-Numbers%20and%20Integer%20Precision.ipynb) | [05 Video](https://www.youtube.com/watch?v=31EmPADtv4w&list=PLdo4fOcmZ0oVxKLQCHpiUWun7vlJJvUiN&index=6) | [C# 中的数值类型](https://aka.ms/CSharp.Numbers)
38 | 6 | 小数类型介绍 | [06 Notebook](https://github.com/kinfey/csharp-notebooks/blob/main/csharp-101/06-Numbers%20and%20Decimals.ipynb) | [06 Video](https://www.youtube.com/watch?v=kdKcpF9roeU&list=PLdo4fOcmZ0oVxKLQCHpiUWun7vlJJvUiN&index=7) | [C# 中的数值类型](https://aka.ms/CSharp.Numbers)
39 | 7 | 分支 (条件语句) | [07 Notebook](https://github.com/kinfey/csharp-notebooks/blob/main/csharp-101/07-Branches%20(if).ipynb) | [07 Video](https://www.youtube.com/watch?v=y4OTe8LSokg&list=PLdo4fOcmZ0oVxKLQCHpiUWun7vlJJvUiN&index=8) | [C# 中的条件分支和循环](https://aka.ms/CSharp.IfAndLoop)
40 | 8 | 什么是循环? | [08 Notebook](https://github.com/kinfey/csharp-notebooks/blob/main/csharp-101/08-What%20Are%20Loops.ipynb) | [08 Video](https://www.youtube.com/watch?v=z31m5Up_gSQ&list=PLdo4fOcmZ0oVxKLQCHpiUWun7vlJJvUiN&index=10) | [C# 中的条件分支和循环](https://aka.ms/CSharp.IfAndLoop)
41 | 9 | 分支和循环结合 | [09 Notebook](https://github.com/kinfey/csharp-notebooks/blob/main/csharp-101/09-Combining%20Branches%20and%20Loops.ipynb) | [09 Video](https://www.youtube.com/watch?v=qK7tUpaOXi8&list=PLdo4fOcmZ0oVxKLQCHpiUWun7vlJJvUiN&index=11) | [C# 中的条件分支和循环](https://aka.ms/CSharp.IfAndLoop)
42 | 10 | 数组、列表和集合 | [10 Notebook](https://github.com/kinfey/csharp-notebooks/blob/main/csharp-101/10-Arrays%2C%20Lists%2C%20and%20Collections.ipynb) | [10 Video](https://www.youtube.com/watch?v=qLeF_wpnVto&list=PLdo4fOcmZ0oVxKLQCHpiUWun7vlJJvUiN&index=12) | [C# 中的数组、列表和集合](https://aka.ms/CSharp.List)
43 | 11 | 搜索、排序和索引列表 | [11 Notebook](https://github.com/kinfey/csharp-notebooks/blob/main/csharp-101/11-%20Search%2C%20Sort%2C%20and%20Index%20Lists.ipynb) | [11 Video](https://www.youtube.com/watch?v=NJ5ghiutzfY&list=PLdo4fOcmZ0oVxKLQCHpiUWun7vlJJvUiN&index=13) | [C# 中的数组、列表和集合](https://aka.ms/CSharp.List)
44 | 12 | 其他类型列表 | [12 Notebook](https://github.com/kinfey/csharp-notebooks/blob/main/csharp-101/12-Lists%20of%20Other%20Types.ipynb) | [12 Video](https://www.youtube.com/watch?v=oIQdb93xewE&list=PLdo4fOcmZ0oVxKLQCHpiUWun7vlJJvUiN&index=14) | [C# 中的数组、列表和集合](https://aka.ms/CSharp.List)
45 | 13 | 对象和类 | [13 Notebook](https://github.com/kinfey/csharp-notebooks/blob/main/csharp-101/13-Objects%20and%20Classes.ipynb)| [13 Video](https://www.youtube.com/watch?v=TzgxcAiHCWA&list=PLdo4fOcmZ0oVxKLQCHpiUWun7vlJJvUiN&index=16) | [C# 中的面向对象编程](https://aka.ms/CSharp.OO)
46 | 14 | 方法和成员 | [14 Notebook](https://github.com/kinfey/csharp-notebooks/blob/main/csharp-101/14-Methods%20and%20Members.ipynb) | [14 Video](https://www.youtube.com/watch?v=xLhm3bEG__c&list=PLdo4fOcmZ0oVxKLQCHpiUWun7vlJJvUiN&index=17) | [C# 中的面向对象编程](https://aka.ms/CSharp.OO)
47 | 15 | 方法和异常处理 | [15 Notebook](https://github.com/kinfey/csharp-notebooks/blob/main/csharp-101/15-Methods%20and%20Exceptions.ipynb) | [15 Video](https://www.youtube.com/watch?v=8YsoBBiVVzQ&list=PLdo4fOcmZ0oVxKLQCHpiUWun7vlJJvUiN&index=18) | [C# 中的面向对象编程](https://aka.ms/CSharp.OO)
48 |
49 | ## **机器学习**
50 |
51 | 下载或 Clone 此 repo 并在 Visual Studio 2022 中打开 “machine-learning” 文件夹以开始使用机器学习 Notebooks 。 或者可以点击下面的 Notebook 的任意链接可以启动 Visual Studio 中打开它!
52 |
53 | **需要 [Visual Studio 2022](https://visualstudio.microsoft.com/downloads/) 和 [Notebook 编辑器扩展](https://marketplace.visualstudio.com/items?itemName=MLNET.notebook) 0.3.4 或更高版本**
54 |
55 | ### **入门系列**
56 |
57 | | # | 主题 | VS Notebook 链接 | Github 链接 |
58 | |---|--------------------------------------------|------------------------------------------------|-------------|
59 | 1 | 机器学习介绍 | [01 Notebook](https://ntbk.io/ml-01-intro) | [01 Notebook](https://github.com/kinfey/csharp-notebooks/blob/main/machine-learning/01-Intro%20to%20Machine%20Learning.ipynb)
60 | 2 | 数据准备和特征工程 | [02 Notebook](https://ntbk.io/ml-02-data) | [02 Notebook](https://github.com/kinfey/csharp-notebooks/blob/main/machine-learning/02-Data%20Preparation%20and%20Feature%20Engineering.ipynb)
61 | 3 | 训练和 AutoML | [03 Notebook](https://ntbk.io/ml-03-training) | [03 Notebook](https://github.com/kinfey/csharp-notebooks/blob/main/machine-learning/03-Training%20and%20AutoML.ipynb)
62 | 4 | 模型评估 | [04 Notebook](https://ntbk.io/ml-04-evaluation)| [04 Notebook](https://github.com/kinfey/csharp-notebooks/blob/main/machine-learning/04-Model%20Evaluation.ipynb)
63 |
64 | ### **实战系列**
65 | | # | Topic | VS Notebook 链接 | Github 链接 |
66 | |---|--------------------------------------------|---------------------------------------------------------------------------|-------------|
67 | E2E | 使用 AutoML 进行分类 (鸢尾花数据集) | [Iris E2E AutoML](https://ntbk.io/ml-e2e-iris) | [Iris E2E AutoML](https://github.com/kinfey/csharp-notebooks/blob/main/machine-learning/E2E-Classification%20with%20Iris%20Dataset.ipynb)
68 | E2E | 使用回归进行预测 (Luna 数据集)| [Luna E2E Regression](https://ntbk.io/ml-e2e-luna-regression) | [Luna E2E Regression](https://github.com/kinfey/csharp-notebooks/blob/main/machine-learning/E2E-Forecasting%20using%20Regression%20with%20Luna%20Dataset.ipynb)
69 | E2E | 使用 SSA 进行预测 (Luna数据集) | [Luna E2E SSA](https://ntbk.io/ml-e2e-luna-ssa) | [Luna E2E SSA](https://github.com/kinfey/csharp-notebooks/blob/main/machine-learning/E2E-Forecasting%20using%20SSA%20with%20Luna%20Dataset.ipynb)
70 | E2E | 使用 AutoML 进行回归 (出租车数据集) | [Taxi E2E AutoML](https://ntbk.io/ml-e2e-taxi) | [Taxi E2E AutoML](https://github.com/kinfey/csharp-notebooks/blob/main/machine-learning/E2E-Regression%20with%20Taxi%20Dataset.ipynb)
71 | E2E | 文本分类 API (Yelp 数据集) | [Text Classification API](https://ntbk.io/ml-e2e-text-classification-api) | [Text Classification API](https://github.com/kinfey/csharp-notebooks/blob/main/machine-learning/E2E-Text-Classification-API-with-Yelp-Dataset.ipynb)
72 |
73 |
74 | ### **引用 Notebooks**
75 | | # | Topic | VS Notebook 链接 | Github 链接 |
76 | |---|--------------------------------------------|-------------------------------------------------------|-------------|
77 | REF | 使用 DataFrame 进行数据处理 |[Data Frame](https://ntbk.io/ml-ref-data-frame) | [Data Frame](https://github.com/kinfey/csharp-notebooks/blob/main/machine-learning/REF-Data%20Processing%20with%20DataFrame.ipynb)
78 | REF | 图表和可视化 |[Visualizations](https://ntbk.io/ml-ref-visualizations)| [Visualizations](https://github.com/kinfey/csharp-notebooks/blob/main/machine-learning/REF-Graphs%20and%20Visualizations.ipynb)
79 | REF | Kaggle 比赛 (Titanic 数据集) |[Kaggle](https://ntbk.io/ml-ref-kaggle-titanic) | [Kaggle](https://github.com/kinfey/csharp-notebooks/blob/main/machine-learning/REF-Kaggle%20with%20Titanic%20Dataset.ipynb)
80 |
81 | ## **.NET 基金会**
82 |
83 | .NET Interative Notebooks for C# 是一个 [.NET 基金会](https://www.dotnetfoundation.org/projects) 的项目.
84 |
85 | GitHub上有很多.NET相关的项目.
86 |
87 | - [.NET home repo](https://github.com/Microsoft/dotnet) - 来自 Microsoft 和社区的 100 个 .NET 项目的链接.
88 | - [ASP.NET Core home](https://docs.microsoft.com/zh-cn/aspnet/core/?view=aspnetcore-6.01) - 开始学习 ASP.NET Core 的最佳地点.
89 |
90 | 该项目采用了[贡献者公约](http://contributor-covenant.org/) 定义的行为准则,以阐明我们社区中的预期行为。 有关详细信息,请参阅 [.NET 基金会行为准则](http://www.dotnetfoundation.org/code-of-conduct)。
91 |
92 | ## **License**
93 |
94 | .NET(包括 csharp-notebooks 存储库)在 [MIT](LICENSE) 许可下获得许可。
95 |
--------------------------------------------------------------------------------
/csharp-101/13-Objects and Classes.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# **对象和类**\n",
8 | "\n",
9 | "观看该模块的教学视频 [C# 101 video](https://www.youtube.com/watch?v=TzgxcAiHCWA&list=PLdo4fOcmZ0oVxKLQCHpiUWun7vlJJvUiN&index=16) "
10 | ]
11 | },
12 | {
13 | "cell_type": "markdown",
14 | "metadata": {},
15 | "source": [
16 | "## **面向对象编程**\n",
17 | "\n",
18 | "对象是在编码中模仿现实世界的一种方式。 如果你拿一个人的概念,他们可以有名字、地址、身高,所有这些属性都会因人而异。 面向对象的编码封装了该类型的信息,因此您可以轻松地制作具有所有这些细节的人。 "
19 | ]
20 | },
21 | {
22 | "cell_type": "markdown",
23 | "metadata": {},
24 | "source": [
25 | "## **例子:建立银行**\n",
26 | "\n",
27 | "在接下来的几个模块中,您将创建一个具有以下属性的银行帐户对象:\n",
28 | "\n",
29 | "> 它有一个唯一标识银行账户的 10 位数字。\n",
30 | ">\n",
31 | "> 它有一个存储所有者姓名的字符串。\n",
32 | ">\n",
33 | "> 可以取回余额。\n",
34 | ">\n",
35 | "> 它接受存款。\n",
36 | ">\n",
37 | "> 它接受提款。\n",
38 | ">\n",
39 | "> 初始余额必须为正数。\n",
40 | ">\n",
41 | "> 提款不会导致负余额。\n",
42 | ">\n",
43 | "\n",
44 | "您可以对这些目标进行分类:\n",
45 | "\n",
46 | "- **属性**:有关对象的详细信息(它有多少钱,帐户名称)。\n",
47 | "- **Actions**:对象可以做的事情(接受存款和取款)。\n",
48 | "- **规则**:对象的指导方针,使其不会尝试做不可能的事情(确保帐户永远不会变成负数)。"
49 | ]
50 | },
51 | {
52 | "cell_type": "markdown",
53 | "metadata": {},
54 | "source": [
55 | "## **动动手**\n",
56 | "\n",
57 | "下面是您要创建的空白“BankAccount”对象。 您将逐步添加代码。"
58 | ]
59 | },
60 | {
61 | "cell_type": "markdown",
62 | "metadata": {},
63 | "source": [
64 | "## **#1:属性**\n",
65 | "\n",
66 | "属性是每个对象拥有的值的一个占位符。\n",
67 | "`get` 和 `set`:有时你只想让用户看到一个变量而不是改变它。 其他时候,您希望用户能够更改变量。 `get` 让你看到变量,`set` 让你改变它。 (正确的?)\n",
68 | "\n",
69 | "> 复制下面的代码并将其粘贴到 `//Properties` 下的 `BankAccount` 对象中\n",
70 | "\n",
71 | "```csharp\n",
72 | " public string Number { get; }\n",
73 | " public string Owner { get; set; }\n",
74 | " public decimal Balance { get; }\n",
75 | "```"
76 | ]
77 | },
78 | {
79 | "cell_type": "code",
80 | "execution_count": null,
81 | "metadata": {
82 | "dotnet_interactive": {
83 | "language": "csharp"
84 | },
85 | "vscode": {
86 | "languageId": "dotnet-interactive.csharp"
87 | }
88 | },
89 | "outputs": [],
90 | "source": [
91 | "public class BankAccount\n",
92 | "{\n",
93 | " // Properties (paste under here)\n",
94 | "\n",
95 | " // Constructor\n",
96 | "\n",
97 | " // Functions\n",
98 | "}"
99 | ]
100 | },
101 | {
102 | "cell_type": "markdown",
103 | "metadata": {},
104 | "source": [
105 | "## **#2:构造函数**\n",
106 | "\n",
107 | "此方法用于创建对象的特定实例。 像您现在所做的那样,创建一个 `BankAccount` 类就像为所有银行帐户创建一个模板。 这不是一个单一的个人帐户。 构造函数将创建一个单独的帐户,其中包含所有人员的实际详细信息。 您为构造函数提供特定帐户所需的所有详细信息,并将详细信息分配给新对象的属性。\n",
108 | "\n",
109 | "`this` 是一个样式选择。 它明确表明变量“所有者”是该特定实例的变量。 将来,您将有一个对象的两个实例进行交互,并且 `this` 将变得更加明确有用。 如果你愿意,你也可以写 `Owner` 而不是 `this.Owner`!\n",
110 | "\n",
111 | "您正在使用变量 `name` 和 `initialBalance` 并创建一个包含这些变量的银行帐户。\n",
112 | "\n",
113 | "> 将构造函数复制粘贴到下面的 `BankAccount` 中,在 `//Constructor` 下\n",
114 | "\n",
115 | "```csharp\n",
116 | "public BankAccount(string name, decimal initialBalance)\n",
117 | "{\n",
118 | " this.Owner = name;\n",
119 | " this.Balance = initialBalance;\n",
120 | "}\n",
121 | "```"
122 | ]
123 | },
124 | {
125 | "cell_type": "code",
126 | "execution_count": null,
127 | "metadata": {
128 | "dotnet_interactive": {
129 | "language": "csharp"
130 | },
131 | "vscode": {
132 | "languageId": "dotnet-interactive.csharp"
133 | }
134 | },
135 | "outputs": [],
136 | "source": [
137 | "public class BankAccount\n",
138 | "{\n",
139 | " // Properties\n",
140 | " public string Number { get; }\n",
141 | " public string Owner { get; set; }\n",
142 | " public decimal Balance { get; }\n",
143 | "\n",
144 | " // Constructor (Paste here!)\n",
145 | "\n",
146 | " // Functions\n",
147 | "}"
148 | ]
149 | },
150 | {
151 | "cell_type": "markdown",
152 | "metadata": {},
153 | "source": [
154 | "## **#3:创建一个实例**\n",
155 | "\n",
156 | "现在你已经写好了代码,看看如果你创建一个 `BankAccount` 会发生什么!\n",
157 | "\n",
158 | "> 运行下面的两个代码单元以创建特定的银行帐户。 它是否符合您的预期?\n",
159 | ">\n",
160 | "> 更改代码为自己创建一个银行帐户。 你想在你的银行账户里存多少钱?"
161 | ]
162 | },
163 | {
164 | "cell_type": "code",
165 | "execution_count": null,
166 | "metadata": {
167 | "dotnet_interactive": {
168 | "language": "csharp"
169 | },
170 | "vscode": {
171 | "languageId": "dotnet-interactive.csharp"
172 | }
173 | },
174 | "outputs": [],
175 | "source": [
176 | "public class BankAccount\n",
177 | "{\n",
178 | " // Properties\n",
179 | " public string Number { get; }\n",
180 | " public string Owner { get; set; }\n",
181 | " public decimal Balance { get; }\n",
182 | "\n",
183 | " // Constructor\n",
184 | " public BankAccount(string name, decimal initialBalance)\n",
185 | " {\n",
186 | " this.Owner = name;\n",
187 | " this.Balance = initialBalance;\n",
188 | " }\n",
189 | " // Functions\n",
190 | "}"
191 | ]
192 | },
193 | {
194 | "cell_type": "code",
195 | "execution_count": null,
196 | "metadata": {
197 | "dotnet_interactive": {
198 | "language": "csharp"
199 | },
200 | "vscode": {
201 | "languageId": "dotnet-interactive.csharp"
202 | }
203 | },
204 | "outputs": [
205 | {
206 | "name": "stdout",
207 | "output_type": "stream",
208 | "text": [
209 | "Account was created for Kendra with 1000 dollars\r\n"
210 | ]
211 | }
212 | ],
213 | "source": [
214 | "var account = new BankAccount(\"Kendra\", 1000);\n",
215 | "Console.WriteLine($\"Account{account.Number} was created for {account.Owner} with {account.Balance} dollars\");"
216 | ]
217 | },
218 | {
219 | "cell_type": "markdown",
220 | "metadata": {},
221 | "source": [
222 | "## `account.Number` 呢?\n",
223 | "\n",
224 | "您可能已经注意到代码没有打印出任何关于 `account.Number` 的内容。 没关系! 你还没有在里面放任何东西。 您将在下一个模块中了解它。"
225 | ]
226 | },
227 | {
228 | "cell_type": "markdown",
229 | "metadata": {},
230 | "source": [
231 | "## #4: Functions\n",
232 | "\n",
233 | "Functions exist to do actions with an object or change the object variables. These two functions will make a deposit (add money) and make a withdrawal (take out money). You'll be adding stuff in the methods later, but for now you just want to add the empty versions.\n",
234 | "\n",
235 | "> copy the functions below and add them to `BankAccount` under `//Functions`\n",
236 | "\n",
237 | "```csharp\n",
238 | "public void MakeDeposit(decimal amount, DateTime date, string note)\n",
239 | "{\n",
240 | "}\n",
241 | "\n",
242 | "public void MakeWithdrawal(decimal amount, DateTime date, string note)\n",
243 | "{\n",
244 | "}\n",
245 | "```"
246 | ]
247 | },
248 | {
249 | "cell_type": "code",
250 | "execution_count": null,
251 | "metadata": {
252 | "dotnet_interactive": {
253 | "language": "csharp"
254 | },
255 | "vscode": {
256 | "languageId": "dotnet-interactive.csharp"
257 | }
258 | },
259 | "outputs": [],
260 | "source": [
261 | "public class BankAccount\n",
262 | "{\n",
263 | " // Properties\n",
264 | " public string Number { get; }\n",
265 | " public string Owner { get; set; }\n",
266 | " public decimal Balance { get; }\n",
267 | "\n",
268 | " // Constructor\n",
269 | " public BankAccount(string name, decimal initialBalance)\n",
270 | " {\n",
271 | " this.Owner = name;\n",
272 | " this.Balance = initialBalance;\n",
273 | " }\n",
274 | "\n",
275 | " // Functions (paste here!)\n",
276 | "}"
277 | ]
278 | },
279 | {
280 | "cell_type": "markdown",
281 | "metadata": {},
282 | "source": [
283 | "# **回顾一下**\n",
284 | "\n",
285 | "这是您在此模块中最终使用的 `BankAccount` 的版本。 您将在下一个模块中添加更多内容,但您为什么不尝试一些东西,看看您需要学习什么?\n",
286 | "\n",
287 | "> 可以添加 10 位代码吗? 你的对象需要知道什么来确保代码是唯一的?\n",
288 | ">\n",
289 | "> 试试添加存款功能吧! 你想让它做什么?\n",
290 | ">\n",
291 | "> 您如何检查初始余额是否为正?"
292 | ]
293 | },
294 | {
295 | "cell_type": "code",
296 | "execution_count": null,
297 | "metadata": {
298 | "dotnet_interactive": {
299 | "language": "csharp"
300 | },
301 | "vscode": {
302 | "languageId": "dotnet-interactive.csharp"
303 | }
304 | },
305 | "outputs": [],
306 | "source": [
307 | "public class BankAccount\n",
308 | "{\n",
309 | " // Variables (#1)\n",
310 | " public string Number { get; }\n",
311 | " public string Owner { get; set; }\n",
312 | " public decimal Balance { get; }\n",
313 | "\n",
314 | " // Constructor (#2)\n",
315 | " public BankAccount(string name, decimal initialBalance)\n",
316 | " {\n",
317 | " this.Owner = name;\n",
318 | " this.Balance = initialBalance;\n",
319 | " }\n",
320 | "\n",
321 | " // Functions (#4)\n",
322 | " public void MakeDeposit(decimal amount, DateTime date, string note)\n",
323 | " {\n",
324 | " }\n",
325 | "\n",
326 | " public void MakeWithdrawal(decimal amount, DateTime date, string note)\n",
327 | " {\n",
328 | " }\n",
329 | "}"
330 | ]
331 | },
332 | {
333 | "cell_type": "code",
334 | "execution_count": null,
335 | "metadata": {
336 | "dotnet_interactive": {
337 | "language": "csharp"
338 | },
339 | "vscode": {
340 | "languageId": "dotnet-interactive.csharp"
341 | }
342 | },
343 | "outputs": [
344 | {
345 | "name": "stdout",
346 | "output_type": "stream",
347 | "text": [
348 | "Account was created for Kendra with 1000 dollars\r\n"
349 | ]
350 | }
351 | ],
352 | "source": [
353 | "//Make an instance (#3)\n",
354 | "var account = new BankAccount(\"Kendra\", 1000);\n",
355 | "Console.WriteLine($\"Account{account.Number} was created for {account.Owner} with {account.Balance} dollars\");"
356 | ]
357 | },
358 | {
359 | "cell_type": "markdown",
360 | "metadata": {},
361 | "source": [
362 | "# **进阶学习**\n",
363 | "\n",
364 | "> [⏩ 下一个学习模块 - 对象和类](https://github.com/kinfey/csharp-notebooks/blob/main/csharp-101/14-Methods%20and%20Members.ipynb)\n",
365 | ">\n",
366 | "> [⏪ 上一个学习模块 - 其他类型列表](https://github.com/kinfey/csharp-notebooks/blob/main/csharp-101/12-Lists%20of%20Other%20Types.ipynb)\n",
367 | ">\n",
368 | "> [观看教学视频](https://www.youtube.com/watch?v=TzgxcAiHCWA&list=PLdo4fOcmZ0oVxKLQCHpiUWun7vlJJvUiN&index=16)\n",
369 | ">\n",
370 | "> [文档: C# 面向对象编程](https://aka.ms/CSharp.OO)\n",
371 | ">\n",
372 | "> [从头学起: 什么是 C# ?](https://www.youtube.com/watch?v=BM4CHBmAPh4&list=PLdo4fOcmZ0oVxKLQCHpiUWun7vlJJvUiN&index=1)"
373 | ]
374 | },
375 | {
376 | "cell_type": "markdown",
377 | "metadata": {},
378 | "source": [
379 | "# **其他资源**\n",
380 | "\n",
381 | "你可以从以下链接中获取\n",
382 | "> [其他 101 系列的教学视频](https://aka.ms/Videos.dotNET)\n",
383 | ">\n",
384 | "> [Microsoft Learn](https://aka.ms/Learn.dotNET)\n",
385 | ">\n",
386 | "> [C# 文档](https://aka.ms/Docs.CSharp)"
387 | ]
388 | }
389 | ],
390 | "metadata": {
391 | "kernelspec": {
392 | "display_name": ".NET (C#)",
393 | "language": "C#",
394 | "name": ".net-csharp"
395 | },
396 | "language_info": {
397 | "file_extension": ".cs",
398 | "mimetype": "text/x-csharp",
399 | "name": "C#",
400 | "pygments_lexer": "csharp",
401 | "version": "8.0"
402 | }
403 | },
404 | "nbformat": 4,
405 | "nbformat_minor": 4
406 | }
407 |
--------------------------------------------------------------------------------
/csharp-scenarios/01-Alien-Translator.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# **翻译外星人消息**\n",
8 | "\n",
9 | "## **介绍**\n",
10 | "在这个适合初学者的编码挑战中,您将了解所有关于字符串以及字符如何串在一起形成字符串的知识! 字符串是软件开发人员每天使用的一种重要数据类型。 今天,我们将使用 C#(发音为 see-sharp)语言将外星人的信息翻译成英语!\n",
11 | "\n",
12 | "### **学习目标**\n",
13 | "1. 了解什么是字符串\n",
14 | "1.创建字符串数据\n",
15 | "1. 将字符串数据通过连接和插值处理成一个新的字符串\n",
16 | "\n",
17 | "### 本笔记本中使用的有用术语的快速概览\n",
18 | "1. [字符串](https://docs.microsoft.com/dotnet/api/system.string?view=net-6.0)\n",
19 | "2. [字符](https://docs.microsoft.com/dotnet/api/system.char?view=net-6.0) \n",
20 | "3. [变量](https://docs.microsoft.com/dotnet/csharp/language-reference/language-specification/variables)\n",
21 | "4. [控制台](https://docs.microsoft.com/windows/console/consoles)\n",
22 | "5. [Switch 语句](https://docs.microsoft.com/dotnet/csharp/language-reference/operators/switch-expression)\n",
23 | "6. [foreach 循环](https://docs.microsoft.com/dotnet/csharp/language-reference/statements/iteration-statements#the-foreach-statement)\n",
24 | "7. [字符串插值](https://docs.microsoft.com/dotnet/csharp/language-reference/tokens/interpolated?msclkid=1b008d82d0b611ec96aa6fdaf77cbe48)"
25 | ]
26 | },
27 | {
28 | "cell_type": "markdown",
29 | "metadata": {},
30 | "source": [
31 | ""
32 | ]
33 | },
34 | {
35 | "cell_type": "markdown",
36 | "metadata": {},
37 | "source": [
38 | "## **场景**\n",
39 | "\n",
40 | "想象一下,你是政府雇佣的计算语言学家,帮助与最近登陆地球的一群外星人交流。 这些外星人讲一种非人类语言,称为语言 X(外星人)。 幸运的是,您的语言学伙伴比您先到达现场,并且能够为 X 语言的一些基本单词生成英文翻译。她已经确定外星人想要向人类传达信息。 作为她的计算语言学家,您的工作是**使用代码将语言 X 中较长的消息翻译成英语**。\n",
41 | "\n",
42 | "**计算语言学家**使用计算和人工智能来研究自然语言和自然语言模式。 这些语言学家利用语言数据对不同的语言进行建模,他们可以以多种不同的方式应用这些模型。 聊天机器人、语音识别系统和搜索引擎等工具都是在计算语言学的帮助下构建的。"
43 | ]
44 | },
45 | {
46 | "cell_type": "markdown",
47 | "metadata": {},
48 | "source": [
49 | "## **Console.WriteLine**\n",
50 | "### **向外星人介绍自己**\n",
51 | "\n",
52 | "当您第一次到达现场时,您的语言伙伴会鼓励您向外星人介绍自己。 因为这将是一个快速的介绍,所以她会为您翻译此声明。\n",
53 | "\n",
54 | "为此,您需要编写一个显示到控制台的字符串。\n",
55 | "\n",
56 | "**string** 是一个字符序列。 字符串是一种特别有用的数据类型,它允许您与程序的用户进行交互。 在 C# 中,字符串以引号开头和结尾。 例如,“这是一个字符串”。\n",
57 | "\n",
58 | "要问候外星人,请将以下代码中的 *myName* 替换为您的姓名。 然后,运行代码。 "
59 | ]
60 | },
61 | {
62 | "cell_type": "code",
63 | "execution_count": null,
64 | "metadata": {
65 | "dotnet_interactive": {
66 | "language": "csharp"
67 | },
68 | "vscode": {
69 | "languageId": "dotnet-interactive.csharp"
70 | }
71 | },
72 | "outputs": [],
73 | "source": [
74 | "Console.WriteLine(\"Hi extraterrestrials, my name is myName.\");"
75 | ]
76 | },
77 | {
78 | "cell_type": "markdown",
79 | "metadata": {},
80 | "source": [
81 | "*Console.WriteLine()* [语句](https://docs.microsoft.com/dotnet/csharp/programming-guide/statements-expressions-operators/statements) 允许我们将字符串写入控制台。 让我们分解一下。\n",
82 | "\n",
83 | "> * [Console](https://docs.microsoft.com/dotnet/api/system.console?view=net-6.0) 可用于输出字符串。\n",
84 | "> * [WriteLine() 方法](https://docs.microsoft.com/dotnet/api/system.console.writeline?view=net-6.0) 将您在括号中指定的任何数据写入输出。"
85 | ]
86 | },
87 | {
88 | "cell_type": "markdown",
89 | "metadata": {},
90 | "source": [
91 | "## **使用带字符串的变量**\n",
92 | "### **告诉外星人更多关于你自己的信息**\n",
93 | "了不起的工作! 你的语言伙伴说你应该多介绍一下自己,这样外星人就知道你在做什么。 但是,她说只用你的名字而不是像我这样的代词来指代你自己,因为她还不能翻译代词。 用你的名字替换 *myName* 的所有实例并点击运行。"
94 | ]
95 | },
96 | {
97 | "cell_type": "code",
98 | "execution_count": null,
99 | "metadata": {
100 | "dotnet_interactive": {
101 | "language": "csharp"
102 | },
103 | "vscode": {
104 | "languageId": "dotnet-interactive.csharp"
105 | }
106 | },
107 | "outputs": [],
108 | "source": [
109 | "Console.WriteLine(\"Hi extraterrestrials, my name is myName.\"); \n",
110 | "Console.WriteLine(\"myName is a researcher.\"); \n",
111 | "Console.WriteLine(\"myName studies language.\"); "
112 | ]
113 | },
114 | {
115 | "cell_type": "markdown",
116 | "metadata": {},
117 | "source": [
118 | "### **将外星人介绍给其他人**\n",
119 | "很好!现在,您的研究团队的其他成员想要使用您的代码进行自我介绍。但是,用每个研究人员的名字遍历和更改所有 *myName*s 是乏味的,并且可能会导致错误。注意在我们想要输出的字符串中,唯一改变的是 myName。简化代码并减少出错空间的一种方法是使用变量和字符串插值。 **variable** 是一个符号,可用于运行具有不同值的相同代码。\n",
120 | "\n",
121 | "让我们创建一个名为 name 的字符串变量,而不是替换每个 *myName*,我们可以一次将其分配给不同的名称,它将在整个介绍过程中更新所有 myNames!\n",
122 | "\n",
123 | "我们还需要使用**字符串插值**来使用我们字符串中的变量。这允许您从包含嵌入式代码的字符串构造单个结果字符串。每个内插字符串都有两部分。\n",
124 | "1. 字符串以 `$` 开头,紧接在左引号之前。\n",
125 | "2. 至少一个内插表达式。您必须将这些插值表达式包裹在花括号 `{` `}` 中。您可以将任何返回值的 C# 表达式放在大括号内。在本练习中,我们使用的是字符串。\n",
126 | "\n",
127 | "尝试运行下面的示例,看看它是如何工作的。"
128 | ]
129 | },
130 | {
131 | "cell_type": "code",
132 | "execution_count": null,
133 | "metadata": {
134 | "dotnet_interactive": {
135 | "language": "csharp"
136 | },
137 | "vscode": {
138 | "languageId": "dotnet-interactive.csharp"
139 | }
140 | },
141 | "outputs": [
142 | {
143 | "name": "stdout",
144 | "output_type": "stream",
145 | "text": [
146 | "For more help, please call 123456789\r\n"
147 | ]
148 | }
149 | ],
150 | "source": [
151 | "var phoneNumber = 123456789;\n",
152 | "Console.WriteLine($\"For more help, please call {phoneNumber}\");"
153 | ]
154 | },
155 | {
156 | "cell_type": "markdown",
157 | "metadata": {},
158 | "source": [
159 | "在此示例中,phoneNumber 变量被嵌入到字符串中。\n",
160 | "\n",
161 | "现在让我们用我们给外星人的信息来试试这个。 在下面的代码中,创建一个名为 `name` 的变量并将其赋值为“myName”。 然后,使用 `$`、`{` 和 `}`,将这三个语句转换为插值表达式。"
162 | ]
163 | },
164 | {
165 | "cell_type": "code",
166 | "execution_count": null,
167 | "metadata": {
168 | "dotnet_interactive": {
169 | "language": "csharp"
170 | },
171 | "vscode": {
172 | "languageId": "dotnet-interactive.csharp"
173 | }
174 | },
175 | "outputs": [
176 | {
177 | "name": "stdout",
178 | "output_type": "stream",
179 | "text": [
180 | "Hi extraterrestrials, my name is myName.\r\n",
181 | "myName is a researcher.\r\n",
182 | "myName studies language.\r\n"
183 | ]
184 | }
185 | ],
186 | "source": [
187 | "Console.WriteLine(\"Hi extraterrestrials, my name is myName.\"); \n",
188 | "Console.WriteLine(\"myName is a researcher.\"); \n",
189 | "Console.WriteLine(\"myName studies language.\"); "
190 | ]
191 | },
192 | {
193 | "cell_type": "markdown",
194 | "metadata": {},
195 | "source": [
196 | "现在,您可以将名称设置为被介绍人的姓名。 尝试用名字 Joon 替换 *myName* 并运行它。\n",
197 | "\n",
198 | "上面带有 Console.WriteLine 的行是**字符串文字**,这意味着它是表示常量字符串的文本。"
199 | ]
200 | },
201 | {
202 | "cell_type": "markdown",
203 | "metadata": {},
204 | "source": [
205 | "## **让我们翻译一条消息**\n",
206 | "是时候开始翻译了。 您的语言伙伴为您提供了下图,其中包括她能够翻译成语言 X 的所有单词及其英语翻译。 我们将使用这些数据来翻译外星人的信息。\n",
207 | "\n",
208 | "### **语言数据**\n",
209 | "这些数据被组织成一个 [switch 语句](https://docs.microsoft.com/dotnet/csharp/language-reference/operators/switch-expression)。 这个 **switch 表达式** 将一个外来词作为输入,并输出英文翻译。 通常,switch 表达式将输入与一系列案例进行匹配,而输出取决于匹配的案例。 为了翻译消息,我们将使用这个 switch 表达式来帮助我们匹配外来词并接收正确的英文单词。"
210 | ]
211 | },
212 | {
213 | "cell_type": "code",
214 | "execution_count": null,
215 | "metadata": {
216 | "dotnet_interactive": {
217 | "language": "csharp"
218 | },
219 | "vscode": {
220 | "languageId": "dotnet-interactive.csharp"
221 | }
222 | },
223 | "outputs": [],
224 | "source": [
225 | "string ToEnglish(string word) => word switch\n",
226 | "{\n",
227 | " \"yoish\" => \"the aliens\",\n",
228 | " \"ceroyash\" => \"Earth\",\n",
229 | " \"nomshce\" => \"want\",\n",
230 | " \"warshel\" => \"please\",\n",
231 | " \"yoishel\" => \"Alien planet\",\n",
232 | " \"oppor\" => \"need\",\n",
233 | " \"afala\" => \"trees\",\n",
234 | " \"eshteve\" => \"walk\",\n",
235 | " \"blarg\" => \"speak\",\n",
236 | " \"shioy\" => \"humans\",\n",
237 | " \"abree\" => \"help\",\n",
238 | " \"shwaye\" => \"crashed\",\n",
239 | " \"ni\" => \"on\",\n",
240 | " \"coierm\" => \"to go\",\n",
241 | " \"lleog\" => \"dirt\",\n",
242 | " \"efellesh\" => \"peace\",\n",
243 | " \"veiesht\" => \"home\",\n",
244 | " \"shir\" => \"can\",\n",
245 | " \"argsha\" => \"spaceship\",\n",
246 | " _ => \"Unknown\"\n",
247 | "};"
248 | ]
249 | },
250 | {
251 | "cell_type": "markdown",
252 | "metadata": {},
253 | "source": [
254 | "如您所见,上面的每个 Language X 单词都映射到英语中的单词。 例如,“Yoish”的意思是“外星人”"
255 | ]
256 | },
257 | {
258 | "cell_type": "markdown",
259 | "metadata": {},
260 | "source": [
261 | "看起来外星人正在发送他们的第一条信息:\n",
262 | "### **\"warshel abree yoish\"**"
263 | ]
264 | },
265 | {
266 | "cell_type": "markdown",
267 | "metadata": {},
268 | "source": [
269 | "对于我们的第一个翻译,让我们用对应的英语单词替换每种语言 X 单词。 为此,我们将使用 [String.Replace 方法](https://docs.microsoft.com/dotnet/api/system.string.replace?view=net-6.0)。 要正确使用此方法,我们传入要替换的字符串和替换字符串。 运行下面的单元格,看看它是如何工作的。\n",
270 | "\n",
271 | "这是一个例子:"
272 | ]
273 | },
274 | {
275 | "cell_type": "code",
276 | "execution_count": null,
277 | "metadata": {
278 | "dotnet_interactive": {
279 | "language": "csharp"
280 | },
281 | "vscode": {
282 | "languageId": "dotnet-interactive.csharp"
283 | }
284 | },
285 | "outputs": [
286 | {
287 | "name": "stdout",
288 | "output_type": "stream",
289 | "text": [
290 | "She is cool\r\n"
291 | ]
292 | }
293 | ],
294 | "source": [
295 | "var stringName = \"He is cold\"; \n",
296 | "\n",
297 | "// Below, we replace \"He\" with \"She\" and \"cold\" with \"cool\"\n",
298 | "stringName = stringName.Replace(\"He\", \"She\").Replace(\"cold\",\"cool\"); \n",
299 | "\n",
300 | "Console.WriteLine(stringName);"
301 | ]
302 | },
303 | {
304 | "cell_type": "markdown",
305 | "metadata": {},
306 | "source": [
307 | ">注意如何在一个语句中放置多个替换\n",
308 | "\n",
309 | "现在,让我们用外星人的消息来试试这个。"
310 | ]
311 | },
312 | {
313 | "cell_type": "code",
314 | "execution_count": null,
315 | "metadata": {
316 | "dotnet_interactive": {
317 | "language": "csharp"
318 | },
319 | "vscode": {
320 | "languageId": "dotnet-interactive.csharp"
321 | }
322 | },
323 | "outputs": [
324 | {
325 | "name": "stdout",
326 | "output_type": "stream",
327 | "text": [
328 | "Warshel abree yoish\r\n"
329 | ]
330 | }
331 | ],
332 | "source": [
333 | "// here’s the alien message \n",
334 | "\n",
335 | "var message = \"Warshel abree yoish\";\n",
336 | "\n",
337 | "// try replacing the words in language x with their English counterparts using the Replace method \n",
338 | "\n",
339 | "// print the message\n",
340 | "Console.WriteLine(message);"
341 | ]
342 | },
343 | {
344 | "cell_type": "markdown",
345 | "metadata": {},
346 | "source": [
347 | "## **让我们使用循环**\n",
348 | "\n",
349 | "看起来第二条外星人消息正在传入:\n",
350 | "### **Yoish shwaye ni ceroyash。 Yoish oppor shioy abree coierm veiesht。 Shioy abree yoish?**\n",
351 | "对于像这样较长的消息,逐个替换单词有点乏味。 我们可以让这个过程更有效率。 想象一下,如果我们可以编写一段代码,逐字检查未知的外星人消息,找到每个单词的英文翻译,然后输出翻译后的英文消息。 幸运的是,我们可以使用循环。 **循环**是一种重复动作多次的方式。\n",
352 | "\n",
353 | "我们将使用上面的 ToEnglish **switch 表达式** 将外星人消息中的每个 Language X 单词翻译成英语。"
354 | ]
355 | },
356 | {
357 | "cell_type": "markdown",
358 | "metadata": {},
359 | "source": [
360 | "在我们可以循环句子中的单词之前,我们需要将消息字符串分解为单词。 为此,我们将使用 [String.Split()](https://docs.microsoft.com/dotnet/api/system.string.split?view=net-6.0) 方法。 我们向 String.Split() 方法传递一个描述字符,该方法将使用该字符将字符串拆分为子字符串。 在句子的情况下,我们可以选择一个空格''作为分隔符,因为每个单词都用空格分隔。 在下面的单元格中,使用 String.Split() 将句子字符串拆分为单词子字符串。"
361 | ]
362 | },
363 | {
364 | "cell_type": "markdown",
365 | "metadata": {},
366 | "source": [
367 | ""
368 | ]
369 | },
370 | {
371 | "cell_type": "markdown",
372 | "metadata": {},
373 | "source": [
374 | "现在我们可以将句子字符串拆分为单词子字符串,是时候遍历它们并进行翻译了! 为此,我们将使用 [foreach 循环](https://docs.microsoft.com/dotnet/csharp/language-reference/statements/iteration-statements#the-foreach-statement)。 这是一种特殊类型的循环,它为该类型元素组中的每个元素执行一条语句。\n",
375 | "\n",
376 | "语法是这样的:"
377 | ]
378 | },
379 | {
380 | "cell_type": "code",
381 | "execution_count": null,
382 | "metadata": {
383 | "dotnet_interactive": {
384 | "language": "csharp"
385 | },
386 | "vscode": {
387 | "languageId": "dotnet-interactive.csharp"
388 | }
389 | },
390 | "outputs": [
391 | {
392 | "name": "stdout",
393 | "output_type": "stream",
394 | "text": [
395 | "this is an example "
396 | ]
397 | }
398 | ],
399 | "source": [
400 | "var sentence = \"this is an example\";\n",
401 | "\n",
402 | "// split the string into substrings\n",
403 | "string[] variableCollection = sentence.Split(' ');\n",
404 | "\n",
405 | "foreach(var variableName in variableCollection) \n",
406 | "{ \n",
407 | " // statements to be executed \n",
408 | " Console.Write(variableName + \" \");\n",
409 | "} "
410 | ]
411 | },
412 | {
413 | "cell_type": "markdown",
414 | "metadata": {},
415 | "source": [
416 | ">在我们的例子中,**数据类型**是字符串。 **变量名**可以是任何东西,但为了确保我们的代码易于理解,我们将其命名为 word。 **集合变量**将是我们的语言 X 单词列表。 要执行的语句必须用大括号括起来。\n",
417 | "\n",
418 | "现在您可以将外星人的句子字符串拆分为单词子字符串,并且我们知道如何循环这些字符串,是时候翻译外星人的信息了!"
419 | ]
420 | },
421 | {
422 | "cell_type": "code",
423 | "execution_count": null,
424 | "metadata": {
425 | "dotnet_interactive": {
426 | "language": "csharp"
427 | },
428 | "vscode": {
429 | "languageId": "dotnet-interactive.csharp"
430 | }
431 | },
432 | "outputs": [
433 | {
434 | "name": "stdout",
435 | "output_type": "stream",
436 | "text": [
437 | "yoish shwaye ni ceroyash yoish oppor shioy abree coierm veiesht shir shioy abree yoish\r\n"
438 | ]
439 | }
440 | ],
441 | "source": [
442 | "var alienMessage = \"yoish shwaye ni ceroyash yoish oppor shioy abree coierm veiesht shir shioy abree yoish\"; \n",
443 | "\n",
444 | "// split alienMessage into word substrings and store it in a variable called words \n",
445 | "string[] words = alienMessage.Split(' '); \n",
446 | "\n",
447 | "// Here is where we will loop through each word in words and translate them \n",
448 | "foreach(var word in words) \n",
449 | "{ \n",
450 | " // pass the word to the switch expression here \n",
451 | " \n",
452 | "} \n",
453 | "\n",
454 | "// turn the English word back into a string using the Join method\n",
455 | "var englishMessage = string.Join(\" \", words);\n",
456 | "Console.WriteLine(englishMessage);"
457 | ]
458 | },
459 | {
460 | "cell_type": "markdown",
461 | "metadata": {},
462 | "source": [
463 | "很好! 您现在可以将此消息以及您的翻译工具转发给外星人响应小组,以便他们将外星人带回家。 任务成功!"
464 | ]
465 | }
466 | ],
467 | "metadata": {
468 | "kernelspec": {
469 | "display_name": ".NET (C#)",
470 | "language": "C#",
471 | "name": ".net-csharp"
472 | },
473 | "language_info": {
474 | "file_extension": ".cs",
475 | "mimetype": "text/x-csharp",
476 | "name": "C#",
477 | "pygments_lexer": "csharp",
478 | "version": "9.0"
479 | },
480 | "orig_nbformat": 4
481 | },
482 | "nbformat": 4,
483 | "nbformat_minor": 2
484 | }
485 |
--------------------------------------------------------------------------------
/machine-learning/01-Intro to Machine Learning.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# **机器学习简介**\n",
8 | "\n",
9 | "在这个 Notebook 中,我们将介绍:\n",
10 | "- 什么是机器学习?\n",
11 | "- 需要执行哪些步骤?\n",
12 | "- 'Hello ML.NET World' - 训练你的第一个 ML.NET 模型。"
13 | ]
14 | },
15 | {
16 | "cell_type": "markdown",
17 | "metadata": {},
18 | "source": [
19 | "## **什么是机器学习?**\n",
20 | "\n",
21 | "\n",
22 | "```\n",
23 | "var size = new HouseData() { Size = 2.5F };\n",
24 | "var price = predictionEngine.Predict(大小);\n",
25 | "```\n",
26 | "\n",
27 | "上面的代码展示了如何使用已经训练好的模型。 训练模型的最终结果是一个函数,你可以将一些数据“HouseData.Size”传递给模型,它会给你一个预测——“Prediction.Price”。\n",
28 | "\n",
29 | "上面是一个简单的例子(可能太简单了),但是模型可以接受更多的值。 例如 - [出租车数据集的价值预测/回归](https://ntbk.io/ml-e2e-taxi) --\n",
30 | "是一个更复杂的例子,它接受`vendor_id`、`rate_code`、`passenger_count`、`trip_time_in_secs`、`trip_distance`、`payment_type`,然后预测`fare_amount`。\n",
31 | "\n",
32 | "### **你是如何创建这个函数的?**\n",
33 | "机器学习通过提供算法数据并使用统计数据来预测值来创建或训练该模型。 更多细节和示例如下!"
34 | ]
35 | },
36 | {
37 | "cell_type": "markdown",
38 | "metadata": {},
39 | "source": [
40 | "## **需要执行哪些步骤?**\n",
41 | "\n",
42 | "1. **获取和准备训练数据**\n",
43 | " 为了训练模型,我们需要标记数据。标记数据仅表示数据集中已经具有要预测的列的一堆数据,以便训练算法可以学习预测值。\n",
44 | "1. **选择训练算法并训练**\n",
45 | " >**剧透**\n",
46 | " >在我们的大多数示例中,我们将使用 AutoML 来简化此过程。 AutoML 策略性地为给定任务尝试各种算法和参数,以找出最适合您的数据的算法和参数!\n",
47 | " >\n",
48 | " >你可以把它想象成一个花哨的 for 循环来尝试所有的选项。我们的 AutoML 比这更聪明一些……但这基本上就是它的作用!\n",
49 | " >\n",
50 | " > 对于下面的示例,我们将训练一个特定的算法 - 这样您就可以看到它是如何工作的!\n",
51 | " 1. 选择一个任务 - [ML.NET 任务](https://docs.microsoft.com/dotnet/machine-learning/resources/tasks)\n",
52 | " 1. 选择一种算法 - [ML.NET 算法](https://docs.microsoft.com/dotnet/machine-learning/how-to-choose-an-ml-net-algorithm)\n",
53 | " 1. 设置算法参数【词汇表-超参数】(https://docs.microsoft.com/dotnet/machine-learning/resources/glossary#hyperparameter)\n",
54 | " 1. 训练——\n",
55 | " 这是数据实际上被馈送到算法以训练模型的地方。这可能需要一些时间,具体取决于数据量、算法和该算法的参数。\n",
56 | "\n",
57 | "1. **评估**\n",
58 | " 一旦你训练了一个模型——你怎么知道它是有效的?有很多技术可以评估模型的性能。如果您想更深入地了解 - Checkout [Evaluation Metrics](https://docs.microsoft.com/dotnet/machine-learning/resources/metrics)。否则,我们将在这些教程中提供示例。\n",
59 | "1. **部署**\n",
60 | " 在你训练了一个模型之后......它只是 .NET 代码!构建它 交付它 - 但是您当前部署您的应用程序。"
61 | ]
62 | },
63 | {
64 | "cell_type": "markdown",
65 | "metadata": {},
66 | "source": [
67 | "## 我该如何入门?\n",
68 | "下面我们快速介绍一下 ML.NET——“Hello ML.NET World!” 该系列接下来的三个 Notebook 将分别深入探讨 [数据准备和特征工程](https://github.com/kinfey/csharp-notebooks/blob/main/machine-learning/02-Data%20Preparation%20and%20Feature%20Engineering.ipynb)、[训练和 AutoML](https://github.com/kinfey/csharp-notebooks/blob/main/machine-learning/03-Training%20and%20AutoML.ipynb) 和 [模型评估](https://github.com/kinfey/csharp-notebooks/blob/main/machine-learning/04-Model%20Evaluation.ipynb)"
69 | ]
70 | },
71 | {
72 | "cell_type": "markdown",
73 | "metadata": {},
74 | "source": [
75 | "# **Hello ML.NET World!**\n",
76 | "以下片段中的代码演示了最简单的 ML.NET 应用程序。 此示例构建了一个线性回归模型,以使用房屋大小和价格数据来预测房价。\n",
77 | "\n",
78 | "第一步是引用 [Microsoft.ML](https://www.nuget.org/packages/Microsoft.ML/) 包。\n",
79 | "\n",
80 | "关于这个 Notebook,我们在包引用中添加引用如下:"
81 | ]
82 | },
83 | {
84 | "cell_type": "code",
85 | "execution_count": 1,
86 | "metadata": {
87 | "dotnet_interactive": {
88 | "language": "csharp"
89 | },
90 | "vscode": {
91 | "languageId": "dotnet-interactive.csharp"
92 | }
93 | },
94 | "outputs": [
95 | {
96 | "data": {
97 | "text/html": [
98 | "Installed Packages- Microsoft.ML, 2.0.0-preview.22356.1
"
99 | ]
100 | },
101 | "execution_count": 1,
102 | "metadata": {},
103 | "output_type": "execute_result"
104 | }
105 | ],
106 | "source": [
107 | "#i \"nuget:https://pkgs.dev.azure.com/dnceng/public/_packaging/MachineLearning/nuget/v3/index.json\"\n",
108 | "#r \"nuget: Microsoft.ML, 2.0.0-preview.22356.1\""
109 | ]
110 | },
111 | {
112 | "cell_type": "markdown",
113 | "metadata": {},
114 | "source": [
115 | "第二步是引用 ML.NET 命名空间:"
116 | ]
117 | },
118 | {
119 | "cell_type": "code",
120 | "execution_count": 1,
121 | "metadata": {
122 | "dotnet_interactive": {
123 | "language": "csharp"
124 | },
125 | "vscode": {
126 | "languageId": "dotnet-interactive.csharp"
127 | }
128 | },
129 | "outputs": [],
130 | "source": [
131 | "using Microsoft.ML;\n",
132 | "using Microsoft.ML.Data;"
133 | ]
134 | },
135 | {
136 | "cell_type": "markdown",
137 | "metadata": {},
138 | "source": [
139 | "现在我们准备编写代码来实现我们需要做的机器学习任务。 始终从创建 [MLContext](https://docs.microsoft.com/dotnet/api/microsoft.ml.mlcontext?view=ml-dotnet) 开始,这是所有 ML.NET 操作的通用的做法"
140 | ]
141 | },
142 | {
143 | "cell_type": "code",
144 | "execution_count": 1,
145 | "metadata": {
146 | "dotnet_interactive": {
147 | "language": "csharp"
148 | },
149 | "vscode": {
150 | "languageId": "dotnet-interactive.csharp"
151 | }
152 | },
153 | "outputs": [],
154 | "source": [
155 | "MLContext mlContext = new MLContext();"
156 | ]
157 | },
158 | {
159 | "cell_type": "markdown",
160 | "metadata": {},
161 | "source": [
162 | "下一步是为我们要使用的数据定义数据结构。 这个样本是关于房屋预测价格的。 开始定义以下包含房屋大小和价格的数据结构:"
163 | ]
164 | },
165 | {
166 | "cell_type": "code",
167 | "execution_count": 1,
168 | "metadata": {
169 | "dotnet_interactive": {
170 | "language": "csharp"
171 | },
172 | "vscode": {
173 | "languageId": "dotnet-interactive.csharp"
174 | }
175 | },
176 | "outputs": [],
177 | "source": [
178 | "public class HouseData\n",
179 | "{\n",
180 | " public float Size { get; set; }\n",
181 | " public float Price { get; set; }\n",
182 | "}"
183 | ]
184 | },
185 | {
186 | "cell_type": "markdown",
187 | "metadata": {},
188 | "source": [
189 | "然后定义房价预测数据结构"
190 | ]
191 | },
192 | {
193 | "cell_type": "code",
194 | "execution_count": 1,
195 | "metadata": {
196 | "dotnet_interactive": {
197 | "language": "csharp"
198 | },
199 | "vscode": {
200 | "languageId": "dotnet-interactive.csharp"
201 | }
202 | },
203 | "outputs": [],
204 | "source": [
205 | "public class Prediction\n",
206 | "{\n",
207 | " [ColumnName(\"Score\")]\n",
208 | " public float Price { get; set; }\n",
209 | "}"
210 | ]
211 | },
212 | {
213 | "cell_type": "markdown",
214 | "metadata": {},
215 | "source": [
216 | "现在我们准备好训练我们将用于房价预测场景的预先收集的数据"
217 | ]
218 | },
219 | {
220 | "cell_type": "code",
221 | "execution_count": 1,
222 | "metadata": {
223 | "dotnet_interactive": {
224 | "language": "csharp"
225 | },
226 | "vscode": {
227 | "languageId": "dotnet-interactive.csharp"
228 | }
229 | },
230 | "outputs": [],
231 | "source": [
232 | "HouseData[] houseData = {\n",
233 | " new HouseData() { Size = 1.1F, Price = 1.2F },\n",
234 | " new HouseData() { Size = 1.9F, Price = 2.3F },\n",
235 | " new HouseData() { Size = 2.8F, Price = 3.0F },\n",
236 | " new HouseData() { Size = 3.4F, Price = 3.7F } };"
237 | ]
238 | },
239 | {
240 | "cell_type": "markdown",
241 | "metadata": {},
242 | "source": [
243 | "Using the `MLContext` we previously created, load the training data into ML.NET [IDataView](https://docs.microsoft.com/dotnet/api/microsoft.ml.idataview?view=ml-dotnet) which is the fundamental ML.NET data type"
244 | ]
245 | },
246 | {
247 | "cell_type": "code",
248 | "execution_count": 1,
249 | "metadata": {
250 | "dotnet_interactive": {
251 | "language": "csharp"
252 | },
253 | "vscode": {
254 | "languageId": "dotnet-interactive.csharp"
255 | }
256 | },
257 | "outputs": [],
258 | "source": [
259 | "IDataView trainingData = mlContext.Data.LoadFromEnumerable(houseData);"
260 | ]
261 | },
262 | {
263 | "cell_type": "markdown",
264 | "metadata": {},
265 | "source": [
266 | "使用我们之前创建的“MLContext”,将训练数据加载到 ML.NET [IDataView](https://docs.microsoft.com/dotnet/api/microsoft.ml.idataview?view=ml-dotnet) "
267 | ]
268 | },
269 | {
270 | "cell_type": "code",
271 | "execution_count": 1,
272 | "metadata": {
273 | "dotnet_interactive": {
274 | "language": "csharp"
275 | },
276 | "vscode": {
277 | "languageId": "dotnet-interactive.csharp"
278 | }
279 | },
280 | "outputs": [],
281 | "source": [
282 | "// 2. Specify data preparation and model training pipeline\n",
283 | "var pipeline = mlContext.Transforms.Concatenate(\"Features\", new[] { \"Size\" })\n",
284 | " .Append(mlContext.Regression.Trainers.Sdca(labelColumnName: \"Price\", maximumNumberOfIterations: 100));"
285 | ]
286 | },
287 | {
288 | "cell_type": "markdown",
289 | "metadata": {},
290 | "source": [
291 | "创建估算器后,我们准备将管道中定义的转换和训练器应用于数据。 为此,请调用 [Fit](https://docs.microsoft.com/dotnet/api/microsoft.ml.iestimator-1.fit?view=ml-dotnet) 方法。"
292 | ]
293 | },
294 | {
295 | "cell_type": "code",
296 | "execution_count": 1,
297 | "metadata": {
298 | "dotnet_interactive": {
299 | "language": "csharp"
300 | },
301 | "vscode": {
302 | "languageId": "dotnet-interactive.csharp"
303 | }
304 | },
305 | "outputs": [],
306 | "source": [
307 | "var model = pipeline.Fit(trainingData);"
308 | ]
309 | },
310 | {
311 | "cell_type": "markdown",
312 | "metadata": {},
313 | "source": [
314 | "现在我们可以评估训练好的模型。 方法是加载准备好的测试数据,然后调用 [Evaluate](https://docs.microsoft.com/dotnet/api/microsoft.ml.regressioncatalog.evaluate?view=ml-dotnet) 方法, 然后打印[确定系数](https://en.wikipedia.org/wiki/Coefficient_of_determination) 以了解如何使用测试数据拟合模型。 确定系数越接近 1,模型拟合效果越好。 重复训练和评估步骤,直到从训练的模型中获得满意的结果。"
315 | ]
316 | },
317 | {
318 | "cell_type": "code",
319 | "execution_count": 1,
320 | "metadata": {
321 | "dotnet_interactive": {
322 | "language": "csharp"
323 | },
324 | "vscode": {
325 | "languageId": "dotnet-interactive.csharp"
326 | }
327 | },
328 | "outputs": [
329 | {
330 | "data": {
331 | "text/plain": [
332 | "Coefficient of determination for the trained model: 0.98\r\n"
333 | ]
334 | },
335 | "execution_count": 1,
336 | "metadata": {},
337 | "output_type": "execute_result"
338 | }
339 | ],
340 | "source": [
341 | "HouseData[] testData = {\n",
342 | " new HouseData() { Size = 1.1F, Price = 1.2F },\n",
343 | " new HouseData() { Size = 1.2F, Price = 1.5F },\n",
344 | " new HouseData() { Size = 1.4F, Price = 1.7F },\n",
345 | " new HouseData() { Size = 1.6F, Price = 1.9F },\n",
346 | " new HouseData() { Size = 1.9F, Price = 2.3F },\n",
347 | " new HouseData() { Size = 2.8F, Price = 3.0F },\n",
348 | " new HouseData() { Size = 3.2F, Price = 3.5F },\n",
349 | " new HouseData() { Size = 3.3F, Price = 3.6F },\n",
350 | " new HouseData() { Size = 3.5F, Price = 3.9F }, \n",
351 | " new HouseData() { Size = 3.7F, Price = 4.3F }, \n",
352 | " new HouseData() { Size = 4.0F, Price = 6.1F }, \n",
353 | " new HouseData() { Size = 5.0F, Price = 7.2F }, \n",
354 | " new HouseData() { Size = 6.0F, Price = 8.5F }, \n",
355 | " new HouseData() { Size = 7.0F, Price = 9.8F }, \n",
356 | " new HouseData() { Size = 8.0F, Price = 10.3F }, \n",
357 | "};\n",
358 | "\n",
359 | "// Load the test data\n",
360 | "IDataView trainingTestData = mlContext.Data.LoadFromEnumerable(testData);\n",
361 | "\n",
362 | "// transform the test data using the model\n",
363 | "IDataView transformedTestData = model.Transform(trainingTestData);\n",
364 | "\n",
365 | "// Evaluate the model against the test data\n",
366 | "RegressionMetrics trainedModelMetrics = mlContext.Regression.Evaluate(transformedTestData, labelColumnName: \"Size\");\n",
367 | "\n",
368 | "// Print the R-Squared value. The Closer to 1 indicates a better fitted model.\n",
369 | "Console.WriteLine($\"Coefficient of determination for the trained model: {trainedModelMetrics.RSquared:0.00}\");"
370 | ]
371 | },
372 | {
373 | "cell_type": "markdown",
374 | "metadata": {},
375 | "source": [
376 | "现在我们已经准备好训练好的模型进行预测。 让我们使用这个模型来预测样本房价。 我们通过创建预测引擎 [PredictionEngine](https://docs.microsoft.com/dotnet/api/microsoft.ml.predictionengine-2?view=ml-dotnet) 来做到这一点。 预测引擎是用于对先前训练的模型(和先前的转换管道)进行单一预测的类。 从经过训练的模型创建预测引擎可以通过以下代码完成:"
377 | ]
378 | },
379 | {
380 | "cell_type": "code",
381 | "execution_count": 1,
382 | "metadata": {
383 | "dotnet_interactive": {
384 | "language": "csharp"
385 | },
386 | "vscode": {
387 | "languageId": "dotnet-interactive.csharp"
388 | }
389 | },
390 | "outputs": [],
391 | "source": [
392 | "var predictionEngine = mlContext.Model.CreatePredictionEngine(model);"
393 | ]
394 | },
395 | {
396 | "cell_type": "markdown",
397 | "metadata": {},
398 | "source": [
399 | "然后使用创建的预测引擎,我们可以预测房价如下:"
400 | ]
401 | },
402 | {
403 | "cell_type": "code",
404 | "execution_count": 1,
405 | "metadata": {
406 | "dotnet_interactive": {
407 | "language": "csharp"
408 | },
409 | "vscode": {
410 | "languageId": "dotnet-interactive.csharp"
411 | }
412 | },
413 | "outputs": [
414 | {
415 | "data": {
416 | "text/plain": [
417 | "Predicted price for size: 2500 sq ft= $274.48k\r\n"
418 | ]
419 | },
420 | "execution_count": 1,
421 | "metadata": {},
422 | "output_type": "execute_result"
423 | }
424 | ],
425 | "source": [
426 | "var size = new HouseData() { Size = 2.5F };\n",
427 | "var price = predictionEngine.Predict(size);\n",
428 | "Console.WriteLine($\"Predicted price for size: {size.Size*1000} sq ft= {price.Price*100:C}k\");"
429 | ]
430 | },
431 | {
432 | "cell_type": "markdown",
433 | "metadata": {},
434 | "source": [
435 | "恭喜! 您已使用自己的数据成功训练了 ML.NET 回归模型,然后使用此模型预测房价。 这是一个总结创建和训练 ML.NET 模型然后使用它来预测房价的端到端操作的图表。\n",
436 | "\n",
437 | ""
438 | ]
439 | },
440 | {
441 | "cell_type": "markdown",
442 | "metadata": {},
443 | "source": [
444 | "# **进阶学习**\n",
445 | "\n",
446 | "> [⏩ 下一个学习模块 - 数据准备和特征工程](https://github.com/kinfey/csharp-notebooks/blob/main/machine-learning/02-Data%20Preparation%20and%20Feature%20Engineering.ipynb)"
447 | ]
448 | }
449 | ],
450 | "metadata": {
451 | "kernelspec": {
452 | "display_name": ".NET (C#)",
453 | "language": "C#",
454 | "name": ".net-csharp"
455 | },
456 | "language_info": {
457 | "file_extension": ".cs",
458 | "mimetype": "text/x-csharp",
459 | "name": "C#",
460 | "pygments_lexer": "csharp",
461 | "version": "8.0"
462 | }
463 | },
464 | "nbformat": 4,
465 | "nbformat_minor": 4
466 | }
467 |
--------------------------------------------------------------------------------
/machine-learning/E2E-Text-Classification-API-with-Yelp-Dataset.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# **文本分类 API(预览版)**"
8 | ]
9 | },
10 | {
11 | "cell_type": "markdown",
12 | "metadata": {},
13 | "source": [
14 | "## **什么是文本分类?**\n",
15 | "\n",
16 | "顾名思义,文本分类是将标签或类别应用于文本的过程。\n",
17 | "\n",
18 | "常见用例包括:\n",
19 | "\n",
20 | "- 将电子邮件分类为垃圾邮件或非垃圾邮件\n",
21 | "- 根据客户评论将情绪分析为正面或负面\n",
22 | "- 应用标签来支持工单\n",
23 | "\n",
24 | "## **用机器学习解决文本分类**\n",
25 | "\n",
26 | "分类是机器学习中的一个常见问题。您可以使用多种算法来训练分类模型。文本分类是分类的一个子类别,专门处理原始文本。文本提出了有趣的挑战,因为您必须考虑文本出现的上下文和语义。因此,编码含义和上下文可能很困难。近年来,深度学习模型已成为解决自然语言问题的一种有前途的技术。更具体地说,一种称为转换器的神经网络已成为解决自然语言问题(如文本分类、翻译、摘要和问答)的主要方式。\n",
27 | "\n",
28 | "论文中介绍了Transformers [Attention is all you need](https://arxiv.org/abs/1706.03762)。一些用于自然语言任务的流行转换器架构包括:\n",
29 | "\n",
30 | "- 来自 Transformers (BERT) 的双向编码器表示\n",
31 | "- 稳健优化的 BERT 预训练方法 (RoBERTa)\n",
32 | "- 生成式预训练 Transformer 2 (GPT-2)\n",
33 | "- 生成式预训练 Transformer 3 (GPT-3)\n",
34 | "\n",
35 | "在高层次上,转换器是由编码和解码层组成的模型架构。编码器将原始文本作为输入,并将输入映射到数字表示(包括上下文)以生成特征。解码器使用来自编码器的信息来产生输出,例如在文本分类的情况下的类别或标签。使这些层如此特别的是注意力的概念。注意力是根据上下文相对于序列中其他输入的重要性关注输入的特定部分的想法。例如,假设我正在根据标题对新闻文章进行分类。并非标题中的所有词都是相关的。在“汽车销售处于历史最高水平”这样的标题中,“销售”这样的词可能会受到更多关注,并导致将文章标记为商业或金融。\n",
36 | "\n",
37 | "像大多数神经网络一样,从头开始训练转换器可能会很昂贵,因为它们需要大量数据和计算。但是,您不必总是从头开始训练。使用称为微调的技术,您可以采用预先训练的模型并使用您自己的数据重新训练特定于您的域或问题的层。这为您提供了一个更适合解决您的问题的模型,而无需从头开始训练整个模型的过程。\n",
38 | "\n",
39 | "## **文本分类 API(预览版)**\n",
40 | "\n",
41 | "现在您已经大致了解了如何使用深度学习解决文本分类问题,让我们来看看我们如何将其中的许多技术整合到文本分类 API 中。\n",
42 | "\n",
43 | "文本分类 API 由 [TorchSharp](https://github.com/dotnet/TorchSharp) 提供支持。 TorchSharp 是一个 .NET 库,提供对 libtorch 的访问,该库为 PyTorch 提供支持。 TorchSharp 包含用于在 .NET 中从头开始训练神经网络的构建块。然而,TorchSharp 组件是底层级别的的,从头开始构建神经网络具有陡峭的学习曲线。在 ML.NET 中,我们已将部分复杂性抽象到场景级别。"
44 | ]
45 | },
46 | {
47 | "cell_type": "markdown",
48 | "metadata": {},
49 | "source": [
50 | "## 安装包\n",
51 | "\n",
52 | "要使用文本分类 API,您必须安装以下软件包\n",
53 | "\n",
54 | "- [`Microsoft.ML`](https://www.nuget.org/packages/Microsoft.ML/)\n",
55 | "- [`Microsoft.ML.TorchSharp`](https://www.nuget.org/packages/Microsoft.ML.TorchSharp/)\n",
56 | "- [`TorchSharp-cpu`](https://www.nuget.org/packages/TorchSharp-cpu/) 如果您使用的是 CPU 或 [`TorchSharp-cuda-windows`](https://www.nuget.org/packages/TorchSharp-cuda-windows/) / [`TorchSharp-cuda-linux`](https://www.nuget.org/packages/TorchSharp-cuda-linux/) 如果您使用的是 GPU .\n",
57 | "\n",
58 | "要启用 GPU 支持,您还必须安装 CUDA 依赖项。 有关详细信息,请参阅 [GPU 支持指南](https://docs.microsoft.com/dotnet/machine-learning/how-to-guides/install-gpu-model-builder#install-dependencies)。"
59 | ]
60 | },
61 | {
62 | "cell_type": "code",
63 | "execution_count": 1,
64 | "metadata": {
65 | "dotnet_interactive": {
66 | "language": "csharp"
67 | },
68 | "vscode": {
69 | "languageId": "dotnet-interactive.csharp"
70 | }
71 | },
72 | "outputs": [
73 | {
74 | "data": {
75 | "text/html": [
76 | "Restore sources- https://pkgs.dev.azure.com/dnceng/public/_packaging/MachineLearning/nuget/v3/index.json
Installed Packages- Microsoft.Data.Analysis, 0.20.0-preview.22324.1
- Microsoft.ML, 2.0.0-preview.22324.1
- Microsoft.ML.TorchSharp, 0.20.0-preview.22324.1
- TorchSharp-cpu, 0.96.7
"
77 | ]
78 | },
79 | "execution_count": 1,
80 | "metadata": {},
81 | "output_type": "execute_result"
82 | },
83 | {
84 | "data": {
85 | "text/markdown": [
86 | "Loading extensions from `Microsoft.Data.Analysis.Interactive.dll`"
87 | ]
88 | },
89 | "execution_count": 1,
90 | "metadata": {},
91 | "output_type": "execute_result"
92 | }
93 | ],
94 | "source": [
95 | "#i \"nuget:https://pkgs.dev.azure.com/dnceng/public/_packaging/MachineLearning/nuget/v3/index.json\"\n",
96 | "\n",
97 | "#r \"nuget:Microsoft.ML,2.0.0-preview.22324.1\"\n",
98 | "#r \"nuget:Microsoft.ML.TorchSharp,0.20.0-preview.22324.1\"\n",
99 | "#r \"nuget:TorchSharp-cpu,0.96.7\"\n",
100 | "#r \"nuget:Microsoft.Data.Analysis,0.20.0-preview.22324.1\""
101 | ]
102 | },
103 | {
104 | "cell_type": "markdown",
105 | "metadata": {},
106 | "source": [
107 | "## **添加 using 语句**"
108 | ]
109 | },
110 | {
111 | "cell_type": "code",
112 | "execution_count": 1,
113 | "metadata": {
114 | "dotnet_interactive": {
115 | "language": "csharp"
116 | },
117 | "vscode": {
118 | "languageId": "dotnet-interactive.csharp"
119 | }
120 | },
121 | "outputs": [],
122 | "source": [
123 | "using Microsoft.ML;\n",
124 | "using Microsoft.ML.Data;\n",
125 | "using Microsoft.Data.Analysis;\n",
126 | "using Microsoft.ML.TorchSharp;"
127 | ]
128 | },
129 | {
130 | "cell_type": "markdown",
131 | "metadata": {},
132 | "source": [
133 | "## **初始化 MLContext**\n",
134 | "\n",
135 | "所有 ML.NET 操作都从 MLContext 类开始。 初始化 mlContext 会创建一个新的 ML.NET 环境,该环境可以在模型创建工作流对象之间共享。 它在概念上类似于实体框架中的 DBContext。"
136 | ]
137 | },
138 | {
139 | "cell_type": "code",
140 | "execution_count": 1,
141 | "metadata": {
142 | "dotnet_interactive": {
143 | "language": "csharp"
144 | },
145 | "vscode": {
146 | "languageId": "dotnet-interactive.csharp"
147 | }
148 | },
149 | "outputs": [],
150 | "source": [
151 | "var mlContext = new MLContext();"
152 | ]
153 | },
154 | {
155 | "cell_type": "markdown",
156 | "metadata": {},
157 | "source": [
158 | "### **下载或查找数据**\n",
159 | "以下代码尝试在几个已知位置找到数据文件,或者它将从已知的 GitHub 位置下载它。"
160 | ]
161 | },
162 | {
163 | "cell_type": "code",
164 | "execution_count": 1,
165 | "metadata": {
166 | "dotnet_interactive": {
167 | "language": "csharp"
168 | },
169 | "vscode": {
170 | "languageId": "dotnet-interactive.csharp"
171 | }
172 | },
173 | "outputs": [],
174 | "source": [
175 | "using System;\n",
176 | "using System.IO;\n",
177 | "using System.Net;\n",
178 | "\n",
179 | "string EnsureDataSetDownloaded(string fileName)\n",
180 | "{\n",
181 | "\n",
182 | "\t// This is the path if the repo has been checked out.\n",
183 | "\tvar filePath = Path.Combine(Directory.GetCurrentDirectory(),\"data\", fileName);\n",
184 | "\n",
185 | "\tif (!File.Exists(filePath))\n",
186 | "\t{\n",
187 | "\t\t// This is the path if the file has already been downloaded.\n",
188 | "\t\tfilePath = Path.Combine(Directory.GetCurrentDirectory(), fileName);\n",
189 | "\t}\n",
190 | "\n",
191 | "\tif (!File.Exists(filePath))\n",
192 | "\t{\n",
193 | "\t\tusing (var client = new WebClient())\n",
194 | "\t\t{\n",
195 | "\t\t\tclient.DownloadFile($\"https://raw.githubusercontent.com/dotnet/csharp-notebooks/main/machine-learning/data/{fileName}\", filePath);\n",
196 | "\t\t}\n",
197 | "\t\tConsole.WriteLine($\"Downloaded {fileName} to : {filePath}\");\n",
198 | "\t}\n",
199 | "\telse\n",
200 | "\t{\n",
201 | "\t\tConsole.WriteLine($\"{fileName} found here: {filePath}\");\n",
202 | "\t}\n",
203 | "\n",
204 | "\treturn filePath;\n",
205 | "}"
206 | ]
207 | },
208 | {
209 | "cell_type": "code",
210 | "execution_count": 1,
211 | "metadata": {
212 | "dotnet_interactive": {
213 | "language": "csharp"
214 | },
215 | "vscode": {
216 | "languageId": "dotnet-interactive.csharp"
217 | }
218 | },
219 | "outputs": [
220 | {
221 | "data": {
222 | "text/plain": [
223 | "yelp_labelled.txt found here: C:\\dev\\csharp-notebooks\\machine-learning\\data\\yelp_labelled.txt\r\n"
224 | ]
225 | },
226 | "execution_count": 1,
227 | "metadata": {},
228 | "output_type": "execute_result"
229 | }
230 | ],
231 | "source": [
232 | "var yelp_reviews = EnsureDataSetDownloaded(\"yelp_labelled.txt\");\n",
233 | "var columnNames = new [] {\"Text\", \"Sentiment\"};\n",
234 | "var df = DataFrame.LoadCsvFromString(yelp_reviews, separator:'\\t',header:false, columnNames:columnNames);"
235 | ]
236 | },
237 | {
238 | "cell_type": "markdown",
239 | "metadata": {},
240 | "source": [
241 | "加载数据后,使用 `Head` 方法预览前三行。"
242 | ]
243 | },
244 | {
245 | "cell_type": "code",
246 | "execution_count": 1,
247 | "metadata": {
248 | "dotnet_interactive": {
249 | "language": "csharp"
250 | },
251 | "vscode": {
252 | "languageId": "dotnet-interactive.csharp"
253 | }
254 | },
255 | "outputs": [
256 | {
257 | "data": {
258 | "text/html": [
259 | "| index | Text | Sentiment |
|---|
0 | Wow... Loved this place. | 1 |
1 | Crust is not good. | 0 |
2 | Not tasty and the texture was just nasty. | 0 |
"
260 | ]
261 | },
262 | "execution_count": 1,
263 | "metadata": {},
264 | "output_type": "execute_result"
265 | }
266 | ],
267 | "source": [
268 | "df.Head(3)"
269 | ]
270 | },
271 | {
272 | "cell_type": "markdown",
273 | "metadata": {},
274 | "source": [
275 | "> 本教程的数据集使用来自 Kotzias 等人的“使用深度特征从组到单个标签”的数据集。 KDD 2015,并托管在 UCI 机器学习存储库 - Dua, D. 和 Karra Taniskidou, E. (2017)。 [UCI 机器学习存储库](http://archive.ics.uci.edu/ml)。 加利福尼亚州欧文:加利福尼亚大学信息与计算机科学学院。\n",
276 | "\n",
277 | "数据集包含两列:\n",
278 | "\n",
279 | "- **文本:** 来自 Yelp 的原始评论文本\n",
280 | "- **情绪:** 表示评论情绪的二进制值。 0 为负数,1 为正数。"
281 | ]
282 | },
283 | {
284 | "cell_type": "markdown",
285 | "metadata": {},
286 | "source": [
287 | "## **将数据拆分为训练集和测试集**\n",
288 | "\n",
289 | "原始数据集分为两个子集:训练和测试。 训练集是您用来学习数据模式的工具。 测试集用于使用分类任务的评估指标来评估模型的性能。\n",
290 | "\n",
291 | "在这种情况下,80% 的数据用于由“testFraction”参数定义的训练。 剩下的 20% 用于评估和测试。"
292 | ]
293 | },
294 | {
295 | "cell_type": "code",
296 | "execution_count": 1,
297 | "metadata": {
298 | "dotnet_interactive": {
299 | "language": "csharp"
300 | },
301 | "vscode": {
302 | "languageId": "dotnet-interactive.csharp"
303 | }
304 | },
305 | "outputs": [],
306 | "source": [
307 | "var trainTestSplit = mlContext.Data.TrainTestSplit(df, testFraction:0.2);"
308 | ]
309 | },
310 | {
311 | "cell_type": "markdown",
312 | "metadata": {},
313 | "source": [
314 | "## **定义训练管道**\n",
315 | "\n",
316 | "文本分类 API 是多类分类目录的一部分。 要使用它,请将 `TextClassification` 训练器添加到您的管道中。"
317 | ]
318 | },
319 | {
320 | "cell_type": "code",
321 | "execution_count": 1,
322 | "metadata": {
323 | "dotnet_interactive": {
324 | "language": "csharp"
325 | },
326 | "vscode": {
327 | "languageId": "dotnet-interactive.csharp"
328 | }
329 | },
330 | "outputs": [],
331 | "source": [
332 | "var pipeline =\n",
333 | "\t\tmlContext.Transforms.Conversion.MapValueToKey(\"Label\",\"Sentiment\")\n",
334 | "\t\t\t.Append(mlContext.MulticlassClassification.Trainers.TextClassification(sentence1ColumnName: \"Text\"))\n",
335 | "\t\t\t.Append(mlContext.Transforms.Conversion.MapKeyToValue(\"PredictedLabel\"));"
336 | ]
337 | },
338 | {
339 | "cell_type": "markdown",
340 | "metadata": {},
341 | "source": [
342 | "## **训练模型**\n",
343 | "\n",
344 | "使用训练数据集使用 `Fit` 方法训练您的模型"
345 | ]
346 | },
347 | {
348 | "cell_type": "code",
349 | "execution_count": 1,
350 | "metadata": {
351 | "dotnet_interactive": {
352 | "language": "csharp"
353 | },
354 | "vscode": {
355 | "languageId": "dotnet-interactive.csharp"
356 | }
357 | },
358 | "outputs": [],
359 | "source": [
360 | "var model = pipeline.Fit(trainTestSplit.TrainSet);"
361 | ]
362 | },
363 | {
364 | "cell_type": "markdown",
365 | "metadata": {},
366 | "source": [
367 | "## **使用模型进行预测**\n",
368 | "\n",
369 | "通过调用“Transform”方法,使用您的模型对测试数据集进行预测。"
370 | ]
371 | },
372 | {
373 | "cell_type": "code",
374 | "execution_count": 1,
375 | "metadata": {
376 | "dotnet_interactive": {
377 | "language": "csharp"
378 | },
379 | "vscode": {
380 | "languageId": "dotnet-interactive.csharp"
381 | }
382 | },
383 | "outputs": [],
384 | "source": [
385 | "var predictionIDV = model.Transform(trainTestSplit.TestSet);"
386 | ]
387 | },
388 | {
389 | "cell_type": "markdown",
390 | "metadata": {},
391 | "source": [
392 | "调用 `Transform` 的结果是带有您的预测值的 `IDataView`。 为了更容易查看您的预测,请将 `IDataView` 转换为 `IDataFrame` 。 在这种情况下,我感兴趣的唯一列是 Text、Sentiment(实际值)和 PredictedLabel(预测值)。"
393 | ]
394 | },
395 | {
396 | "cell_type": "code",
397 | "execution_count": 1,
398 | "metadata": {
399 | "dotnet_interactive": {
400 | "language": "csharp"
401 | },
402 | "vscode": {
403 | "languageId": "dotnet-interactive.csharp"
404 | }
405 | },
406 | "outputs": [],
407 | "source": [
408 | "var columnsToSelect = new [] {\"Text\", \"Sentiment\", \"PredictedLabel\"};\n",
409 | "\n",
410 | "var predictions = predictionIDV.ToDataFrame(columnsToSelect);"
411 | ]
412 | },
413 | {
414 | "cell_type": "markdown",
415 | "metadata": {},
416 | "source": [
417 | "使用 `Tail` 方法预览预测 `DataFrame` 中的最后三行。"
418 | ]
419 | },
420 | {
421 | "cell_type": "code",
422 | "execution_count": 1,
423 | "metadata": {
424 | "dotnet_interactive": {
425 | "language": "csharp"
426 | },
427 | "vscode": {
428 | "languageId": "dotnet-interactive.csharp"
429 | }
430 | },
431 | "outputs": [
432 | {
433 | "data": {
434 | "text/html": [
435 | "| index | Text | Sentiment | PredictedLabel |
|---|
0 | Oh this is such a thing of beauty, this restaurant. | 1 | 0 |
1 | A greasy, unhealthy meal. | 0 | 1 |
2 | The best place in Vegas for breakfast (just check out a Sat, or Sun. | 1 | 1 |
"
436 | ]
437 | },
438 | "execution_count": 1,
439 | "metadata": {},
440 | "output_type": "execute_result"
441 | }
442 | ],
443 | "source": [
444 | "predictions.Tail(3)"
445 | ]
446 | },
447 | {
448 | "cell_type": "markdown",
449 | "metadata": {},
450 | "source": [
451 | "## **评估模型**"
452 | ]
453 | },
454 | {
455 | "cell_type": "markdown",
456 | "metadata": {},
457 | "source": [
458 | "您可以使用多种指标来评估模型的性能。 使用 [Evaluate](https://docs.microsoft.com/dotnet/api/microsoft.ml.multiclassclassificationcatalog.evaluate?view=ml-dotnet) 方法使用预测“IDataView”计算模型的评估指标。"
459 | ]
460 | },
461 | {
462 | "cell_type": "code",
463 | "execution_count": 1,
464 | "metadata": {
465 | "dotnet_interactive": {
466 | "language": "csharp"
467 | },
468 | "vscode": {
469 | "languageId": "dotnet-interactive.csharp"
470 | }
471 | },
472 | "outputs": [],
473 | "source": [
474 | "var evaluationMetrics = \n",
475 | "\tmlContext\n",
476 | "\t\t.MulticlassClassification\n",
477 | "\t\t.Evaluate(predictionIDV);"
478 | ]
479 | },
480 | {
481 | "cell_type": "markdown",
482 | "metadata": {},
483 | "source": [
484 | "然后,显示评估指标。 有关多类分类评估指标的更多信息,请参阅 [ML.NET 评估指标指南](https://docs.microsoft.com/dotnet/machine-learning/resources/metrics#evaluation-metrics-for-multi-class- 分类)。"
485 | ]
486 | },
487 | {
488 | "cell_type": "code",
489 | "execution_count": 1,
490 | "metadata": {
491 | "dotnet_interactive": {
492 | "language": "csharp"
493 | },
494 | "vscode": {
495 | "languageId": "dotnet-interactive.csharp"
496 | }
497 | },
498 | "outputs": [
499 | {
500 | "data": {
501 | "text/html": [
502 | "| LogLoss | LogLossReduction | MacroAccuracy | MicroAccuracy | TopKAccuracy | TopKPredictionCount | TopKAccuracyForAllK | PerClassLogLoss | ConfusionMatrix |
|---|
10.53512863047496 | -14.199291365827746 | 0.6737016700983757 | 0.6737967914438503 | 0 | 0 | <null> | [ 10.940300196581468, 10.134267400178105 ] | { Microsoft.ML.Data.ConfusionMatrix: PerClassPrecision: [ 0.6777777777777778, 0.6701030927835051 ], PerClassRecall: [ 0.6559139784946236, 0.6914893617021277 ], Counts: [ [ 61, 32 ], [ 29, 65 ] ], NumberOfClasses: 2 } |
"
503 | ]
504 | },
505 | "execution_count": 1,
506 | "metadata": {},
507 | "output_type": "execute_result"
508 | }
509 | ],
510 | "source": [
511 | "evaluationMetrics"
512 | ]
513 | }
514 | ],
515 | "metadata": {
516 | "kernelspec": {
517 | "display_name": ".NET (C#)",
518 | "language": "C#",
519 | "name": ".net-csharp"
520 | },
521 | "language_info": {
522 | "file_extension": ".cs",
523 | "mimetype": "text/x-csharp",
524 | "name": "C#",
525 | "pygments_lexer": "csharp",
526 | "version": "8.0"
527 | }
528 | },
529 | "nbformat": 4,
530 | "nbformat_minor": 4
531 | }
532 |
--------------------------------------------------------------------------------