Web Analytics
yangyang

码农兼一个普普通通小青年

All Posts


一些有关Excel的小技巧

在日常工作中的有些需求,比如数据分析和预处理,通过其它工具比如Excel点点鼠标也能解决,而且可能比写代码还快。Excel有很多强大的功能,这里只简单介绍一下我在Excel里面用到的一些小功能。这些功能包括,分列,函数,高级复制粘贴,以及数据透视表 …

Pivot Table

DataGridView绑定到DataTable和BindingList的分析与比较

本文介绍了使用DataGridView绑定数据的两种方法,一种是直接将其DataSource属性绑定到DataTable的DefaultView,绑定后它默认就支持排序,筛选等高级功能,另外当DataTable值发生变化是,DataGridView也会跟着刷新,它的缺点是DataTable结构过于重,而且对于单元格赋相同的值时,仍然会触发事件,这在有些场景下会影响刷新效率。另外一种方法时DataGridView绑定到BindingList实体,它的有点在于能够进行更多的精细控制,并且在有些情况下效率会更高,缺点就是内置的BindingList对象并没有实现诸如排序,筛选等功能。针对BindingList的缺点,本文介绍了BindingListView这个第三方的库,它完美解决了BindingList默认不支持排序和筛选,且要实现筛选筛选功能单一的问题。最后介绍了通过将条件表达式字符串转换为 …

DataTable DataGridView BindingList BindingListView DataBinding

将条件字符串解析为lambda表达式

将条件字符串动态解析并转换为lambda表达式在很多场景下非常有用,它一方面便于实现逻辑和配置的分离,另一方面也提供了更大的灵活性。在很多场景我们都能看到这种将条件表达式字符串保存起来,然后动态解析执行的列子,比如股票软件里面的公式编辑器、比如规则引擎RulesEngine。通常,要手动实现将条件表达式字符串解析为lambda表达式是困难的,因为这会用到一些编译器里面类似的诸如语法分词,词法分析的内容。 虽然在C#中,可以运用之前介绍的表达式树ExpressionTree来一定程序上简化这些操作,但要手动解析,仍然十分繁琐。本文站在巨人的肩膀上介绍两种,一种是System.Linq.Dynamic.Core,一种是使用Roslyn的Microsoft.CodeAnalysis.Scripting。 …

RulesEngine Roslyn lambda ExpressionTree CodeAnalysis Dynamic LINQ

一种实时监控日志文件变更并读取变更内容的方法

本文介绍了一种监控日志文件变化,并读取变动内容的方法。通过使用FileSystemWatcher类,可以监控文件变化,并通过回调事件触发通知。为了避免文件频繁变动导致频繁的文件读写,这里使用了一个定时器来定时读取。当文件距离上一次读取发生变化时就读取。在读取文件的时候,由于涉及到多进程读写同一个文件,所以这里创建了FileStream并通过指定FileShare参数,而不是直接创建StreamReader来解决了读写冲突导致日志文件丢失的问题。在解决这一问题的过程中,还分析了long4net源码中RollingFileAppender写入文件时的FileShare参数以及StreamReader源码中,如果直接指定path时FileStream的参数。 …

RollingFileAppender log4net FileShare FileSystemWatcher

在C#应用程序中根据不同的编译环境动态生成相应的配置文件

在开发应用程序的时候,会有不同的解决方案配置,在ASP.NET Core时代,针对不同环境的不同配置,Visual Studio原生提供了很好的支持,但对于Winform来说,要实现多环境不同配置则需要花一些功夫。本文首先演示了ASP.NET Core里面如何针对不同的环境配置不同的配置文件,紧接着介绍了在Winform中使用Visual Studio编译后任务的功能,通过手动修改项目文件来实现了不同的编译环境的不同配置,最后针对Visual Studio编译后任务实现不同环境不同配置文件的两个缺点,介绍了使用SlowCheetah第三方插件,结合SlowCheetah的Visual Studio的插件来实现这一功能,简单方便依赖少。希望本文对您了解这一功能有所帮助。 …

SlowCheetah UAT STAGING CONFIGURATION WINFORM

Windows消息系统

窗体和消息系统是两个紧密联系的概念,本文介绍了Window的消息系统以及消息循环。在此基础上演示了如何使用Window窗体来进行消息通讯。 …

windows message message queues

告别暴力终止线程

有时候需要让一个线程终止运行,.NET Framework的Thread类中提供了Abort方法,调用某个线程实例对象的Abort方法,可以让该线程类抛出一个ThreadAbortException从而终止该线程的运行。但使用Abort方法终止一个线程对象显得比较暴力,而且可能会有很多潜在的问题,尤其是一个线程调用另外一个线程的Thread.Abort方法终止时。好消息是从.NET 5.0开始Thread.Abort方法就已经被弃用,如果调用就会抛出“PlatformNotSupportedException”,本文主要介绍简单粗暴杀手线程的可能危害,以及如何优雅地退出线程的方法。 …

Thread.Abort cooperative cancellation model CancellationTokenSource

Aho-Corasick多模式匹配算法

aho-corasick-automation简称AC自动机算法,它是一个经典的多模式匹配算法,它借鉴了KMP算法的思想,可以由有限状态机来表示。具体实现中可以通过构建状态转移函数,失配函数,结果输出函数来实现。用于匹配的FSA跟输入的字符串无关,只跟模式串有关。匹配中如果发生失败,则FSA回退到某一状态,而输入的字符串则无须回退,从而能够实现通过一次遍历给定的字符串来查找所有的关键字匹配。 …

aho-corasick pattern-match automation kmp

使用Mono.Cecil将函数注入到模块的初始化构造器中

本文介绍了模块默认的模块初始化构造(Module Initializer)及其作用,进一步介绍了如何使用Mono.Cecil这一强大的IL语言修改器来修改已经编译好的程序集,来将注册AppDomain的AssemblyResolve事件逻辑,注入到模块的初始化构造器中,以实现将第三方依赖dll嵌入到资源文件中,程序集在动态加载时能够自动加载依赖的dll的功能。 …

Mono.Cecil Injection MSIL AppDomain Assembly Resolve Module Initializer Fody

将.NET应用程序发布为单一的可执行文件

本文简单介绍了在.NET中将程序打包为单文件的原理,并在.NET Framework和.NET Core中分别做了演示。在.NET Core中单文件部署比较简单,Visual Studio中自带的发布选项就能实现单文件部署。而.NET Framework中则需要手动添加依赖的dll到资源文件并将其“生成操作”设置为“嵌入的资源”,并且还需要注册AppDomain的AssemblyResolve事件,编写代码手动到资源文件里面加载对应的dll,比较繁琐。但借助第三方的工具比如Costura这个类库,就能十分方便的不用做任何修改的情况下,就能将程序发布为单文件应用。 …

Costura Single exe