![](https://img-blog.csdnimg.cn/20200615084012712.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
C#
文章平均质量分 59
学习分享 c#相关的知识,包括IL、core等知识。
子时已过
这个作者很懒,什么都没留下…
展开
-
协变(List泛型作为方法参数时的父类子类问题)
CS1503:参数1:无法从"System.Collections.Generic.List" 转换为"Person"原创 2024-05-23 15:49:02 · 376 阅读 · 0 评论 -
Unity面向切面编程
AOP:面向切面编程原创 2024-04-18 12:07:33 · 379 阅读 · 1 评论 -
主线程捕获子线程异常
正常情况下使用多线程出现异常时,都是按照单个任务去处理异常,在线程间不需要通信的情况下,任务之间互不影响,主线程也不必知道子线程是否发成异常。但是在某些复杂业务中,多个线程在执行过程中如果出现异常需要反馈给主线程,所以需要在子线程出现异常时通知主线程。那么只需要处理子线程异常即可。原创 2024-04-15 16:23:39 · 428 阅读 · 0 评论 -
Operation is not supported on this platform.
Operation is not supported on this platform.原创 2024-04-11 14:23:13 · 381 阅读 · 0 评论 -
.net 使用Docker开发
.net 使用Docker开发原创 2022-04-09 19:37:42 · 2548 阅读 · 0 评论 -
函数式数据结构-列表
在开始之前我们先了解几个名词:1、什么是函数式编程:函数式编程属于"结构化编程"的一种,主要思想是把运算过程尽量写成一系列嵌套的函数调用,可以说是面向过程的程序设计。2、函数式编程的优势:函数式编程大量使用函数,减少了代码的重复,因此程序比较短,开发速度较快。易于"并发编程" 。函数式编程不依赖、也不会改变外界的状态,只要给定输入参数,返回的结果必定相同。3、什么是函数式数据结构:函数式数据结构只能被纯函数操作,纯函数一定不能修改原始数据结构或者产生副作用。函数式数据结构被定义为不可变的。原创 2021-01-12 08:38:46 · 307 阅读 · 0 评论 -
多线程那点事—Parallel.for
先看段代码:for (int i = 0; i < 10; i++){ Task.Factory.StartNew(()=>Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId} ~ {i}"));}从代码上可以看出我们预期是打印1~10,但实际的打印结果是:7 ~ 104 ~ 1010 ~ 109 ~ 104 ~ 103 ~ 105 ~ 109 ~ 106 ~ 108 ~ 10与预期的不一原创 2021-01-02 19:24:09 · 635 阅读 · 1 评论 -
函数式编程-记忆化缓存
记忆化,是一种为了提高应用程序性能的FP技术。程序加速是通过缓存函数的结果实现的,避免了重复计算带来的额外开销。1、现在我们使用Dictionary作为缓存结构public static Func<T, R> Memoize<T, R>(Func<T, R> func) where T : IComparable{ Dictionary<T, R> cache = new Dictionary<T, R>(); r原创 2021-01-01 20:39:15 · 281 阅读 · 1 评论 -
C#数据结构-赫夫曼树
什么是赫夫曼树?赫夫曼树(Huffman Tree)是指给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小。哈夫曼树(也称为最优二叉树)是带权路径长度最短的树,权值较大的结点离根较近。public class HNode<T>{ public HNode() { data = default(T); weight = 0; leftNode = null; rightNode = nul原创 2020-12-19 21:02:18 · 350 阅读 · 2 评论 -
C#数据结构-线索化二叉树
为什么线索化二叉树?对于二叉树的遍历,我们知道每个节点的前驱与后继,但是这是建立在遍历的基础上,否则我们只知道后续的左右子树。现在我们充分利用二叉树左右子树的空节点,分别指向当前节点的前驱、后继,便于快速查找树的前驱后继。不多说,直接上代码:/// <summary>/// 线索二叉树 节点/// </summary>/// <typeparam name="T"></typeparam>public class ClueTreeNode<原创 2020-12-16 21:08:05 · 165 阅读 · 0 评论 -
C#数据结构-二叉树-链式存储结构
对比上一篇文章“顺序存储二叉树”,链式存储二叉树的优点是节省空间。二叉树的性质:1、在二叉树的第i层上至多有2i-1个节点(i>=1)。2、深度为k的二叉树至多有2k-1个节点(k>=1)。3、对任何一棵二叉树T,如果其终结点数为n0,度为2的节点数为n2,则n0=n2+1。4、具有n个节点的完全二叉树的深度为log2n+1。5、对于一棵有n个节点的完全二叉树的节点按层序编号,若完全二叉树中的某节点编号为i,则若有左孩子编号为2i,若有右孩子编号为2i+1,母亲节点为i/2。在此记原创 2020-12-06 16:05:00 · 395 阅读 · 0 评论 -
C#数据结构-二叉树-顺序存储结构
什么是二叉树:每个树的节点只有两个子树的树形结构。为什么使用顺序存储结构:使用数组存放满二叉树的各结点非常方便,可以根据一个结点的索引号很容易地推算出它的双亲、孩子、兄弟等结点的编号,从而对这些结点进行访问,这是一种存储二叉满二叉树或完全二叉树的最简单、最省空间的做法。 /// <summary>/// 顺序存储二叉树/// </summary>public class SequentialStorageBinaryTree<T>{ /// <原创 2020-12-05 20:59:55 · 285 阅读 · 1 评论 -
DataTable 将一列转为List
c# linq用起来特方便,因此我们习惯性的用list来操作,这里我们将 DataTable 一列转为List:List<T> homeworkIdList = (from r in dataTable.AsEnumerable() select r.Field<T>("列名")).ToList<T>();原创 2020-12-03 09:09:38 · 1007 阅读 · 0 评论 -
字符串匹配—KMP算法
KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度O(m+n) 。实现方式就不再这里献丑了,网上很多讲解,此处只是记录下c#实现的代码。public class KMP{ public原创 2020-11-23 08:39:53 · 175 阅读 · 0 评论 -
C#数据结构-线程安全队列
什么是线程安全?答:线程安全是多线程编程时的计算机程序代码中的一个概念。在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。前面几篇写的线性结构,在多线程并行的情况下会出现共享数据会线程间读取与写入不一直的情况,为了解决这种情况,通常会使用锁来解决,也就是将并行改为串行。但是在使用穿行违背了使用多线程并发的初衷,这种情况下我们可以考虑采用线程安全结构。先看下线程安全队列的用法:ConcurrentQueue<i原创 2020-10-30 08:10:05 · 1016 阅读 · 0 评论 -
C#数据结构-HASHSET
命名空间:System.Collections.Generic先看一下官方说明:类提供了高级的设置操作。集是不包含重复元素的集合,其元素无特定顺序。HashSet 对象的容量是对象可以容纳的元素数。当向对象添加元素时,HashSet 对象的容量会自动增加。HashSet<String> hashSet = new HashSet<string>();hashSet.Add("test");hashSet.Add("test");Console.WriteLine(hash原创 2020-10-24 18:08:00 · 838 阅读 · 0 评论 -
C#番外篇-SpinWait
SpinWait封装常见旋转逻辑。在单处理器计算机上,始终使用 “生成” 而不是 “繁忙等待”,在装有超线程技术的 Intel 处理器的计算机上,这有助于防止硬件线程不足。SpinWait 封装了一种很好的旋转和真正的生成。SpinWait是一个值类型,这意味着低级别代码可以使用 SpinWait,而不必担心不必要的分配开销。SpinWait 对于普通应用程序通常不起作用。在大多数情况下,应使用由 .NET Framework 提供的同步类,如 Monitor 。但在需要自旋等待的大多数情况下, Spin原创 2020-10-23 16:22:01 · 2119 阅读 · 7 评论 -
C#数据结构-队列
队列作为线性表的另一个数据结构,只允许在表的前端进行删除操作,而在表的后端进行插入操作,和栈一样,队列是一种操作受限制的线性表。先来看下用法: Queue queue = new Queue(); queue.Enqueue(1); queue.Enqueue(2); queue.Enqueue(3); queue.Enqueue(4); foreach (va原创 2020-10-21 08:52:17 · 194 阅读 · 0 评论 -
C#数据结构-链栈
上一篇我们通过数组结构实现了栈结构(准确的说是栈的顺序存储结构),现在我们通过链(单链)存储栈,也就是链栈。通常对于正向单链表来说,是从头节点开始,在链的尾部附加节点,前一个节点的指针指向附加节点;对于实现栈结构来说是在栈顶(链尾部)插入节点,指针指向上一个节点,所以实现栈结构的链可以说是反向单链表。public class LinkStackNode<T>{ /// <summary> /// 数据存储 /// </summary>原创 2020-10-15 16:45:17 · 274 阅读 · 0 评论 -
C#数据结构-栈
栈的定义不需要多说,相信大家都非常熟悉,但是,在实际应用中栈的应用我们很少想到会去用栈结构,先上代码看下用法: Stack st = new Stack(); st.Push('A'); st.Push('B'); st.Push('C'); st.Push('D'); foreach (char c in st) { Console.Write(c + " "); } Console.WriteLine(); st.Push('E'); foreac原创 2020-10-14 14:06:03 · 231 阅读 · 0 评论 -
C#数据结构-静态链表
对于双向链表中的节点,都包括一个向前、向后的属性器用于指向前后两个节点,对于引用类型,对象存储的是指向内存片段的内存指针,那么我们可以将其简化看作向前向后的两个指针。现在我们将引用类型替换为值类型int,将链用数组代替,向后的指针替换为数组的下标,那么此时的链我们称为静态链表(或者说是单向静态链表)。不多说,直接上代码(代码已做注解) public class Node<T> { public T data { get; set; } publi原创 2020-10-13 13:03:41 · 112 阅读 · 0 评论 -
C#数据结构-双向链表
链表的概念以及链表与数组的差异不做过多的叙述,相信大家都耳熟能详,这里以c#语言实现简单的双向链表,作为备用,记录下~ public class Node<T> { private Node<T> prev; private Node<T> next; private T val; public Node<T> Prev { get { return prev; } set {原创 2020-10-11 19:26:18 · 351 阅读 · 0 评论 -
C# 学习笔记(二)——IL初探
继续学习IL代码,现在我们看下常用的属性器到底是怎么执行的:C#代码如下:using System;namespace ConsoleApp1{ public class MyClass { public MyClass(int v) { val = v; } private int val { get; set; } public int GetVal() {原创 2020-07-16 08:11:07 · 380 阅读 · 0 评论 -
C# 学习笔记(一)——VS开发汇编准备
做开发有几年了,一直忙于开发各种项目,熟悉并学习各种框架、语言的应用。虽说当今互联网大爆发,各种优秀的语言、技术更迭非常快,只学习应用都不一定跟得上脚步,但是我觉得将一门语言吃透还是很有必要的——毕竟技术是学不完的。不废话先搭建开发环境(vs 开发 汇编——为学习IL做准备):1、安装visual studo 2019,并安装c++ 开发模块。2、配置 vs 高亮显示代码。(在扩展中搜索安装asmDude)效果:3、创建一个空的project4、添加一个c++文件并修改后缀名为.asm:原创 2020-07-09 08:44:37 · 435 阅读 · 0 评论 -
DOTNET CORE MVC (一)
以控台的形式,运行.net core mvc 代码,Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>();//指定网络主机要使用的启动类型。 });返回默认的IHostBuilder ,程序初始化。根据官方说明文档:该方法做了这么多事情:将 ContentRootPath .原创 2020-07-03 08:12:38 · 211 阅读 · 0 评论