diff --git "a/\351\273\204\351\233\252\350\212\254/20241209-\350\277\236\346\216\245\346\225\260\346\215\256\345\272\223.md" "b/\351\273\204\351\233\252\350\212\254/20241209-\350\277\236\346\216\245\346\225\260\346\215\256\345\272\223.md" new file mode 100644 index 0000000000000000000000000000000000000000..51a4e1fab5b2414be0b3fa1ec416acbe72a0b71a --- /dev/null +++ "b/\351\273\204\351\233\252\350\212\254/20241209-\350\277\236\346\216\245\346\225\260\346\215\256\345\272\223.md" @@ -0,0 +1,74 @@ +## 持久化及持久化方案 +- 结绳记事 +- 甲骨文 +- 木简 +- 竹简 +- 碑 +- 纸 +- 账本 +- 电子的文件,如文本文件、Excel、Word +- 数据库 + - 市面上常用数据库 + - Sqlserver 微软的产品 + - PostgreSQl 开源产品 社区驱动 + - MySQL/MariaDb 开源产品 公司驱动 + - Oracle 商业产品 + - Sysbase 商业产品 + - DB2 商业产品 + - 达梦 + - 人大金仓 + - Redis 非关系型数据库 开源 + - Memarchem 非关系型数据库 开源 + - MongoDb 非关系型数据库 开源 + - 常用的ORM工具(应用和数据库打交道的工具) + - Dapper 开源产品 特点是速度快,但代码写起来很麻烦 + - EntityFrameworkCore 微软家产品 特点是代码写起来很清楚并且快,但执行速度较慢(相对于Dapper + - 数据库优先 曾经很流行,现在不怎么流行 + - 代码优先 现在比较主流的做法 + - 定义数据库模型 + - 生成迁移文件(执行一个命令) + - 将迁移文件同步到数据库,完成 + - FreeSql 开源 + - Hibernet 开源 + +## Models数据库类型 +- 模型中的每一个类型,都和数据库表中的数据库一一对应 +- 一条数据表中的记录,在程序或应用中表现为一个对象 +- 一系列记录,则在程序和应用中表现为一个集合 + +## 连接数据库(代码优先) +1. 定义数据库模型 +```cs +using Microsoft.EntityFrameworkCore; +namespace Apple.Models; + +public class BlogDbContext : DbContext +{ + public BlogDbContext(DbContextOptions options) : base(options) + { + } + public DbSet Blogs { get; set; } = null!; +} +``` + +2. 在Program.cs文件中添加连接数据库语句,以及执行操作代码 +```cs +var connectionString = $"Server=.;Database=MdBlog;uid=sa;pwd=123456;TrustServerCertificate=true"; + +builder.Services.AddDbContext(opt => +{ + opt.UseSqlServer(connectionString); +}); +builder.Services.AddScoped(); +``` + +3. 终端相关运行步骤 + - 安装工具“dotnet-ef”:`dotnet tool install --global dotnet-ef` + + - 安装包 Microsoft.EntityFrameworkCore.Design + + `dotnet add package Microsoft.EntityFrameworkCore.Design` + + - 添加迁移数据:`dotnet ef migrations add InitCreate` + + - 将迁移文件更新到数据库:`dotnet ef database update` \ No newline at end of file diff --git "a/\351\273\204\351\233\252\350\212\254/20241211-Lambda\350\241\250\350\276\276\345\274\217.md" "b/\351\273\204\351\233\252\350\212\254/20241211-Lambda\350\241\250\350\276\276\345\274\217.md" new file mode 100644 index 0000000000000000000000000000000000000000..06b73e32faabef9847ed46d90b4df7e18b863e96 --- /dev/null +++ "b/\351\273\204\351\233\252\350\212\254/20241211-Lambda\350\241\250\350\276\276\345\274\217.md" @@ -0,0 +1,36 @@ +## Lambda表达式 +Lambda表达式是C#中引入的一种简洁的匿名函数语法。它们允许你以简洁的方式编写内联函数,这些函数可以被赋值给变量、作为参数传递或在表达式树中使用。 + + +Lambda表达式由几个部分组成: + +1. 参数列表:可以是一个或多个参数,参数可以被省略类型,编译器会根据上下文推断类型。 + +2. Lambda操作符 (=>):分隔参数列表和Lambda体。 + +3. Lambda体:可以是一个表达式或一个代码块。如果是表达式,结果将直接作为Lambda的返回值;如果是代码块,需要显式返回值。 + + +## Linq查询 +1. 查询表达式是一种使用查询语法表示的表达式,它用于查询和转换来自任意支持LINQ的数据源中的数据。 +2. 查询表达式使用常见的C#语言构造,易读简洁,容易掌握。 +3. 它由一组类似于SQL或XQuery的声明性语法编写的子句组成。 +4. 每一个子句可以包含一个或多个C#表达式,这些C#表达式本身也可能是查询表达式或包含查询表达式。 + +`Where`方法会基于指定的条件筛选集合中的元素。 + +`Select`方法会将集合中的每个元素投影(或转换)为新的形式。 + +`Any`方法会检查集合中是否存在满足特定条件的元素。 + +`Count`方法会返回集合中元素的数量,或者满足特定条件的元素数量。 + +`Concat`方法会将两个或多个序列合并为一个序列。 + +`Distinct`方法会返回序列中的唯一元素。(去重) + +`OrderBy` 和 `OrderByDescending` 方法会根据指定的键对序列进行排序。 + +`ToArray`方法会将序列转换为一个数组。 + +`ToList`方法会将序列转换为一个列表。 \ No newline at end of file diff --git "a/\351\273\204\351\233\252\350\212\254/20241213-Linq\346\237\245\350\257\242.md" "b/\351\273\204\351\233\252\350\212\254/20241213-Linq\346\237\245\350\257\242.md" new file mode 100644 index 0000000000000000000000000000000000000000..9f5817ba68d8b493fcfae7420915ad5d7df93ed3 --- /dev/null +++ "b/\351\273\204\351\233\252\350\212\254/20241213-Linq\346\237\245\350\257\242.md" @@ -0,0 +1,112 @@ +## C#中indexOf函数 +主要用于在字符串中查找特定字符或字符串的**首次出现**。它返回字符或字符串在字符串中首次出现的位置(基于0)。如果找不到字符或字符串,它将返回-1。 + +1. 查找字符串中**字符**的首次出现: +```cs +string str = "Hello, World!"; +int index = str.IndexOf('W'); +Console.WriteLine(index); // 输出:6 +``` +2. 查找字符串中字符串的首次出现: +```cs +string str = "Hello, World!"; +int index = str.IndexOf("World"); +Console.WriteLine(index); // 输出:7 +``` +3. 查找字符串中字符的首次出现(从指定位置开始): +```cs +string str = "Hello, World!"; +int index = str.IndexOf('W', 5); +Console.WriteLine(index); // 输出:6 +``` +4. 查找字符串中字符串的首次出现(从指定位置开始): +```cs +string str = "Hello, World!"; +int index = str.IndexOf("World", 5); +Console.WriteLine(index); // 输出:-1 +// 试图在字符串的第五个位置开始查找"World"。由于在指定的位置之后没有找到"World",所以返回-1 +``` + + +## C#字符串转换为整数 +1. int.Parse()方法 +2. int.TryParse()方法 + + +## C#检测类型 +1. is关键字:用于检查一个对象是否是特定类型 + +2. typeof运算符:用于获取类型的 Type 对象,并可以与 == 或 != 运算符一起使用来比较类型 +```cs +object obj = "Hello, World!"; +if (typeof(string) == obj.GetType()) +{ + Console.WriteLine("obj 是一个字符串类型"); +} +``` + +3. as关键字:用于安全地将一个对象转换为另一个类型。如果转换失败,as 会返回 null +```cs +string str = obj as string; +``` + +4. GetType()方法:返回对象的运行时类型 +```cs +object obj = "Hello, World!"; +if (obj.GetType() == typeof(string)) +{ + Console.WriteLine("obj 是一个字符串类型"); +} +``` + + +## C#中Range的使用方法 +1. 基本语法:`Range start..end` + +表示从start到end(不包括end)的**连续整数**序列 + +2. 自定义步长:`Range start..end..step` + +表示从start到end(不包括end)的连续整数序列,步长为step + +3. 使用Range与Linq查询 +```cs +var num = Enumerable.Range(1,10).ToArray(); +var evenNumbers = num.Where(n => n in 2..10..2).ToArray(); +``` +上面代码筛选出从1-10的偶数(步长为2 + +## skip方法和Take方法 +skip用于跳过序列中指定数量的元素,然后返回序列中剩余的元素。这个方法对于处理分页或者选择性处理元素时非常有用。 + +- 可以和Take方法一起处理分页问题 + +例如: +```cs +var num = Enumerable.Range(1,10).ToList(); +int pageSize = 10; //数量 +int pageIndex = 6; // 第几页 +var list = numbers.Skip((pageIndex - 1) * PageSize).Take(pageSize); +``` + +- Take 方法接受一个整数参数,该参数指定要返回的元素数量。 + +- Take和Skip方法是功能补充。给定一个集合序列coll和一个整数n,将coll.Take(n)和coll.Skip(n)的结果串联起来,生成与coll相同的序列 + + +## 练习题--查询并填充 找出数组中第一个大于2的元素,并用它填充后面的所有位置。 +```cs +int[] numbers = { 1, 2, 3, 4, 5, 6, 18, 23, 64, 7, 18, 2, 3 }; +int idx = -1; // 判断是否取到了元素下标 +var res = numbers.FirstOfDefault(x => x>2) +// 尝试获取集合下标 +idx = Array.IndexOf(numbers, res); +var list = numbers.Select((item , index) => +{ + if(index >= idx) + { + return res; + } + return item; +}); +``` \ No newline at end of file