
C#
爱吃奶酪的松鼠丶
QQ:1301001603
展开
-
.net GRPC服务搭建,跨进程调用。C#应用和Python应用之间的通信。
/ 定义服务// 请求消息,包含两个参数// 响应消息。原创 2025-03-30 12:06:04 · 992 阅读 · 0 评论 -
C#链表栈的底层实现
和之前文章数组栈类似。1.定义栈接口using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace 数组栈{ public interface IStack<E> { //栈中元素数量 int Count { get; } //是否为空原创 2021-04-12 23:41:20 · 451 阅读 · 0 评论 -
C#异步编程基础(线程的基础都在这里,内容比较多,认真看。)async/await
创建线程线程的一些基本属性CurrentThread:返回当前正在执行的线程,通过Name获取。Console.WriteLine(Thread.CurrentThread.Name);Thread.Join()&Thread.Sleep()Join()例子: class Program { static void Main(string[] args) { Thread t = ne原创 2021-10-27 10:18:01 · 1150 阅读 · 0 评论 -
C#-力扣-141. 环形链表
假想「乌龟」和「兔子」在链表上移动,「兔子」跑得快,「乌龟」跑得慢。当「乌龟」和「兔子」从链表上的同一个节点开始移动时,如果该链表中没有环,那么「兔子」将一直处于「乌龟」的前方;等到「乌龟」进入环时,由于「兔子」的速度快,它一定会在某个时刻与乌龟相遇,即套了「乌龟」若干圈。具体地,我们定义两个指针,一快一满。链接https//leetcode.cn/problems/linked-list-cycle/solution/huan-xing-lian-biao-by-leetcode-solution/...原创 2022-07-28 17:30:02 · 312 阅读 · 0 评论 -
C#实现二叉树的最大深度
链接:https://leetcode.cn/problems/maximum-depth-of-binary-tree。著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。给定二叉树 [3,9,20,null,null,15,7],二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。该题和二叉树的层遍历有相似之处,稍做修改即可。说明: 叶子节点是指没有子节点的节点。给定一个二叉树,找出其最大深度。来源:力扣(LeetCode)返回它的最大深度 3。原创 2022-09-03 21:58:20 · 1167 阅读 · 0 评论 -
C#-算法-两数之和(哈希表实现)
哈希表求解原创 2022-07-18 12:43:20 · 227 阅读 · 0 评论 -
C#-力扣-383. 赎金信
首先统计magazine中每个英文字母aa的次数cnt[a],再遍历统计ransomNote中每个英文字母的次数,如果发现ransomNote中存在某个英文字母cc的统计次数大于magazine中该字母统计次数cnt[c],则此时我们直接返回false。如果字符串magazine的长度小于字符串ransomNote的长度,则我们可以肯定magazine无法构成ransomNote,此时直接返回false。著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。...原创 2022-07-27 23:37:44 · 1664 阅读 · 0 评论 -
C#-力扣-36. 有效的数独
请你判断一个9x9的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。链接https//leetcode.cn/problems/valid-sudoku。数字1-9在每一个以粗实线分隔的3x3宫内只能出现一次。主要就是把遍历的数独分别存入到对应的行列和3*3的区域中,然后进行判断。只需要根据以上规则,验证已经填入的数字是否有效即可。一个有效的数独(部分已被填充)不一定是可解的。数字1-9在每一行只能出现一次。数字1-9在每一列只能出现一次。...原创 2022-07-26 17:45:36 · 208 阅读 · 0 评论 -
C#-算法-贪心算法
动态规则和贪心算法实现最优求解。原创 2022-07-17 11:47:28 · 401 阅读 · 0 评论 -
C#用一个简单的例子,告诉你async/await的用法。
namespace 基础阶段{ class Program { static void Main(string[] args) { For(); Console.WriteLine("我是主线程"); Console.WriteLine("我是主线程"); Console.WriteLine("我是主线程"); Console.ReadKe原创 2021-10-27 10:19:41 · 535 阅读 · 0 评论 -
C# 异步日志记录类,方便下次使用,不用重复造轮子
最后实现的效果,简洁明了。原创 2023-11-10 15:04:09 · 758 阅读 · 0 评论 -
C# 异步编程,有时候我们需要拿到异步任务计算体完成计算的数据,请使用task.AsyncState去获取。
直接上代码,运行下就知道怎么回事呢。就是你任务初始化传入的对象。原创 2023-11-10 17:19:43 · 426 阅读 · 0 评论 -
C#之抽象abstract,密封类和密封成员sealed
派生类(子)转基类(父),叫向上转型,为隐式。抽象是一种概念,一种设计方式的集中体现。基类(父)转派生类(子),叫向下转型。性能提升,可以忽略不计。原创 2023-03-08 16:38:07 · 117 阅读 · 0 评论 -
C#之多态的简单使用`virtual`,`override`用法。
假如有个图形类为基类,有个绘制功能。现在来了个方形和圆形,都继承于图形基类。这样大家都有了基类的绘制功能。这个时候圆形对应需要绘制圆形图案,方形需要绘制方形。这时候就需要用到多态了,即:同一个行为具有多个不同表现形式或形态的能力。多态是同一个行为具有多个不同表现形式或形态的能力。虚方法和重写对应的关键字分别为。这样就实现了一个简单的多态。原创 2023-03-08 15:03:20 · 261 阅读 · 0 评论 -
C#之索引Index和范围Range的使用。
比如我们想获得数组中的倒数第一个元素。我们可以通过C#内置函数。假如你想返回前3个元素。那么可以使用Range,比如。返回倒数第二个元素就直接。简单介绍下索引和范围的简单使用。索引的简单定义:如类索引。原创 2023-03-06 17:25:47 · 705 阅读 · 0 评论 -
C#实现全盘扫描,找到符合要求的文件,并把路径写入到TXT中
最近领导安排了个任务,让把服务器上符合要求的文件的路径找出来。windos自带的搜索功能太慢了,everything不想下载,想着自己实现一个,实现完成发现速度也不是很慢。第二步,遍历文件,这个一看就是费脑力的活,自己写估计效率很低,这个直接网上参考了国外大佬实现的类,直接用就行了。下面贴出具体实现代码,代码有注释。的类,可以获取到所有驱动器相关的信息。好了,今天文章已水完~希望大家有收获。1.先把电脑中的所有驱动器名称拿到。好久没更新文章了,来水一篇。3.符合要求的文件写入文本。2.遍历启动器中的文件。原创 2022-12-02 15:10:41 · 3392 阅读 · 3 评论 -
Windows核心编程篇——Hook编程(钩子编程)(C#版)
应用程序有自己的截获方式,那么操作系统呢,也有自己的截获方式,那就是使用钩子技术。(这里以windows系统为例)原创 2022-10-12 19:14:16 · 3094 阅读 · 0 评论 -
C# 获取鼠标选中的文字(屏幕取词)
本来想做鼠标选中翻译小软件,但发现鼠标选取文字获取并不是很容易,经过不断努力,最终实现。原创 2022-10-11 12:35:59 · 3363 阅读 · 0 评论 -
操作系统之信号量(Semaphore)以及再C#中的应用,通过信号量实现资源共享,互斥锁,和线程同步操作。
信号量(Semaphore) 是一种比互斥锁更强大的同步工具,它可以提供更高级的方法来同步并发进程或线程。它本质上是一个类型的整数,。而信号量的原子操作,一般就2个一个是表示test另一个是表示增加,简单点理解就是P内部执行等待和测试操作,V内部代码执行添加操作。可以通过信号量控制线程的并发同步操作,并且也可以通过信号量解决互斥锁的问题。下面将通过简单的例子分别介绍当信号量初始化值为0 OR >1 OR .........原创 2022-06-09 18:07:53 · 3001 阅读 · 0 评论 -
C#多线去对数据库进行添加操作,ManualResetEvent报The number of WaitHandles must be less than or equal to 64解决方案
今天做项目有个需求,就是添加添加10万条数据到数据库,或者更多,然后为了能提高效率,很当然的想到了多线程操作。问题但是,我们通过foreach去开辟线程的时候,该如何去判断所有线程都执行完了呢?解决:这里网上找了些资料最后决定用ManualResetEvent这个类去实现对线程的控制,大概内容就是通过这个类 给每个独立的线程添加一个信号量,可以添加到线程代码的最后,通过Set()去设置,如果被标记,就代表这个线程执行完毕了。具体ManualResetEvent用法可以参考这篇文章ManualRese原创 2022-04-19 16:32:31 · 900 阅读 · 0 评论 -
C#实现全局通信。
有时候在开发过程中,框架提供的通信机制可能无法满足我们的要求,这时候我们自己可以定义一个全局的事件注册器,类似于观察者模式,下面直接上代码。 public static class EventDispatcher { private static Dictionary<string, Action<object>> _actions; static EventDispatcher() { _actio原创 2022-04-13 16:55:04 · 557 阅读 · 0 评论 -
C#二分查找
网上看了很多计算二分查找的一个中间索引的一个计算 基本都是 中间索引=(左值+右值)/ 2 这种方式进行计算,这种方式其实是有个小Bug的,就是当数值很大的时候会有可能照成数值溢出。因为数值相加容易溢出,正确的应该是相减然后加一个最小量来计算 中间索引=左索引 +(右索引-左索引)/ 2 这样可以很好的解决溢出问题,相比较加法而言。好了,二分查找原理网上很多,就不赘述了。我就直接贴我代码,方便日后使用。using System;using System.Collections.Generic;us原创 2022-03-19 16:23:43 · 1025 阅读 · 0 评论 -
C#特性Attribute用个简单的Dome理解
C#特性Attribute官网接下来通过自定义邮箱特性,简单看看特性用法,特性用途很多,如用作过滤器的筛选,权限验证等,接下来直接看代码。首先定义一个学生类using MyAttribute.NewAttributes;using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace MyAttribute{原创 2022-02-27 16:01:50 · 167 阅读 · 0 评论 -
C#反射用法合集Reflection
本文只介绍使用方式,不介绍理论基础。理论和详细教程请直接看官网测试类using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using static System.Console;namespace SqlDB{ public class ReflectionTest { private Re原创 2022-02-26 23:14:50 · 494 阅读 · 0 评论 -
C#编写通用的泛型枚举类型,获取DisplayAttribute描述
直接上代码,通过反射获取。using BootstrapBlazor.Components;using System;using System.Collections.Generic;using System.ComponentModel;using System.ComponentModel.DataAnnotations;using System.Linq;using System.Reflection;using System.Text;using System.Threading.原创 2022-02-25 11:16:23 · 994 阅读 · 0 评论 -
C#委托实例,+=,-=以及Null的处理。
例子:定义一个枚举,进行日志筛选 public enum Severity { Verbose, Trace, Information, Warning, Error, Critical }把错误消息输出到控制台,并记录到txt文本。 这里采用+=的形式,进行委托注册。委托内注册方法 static void Main(string[] args) {原创 2022-01-06 10:26:05 · 1535 阅读 · 0 评论 -
C# Event事件的用法。
针对于Broadcaster类型里面的代码,PriceChanged就相当于是委托。例子:using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace 事件event{ public delegate void PriceChangedHandler(decimal oldPric...原创 2021-11-01 22:58:55 · 601 阅读 · 0 评论 -
C#进行简单的词频统计
代码如下:using System;using System.Collections;using System.Collections.Generic;using System.IO;using System.Linq;using System.Text;using System.Text.RegularExpressions;using System.Threading.Tasks;namespace 泛型{ class Program {原创 2021-10-17 17:04:09 · 1226 阅读 · 0 评论 -
C#底层模拟实现Stack数组栈,栈的先进后出。
对于栈,普通用户只需要能够获取栈的元素数量,是否为空,增删查,就可以了,所以我们定义一个规范。*====接口*定义一个泛型接口IStackusing System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace 数组栈{ interface IStack<E> { //栈中元素数量原创 2021-04-11 23:58:59 · 529 阅读 · 0 评论 -
C#装箱和拆箱,泛型和非泛型比较。
装箱:是值类型转换为引用类型拆箱:引用类型转换为值类型 引用类型:任何称为类 的类型都是引用类型,使用class修饰 如:string object 值类型:所以值类型都称为结构或者枚举,使用struct或enum修饰 如:int float double char简单的了解了什么是装箱拆箱后现在我们来看ArrayList和泛型的一个简单对比 看代码using System;using System.Colle原创 2021-04-05 18:06:37 · 384 阅读 · 0 评论 -
C#动态数组ArrayList类的实现,动态扩容动态缩容实现。增删改查的底层实现
主要实现动态扩容动态缩容,增删改查的底层实现。代码有注释。可以直接复制类去跑。using System;using System.Collections;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace DataStucte{ class Program { static System.Di原创 2021-04-02 00:11:56 · 919 阅读 · 0 评论 -
C#解决窗体重绘闪烁问题---双缓冲机制
双缓冲使用内存缓冲区来解决由多重绘制操作造成的闪烁问题。 当启用双缓冲时,所有绘制操作首先呈现到内存缓冲区,而不是屏幕上的绘图图面。 所有绘制操作完成后,内存缓冲区直接复制到与其关联的绘图图面。 因为只在屏幕上执行一项图形操作,所以消除了与复杂绘图操作关联的图形闪烁。对于大多数应用程序而言,由 .NET Framework 提供的默认双缓冲将提供最佳结果。 默认情况下,标准 Windows 窗体控件是双缓冲的。 可以通过两种方法对窗体和所创作的控件启用默认双缓冲。 一种方法是将 DoubleBuffered原创 2021-03-23 01:17:08 · 2005 阅读 · 1 评论 -
C#中的Lambda表达式的演化过程
=============演化过程转载 2021-03-17 17:28:25 · 154 阅读 · 0 评论 -
C#泛型详解
====================C#泛型详解转载 2021-03-17 17:22:15 · 86 阅读 · 0 评论 -
C#互斥锁Mutex的用法
C#中Mutex是互斥锁,位于System.Threading 命名空间中。顾名思义,它是一个互斥的对象,同一时间只有一个线程可以拥有它,该类还可用于进程间同步的同步基元。如果当前有一个线程拥有它,在没有释放之前,其它线程是没有权利拥有它的。我们可以把Mutex看作洗手间,上厕所的人看作线程;上厕所的人先进洗手间,拥有使用权,上完厕所之后出来,把洗手间释放,其他人才可以使用。线程使用Mutex.WaitOne()方法等待C# Mutex对象被释放,如果它等待的C# Mutex对象被释放了,它就自动拥有原创 2021-03-15 13:14:49 · 2766 阅读 · 0 评论 -
C#多线程Monitor类锁定资源Monitor.TryEnter()的用法。通过一个例子告诉你什么是死锁。和解决方案
Monitor.TryEnter(lock1, TimeSpan.FromSeconds(5))该方法是检查锁对象在指定时间内是否释放资源,如果释放则返回true否则false下面是死锁的例子:(大家复制到自己VS中跑一下,我给的是完整控制台代码,打断点调试一下,结合着我的注释,写的很详细。应该会理解的。)using System;using System.Collections.Generic;using System.Linq;using System.Text;using System原创 2021-03-14 18:20:18 · 2060 阅读 · 0 评论 -
C#的异常处理之Throw关键字
C#的异常处理之Throw关键字转载 2021-03-13 18:06:22 · 878 阅读 · 0 评论 -
C#如何让主窗体再后台运行,不在windows窗体显示。
将主窗体的ShowlnTaskbar属性设为 False,将其 WindowState属性设为 Minimized,程序即可变成后台运行程序。原创 2021-02-26 15:56:20 · 1528 阅读 · 0 评论 -
C#网络编程客户端(TcpClient)服务端(TcpListener)实现聊天通信
效果如图:服务端主要通过TcpListener类的Start方法监听,通过Acceptsocket方法来接收请求信息。下面分别给出三个按钮的代码:服务器 开始监听代码如下:private void button1_Click(object sender, EventArgs e) { try { //在指定端口上侦听 listenner = new TcpList原创 2021-02-22 15:50:10 · 2685 阅读 · 0 评论 -
C#网络编程之异步模式下的套接字(Socket)服务器和客户端(聊天工具)开发
先看实现效果:代码下载点击这里异步开发设计思路和同步开发设计思路一样可以简单看下同步开发异步开发的区别在于,接收信号的方法和发送信息接收信息的方法还有连接的方式采用了异步模式。接收信号采用 Socket 的BeginAccept()发数据采用BeginSend()接收数据采用的BeginReceive()连接采用的是BeginConnect()这些方法的具体用法可以自行百度。下面来看服务器的核心代码。监听代码: try { /原创 2021-02-21 16:44:57 · 672 阅读 · 0 评论