C#
程序猿想成程序狮
学习中的一名程序猿,偶尔分享笔记,很懒。
展开
-
C# 正则表达式进阶
文章目录^$限定开头和结尾匹配汉字\1-9反向引用分组构造具名的分组构造应用^$限定开头和结尾^表示匹配必须从字符串或一行的开头开始$表示匹配必须以字符串或一行的末尾结束这两者一般连用表示以……开始,并且以……结尾,这样可以精确匹配,例如 “^a$” 表示匹配以a开始以a结尾并且只有一个a的字符串,这样的字符串只有“a”,“aa”是不匹配的。匹配汉字[\u4e00-\u9fa5]\1-9反向引用匹配AABC形式的词语,例如“好好学习”或“天天向上”可以使用“^\w\w\w\w$”来匹配四原创 2021-12-27 14:26:42 · 465 阅读 · 0 评论 -
C# 生成随机数
文章目录生成随机整数生成随机双精度浮点数生成随机单精度浮点数生成随机整数例如生成10个大于等于0小于2的随机整数Random random = Random.Shared; //获取一个线程安全的Random静态实例,这意味着多次获取到的同一个实例for(int i = 0; i < 10; i++){ int r = random.Next(0, 2); //Next(int a, int b)返回一个大于等于a小于b的随机整数 Console.WriteLine(r);原创 2021-12-10 11:45:09 · 2687 阅读 · 0 评论 -
C# 不定长参数
C# 不定长参数C# 提供一种语法,允许你设计的一个函数可以支持传入不定长的参数例如一个用于整数计算的Add方法,可以将传入的参数累加起来如Add(1, 2)返回3Add(1, 2, 3)放回6代码是这样的,使用params int[] i作为参数就可以接受任意个int参数了,其中params是关键字class Program{ public static int Add(params int[] i) { return i.Sum(i => i);原创 2021-11-10 13:47:34 · 1287 阅读 · 0 评论 -
C# 定时器System.Threading.Timer
C# 定时器System.Threading.TimerSystem.Threading.Timer类可以用来执行定时任务例如每隔0.5s输出一些东西public static void Main(string[] args){ Timer timer = new(callback: Callback, state: "张三", dueTime: 3000, period: 500); void Callback(object state) { Console原创 2021-10-28 14:34:44 · 3673 阅读 · 0 评论 -
C# 计时类Stopwatch
C# 计时类StopwatchStopwatch可用于准确地测量运行时间。public static void Main(string[] args){ Stopwatch stopwatch = new Stopwatch(); //开始计时 stopwatch.Start(); Thread.Sleep(1000); //停止计时 stopwatch.Stop(); Console.WriteLine("耗时{0}.", s原创 2021-10-28 13:47:17 · 992 阅读 · 0 评论 -
C# 遍历枚举类型
C# 遍历枚举类型假设有枚举类型:public enum Status{ status1 = 1, status2, status3,}遍历时Status[] statuses = (Status[])Enum.GetValues(typeof(Status));Array.ForEach(statuses, status => Console.WriteLine($"{status}: {(int)status}"));...原创 2021-10-25 15:05:30 · 520 阅读 · 0 评论 -
C# 多线程同时往一个Dictionary Add数据时产生数组越界问题的原因分析
多线程 Dictionary Add 数组越界问题产生原因问题描述:观察以下代码,是多线程同时向一个Dictionary中Add数据,运行using System;using System.Collections.Generic;using System.Threading.Tasks;namespace CSharpTest2{ class Program { public static void Main(string[] args) {原创 2021-10-14 13:52:04 · 1586 阅读 · 0 评论 -
HashSet可能存在的内存泄漏问题
文章目录HashSet可能存在的内存泄漏问题问题描述问题示例(C#)问题解释HashSet可能存在的内存泄漏问题问题描述如果往HashSet hs添加一个对象A,然后更改对象A中参与Hash计算的属性,将导致HashSet产生内存泄漏问题,这时,hs.Contains(A)会显示Fasle,hs中的对象A将无法被hs.Remove(A)释放。问题示例(C#)观察以下代码,往HashSet hs中添加了一个对象person,这时hs.Contains(person)结果是Ture,之后改变perso原创 2021-10-11 10:32:38 · 540 阅读 · 0 评论 -
C# 对象排序
C# 对象排序有时候我们希望对象本身有一个排序规则例如我们希望Person类可以根据年龄从小到大排序那么当我们有一个List<Person>列表时,调用其Sort方法就可以自动将列表中的元素排好序了我们先尝试运行下列代码using Newtonsoft.Json;using System;using System.Collections.Generic;public class Person{ public int Age { get; set; }}class P原创 2021-10-09 19:55:16 · 685 阅读 · 0 评论 -
ParallelLoopState.Break与ParallelLoopState.Stop区别
ParallelLoopState.Break与ParallelLoopState.Stop区别Break和Stop都是为了停止循环的一种手段不同之处在于Break不立马结束循环,而是要等所有小于ParallelLoopState.LowestBreakIteration的迭代执行完,才结束循环Stop则不用等所有小于ParallelLoopState.LowestBreakIteration的迭代执行完,才结束循环,它可以更快的结束循环需要注意的是,Break和Stop都不能停止已经开始的迭代,原创 2021-10-09 10:04:22 · 633 阅读 · 0 评论 -
C# WaitAll WaitAny WhenAll WhenAny傻傻分不清
C# WaitAll WaitAny WhenAll WhenAny傻傻分不清WaitAll WaitAny WhenAll WhenAny都是Task的静态方法WaitAll:阻塞式,主线程会等待所有任务结束,然后才能执行后续语句WaitAny,阻塞式,主线程会等待任意任务结束,然后才能执行后续语句WhenAll:非阻塞式,主线程会返回一个新的任务,在该任务中等待所有任务结束,因此主线程不会阻塞WhenAny:非阻塞式,主线程会返回一个新的任务,在该任务中等待任意任务结束,因此主线程不会原创 2021-09-30 18:46:08 · 1174 阅读 · 0 评论 -
C# 并行编程 Parallel
.net 并行编程传统的同步代码执行的模式是等待上一个任务执行完了,然后再执行下一个任务,这样的缺点是速度慢比如在以下代码中,有一个长度为10的List和一个处理程序,处理程序会处理List中的每一个项,处理速度是5s/个,那么执行完所有项需要50sList<int> numList = new List<int>();for(int i = 1; i <= 10; i++){ numList.Add(i);}foreach(int item in numLi原创 2021-09-02 19:51:50 · 432 阅读 · 0 评论 -
PLINQ并行查询效率的简单分析
PLINQ并行查询效率的简单分析假设执行一次查询需要花费的时间比较大,那我们可以采用PLINQ并行查询来进行提速并行查询,就是利用多核计算机并行执行查询语句来进行提速,这很好理解,一个工人工作慢,那就多叫几个工人同时进行工作,这样工作的进展不就快了。火神山医院不也是靠这样方式建出来的吗,不然工人不多的话,10天怎么可能建造出一个火神山医院显然,工作进展的快慢和工人数是有关的,在计算机中,工人数对应着线程数运行以下代码,这段代码是假设一个查询任务耗时约1s,分析:随着查询任务数量增多,使用普通LIN原创 2021-09-03 13:26:06 · 199 阅读 · 0 评论 -
C# Linq 左外联
C# Linq 左外联假设我们有一个Student类,具有姓名、年龄、班级Id三个属性还有一个Class类,具有Id,班级名两个属性现要查找学生姓名、年龄和其所在班级名,因此需要做一个Student表左联Class表的操作方式一:var results = from s in students join c in classes on s.ClassId equals c.Id into scs from sc in scs.DefaultI原创 2021-09-26 13:56:21 · 322 阅读 · 0 评论 -
C# 文件IO
文章目录判断某个文件夹是否存在获取当前运行程序(exe或dll)所在路径创建文件夹移动(剪切)文件夹复制文件创建文件覆盖写文件方式一:使用FileStream方式二:使用StreamWriter追加写文件读文件一:一次性读完文件所有内容二:读部分判断某个文件夹是否存在Console.WriteLine(Directory.Exists(@"C:\Windows"));获取当前运行程序(exe或dll)所在路径Console.WriteLine(AppDomain.CurrentDomain.Bas原创 2021-09-25 17:03:22 · 341 阅读 · 0 评论 -
Newtonsoft.Json基本使用
Newtonsoft.Json使用string jsonString = "{\"name\":\"zhangsan\",\"age\":\"17\", \"son\":{\"age\":\"1\"}}";// jsonString转jObjectJObject jObject = (JObject)JsonConvert.DeserializeObject(jsonString);// 获取jObject中的属性值string name = (string)jObject["name"];原创 2021-08-23 15:15:55 · 1955 阅读 · 0 评论 -
C# 把函数作为参数传入另一个函数
C# 把函数作为参数传入另一个函数1.使用Func<>如果我们需要设计一个Compute函数,它是用来计算的,参数类型依次是int、函数、int比如,Compute(2, Add, 3)应该返回5,因为我们传入的是一个做加法的函数Compute(2, Mul, 3)应该返回6,因为我们传入的是一个做乘法的函数我们该如何写这个Compute函数呢可以这样:public static int Compute(int a, Func<int, int, int> func,原创 2021-08-23 12:42:34 · 4873 阅读 · 0 评论 -
C#线程基本用法与线程传参
C#线程基本用法与线程传参线程基本用法创建子线程Thread thread = new Thread(new ThreadStart(子线程入口函数));开启子线程thread.Start();线程传参开启线程时传入零个参数using System;using System.Threading;namespace TestThread{ class Program { public static void Main(string[] args) {原创 2021-08-21 09:07:59 · 499 阅读 · 0 评论 -
C# 使用事件实现发布订阅模式
C# 使用事件实现发布订阅模式我们假设一个简单的场景:发布者有一个数字,这个数字可能会改变订阅者希望每次当发布者的数字改变时,自己都要收到消息如何实现代码呢?1.定义发布者类// 发布者,当数字改变时会发布一个NumberChange事件class Publisher{ public delegate void NumberChangeDelegate(int newValue); public event NumberChangeDelegate NumberChange; p原创 2021-08-21 00:12:00 · 2198 阅读 · 0 评论 -
C#delegate基本使用
C# delegate基本使用delegate提供了一种间接调用函数的方式比如我有一个SayHi函数public void SayHi(string name){ Console.WriteLine("hi " + name);}我如果想调用这个函数我可能需要这样SayHi(“Alice”);如果使用delegate的话,我可以不直接调用SayHi,而是去调用我的delegate间接调用SayHi,像这样myDelegate(“Alice”);delegate具体使用方法:首先需原创 2021-08-20 22:51:53 · 848 阅读 · 0 评论 -
C#自定义一个简单的特性Attribute
C#自定义一个简单的特性Attribute首先我们自定义一个类,这个类继承Attribute,命名为MyAttribute(注意:要以Attribute结尾),然后在类中随便设置了一个属性,名叫Message,还创建了一个构造函数,这样一个简单的特性类就创建好了。public class MyAttribute : Attribute{ public string Message { get; set; } public MyAttribute(string message)原创 2021-08-20 21:28:10 · 456 阅读 · 0 评论