.NET Developer, Microsoft MVP

C# and .NET 61 C# Programming Language and .NET Platform


简单性能测试:使用Stopwatch测算程序执行时间

今天逛博客园,发现有人写了一篇关于List.FindAll()和For循环性能的文章,作者木有给出他的代码,因此不晓得他是怎么测时间的。我以前做这种很简单的性能测试往往都是定义两个datetime,dt1放在算法开始之前,dt2放在算法结束之后。最后用dt2-dt1计算出算法执行的时间。我相信许多人都是这么做的,并且我以前看MSDN Webcast的时候,连微软的MVP都是这样做的。所以我对datetime测时间的方法深信不疑。 不过在那片文章的回复中,我看到有人贴出了一段测试代码,其中用的是Stopwatch类。略有意思,于是研究了一下。 对Stopwatch的描述是这样的: Stopwatch 实例可以测量一个时间间隔的运行时间,也可以测量多个时间间隔的总运行时间。 在典型的 Stopwatch 方案中,先调用 Start 方法,然后调用 Stop 方法,最后使用 Elapsed...

Stopwatch Performance Testing

LINQ语句检查空对象的问题

今天在写博客的页面集功能,根据URL去寻找Page,LINQ语句从SitePage的GetModelList()集合中获取符合条件的page,如果查询不到则跳转到404页面。代码是这样的: var page = (from p in optSitePage.GetModelList() where p.VirtualUrlPath.ToLower() == requestTitle.ToLower() select p).First(); if (null == page) { context.Response.Redirect("/404.html"); return; } 我故意传了个不存在的URL,结果linq语句直接报错:System.InvalidOperationException: Sequ...

LINQ null

LINQ重写博客垃圾图片回收算法

本人博客后台管理模块有个功能,可以扫描图片上传文件夹下所有未被引用的博客。思路很简单,从所有Blog Model中解析出所有文章使用的图片文件名,排除站外引用,放入一个List usedPicList。再遍历图片上传文件夹,把所有图片文件的结果加入FileInfo[] fiAllPicList。然后比较usedPicList和fiAllPicList,找出所有fiAllPicList中有,而usedPicList中木有的图片,就是未被任何文章引用的垃圾图片了。 原先这个比较算法是用传统方法写的,很蛋疼,用了两重循环,一个标志位才解决问题: List garbagePicList = new List(); for (int k = 0; k 今天用LINQ重写了一下: List garbagePicList = new List(); var query = from...

LINQ Algorithm Refactor Rewrite

LINQ操作数组(交集,并集,差集,最值,平均,去重复)

数组是大学里经常拿来做算法练习的对象。一些经典算法非常有价值,考试、装逼、面试都十分有用。但现在是效率时代,编程讲究生产效率,利用LINQ,可以让程序猿避免写一些基本算法,把精力花在业务处理上。 下面以数组为例,展示一些常用LINQ操作。 static void Main(string[] args) { int[] a = { 1, 2, 3, 4, 5, 6, 7 }; int[] b = { 4, 5, 6, 7, 8, 9, 10 }; int[] c = { 1, 2, 3, 3, 4, 1, 2, 4, 6, 1, 6, 5 }; // 交集 var fuck = a.Intersect(b); // 并集 var shit = a.Union(b); // a有b没有的...

LINQ Array

C#多线程Singleton(单件)模式模板

最近在研究设计模式,我会陆续总结一些实用的代码出来。 下面是一个C#多线程单件模式的代码模板。把T换成你自己的类型就可以使用了。其精妙之处就在于用lock语句锁定资源来避免多线程同时走入if语句去创建多个对象。 private static volatile T _instance = null; private static object objLock = new Object(); private T() { } public static T Instance { get { if (_instance == null) { lock (objLock) { if (_instance == null)...

C# Singleton

关于C# if语句中并列条件的执行

我们知道,当两个条件进行逻辑与操作的时候,其中任何一个条件为假,则表达式的结果为假。所以,遇到(A 且 B)这种表达式,如果A为假的话,B是不是真假都无所谓了,当遇到一个假条件的时候,程序也就没有必要去额外的判断剩下的东西了。C#语言中也是如此。当多个条件进行逻辑与操作的时候,判定会从表达式左边执行到右边,遇到任何一个为假,后面就都不做了。这很聪明,然而如果后面的条件会抛出异常,就是个潜在的问题。一旦之前的条件为真,就会继续执行,执行到抛出异常的条件时,程序就爆了,哈哈。 我们可以写个简单的demo试试。下面的这段代码是坑爹的,之后我会说明原因,但大家可以先从直观的层面上理解一下,最后我会给出正确的测试方法。 static void Main(string[] args) { DataSet ds = null; if (false && ds.Tables[...

C#

C#字符和ASCII码互转

废话不多,直接上代码。 static void Main(string[] args) { char[] charFucks = new char[] { 'f', 'u', 'c', 'k' }; foreach (var item in charFucks) { Console.Write(Convert.ToInt32(item) + " "); } Console.WriteLine(); int[] asciiFucks = new int[] { 102, 117, 99, 107 }; foreach (var item in asciiFucks) { Console.Write((char)item); } Console...

ASCII char

GridView手写事件,包括取主键、取值、更新、选择、删除

刚才在调整网站友情链接管理页面,里面有个简单的GridView。因为更改了架构,所以需要手工给GridView编写编辑、删除等事件。最近也经常碰到有人问我GridView的问题,于是写成经验之书以警后人。 图片是本网站后台的友情链接管理页面: 1. 手写[编辑]功能时,要编写的事件: 一共有3个: RowEditing RowCancelingEdit RowUpdating 前两者的代码比较固定,一般都是: protected void gvFriendLink_RowEditing(object sender, GridViewEditEventArgs e) { gvFriendLink.EditIndex = e.NewEditIndex; FetchData(); } protected void gvFriendLink_Row...

GridView

用LINQ查询XML并绑定给GridView显示

前天嘴贱,建议老Y用XML存一个表格然后绑给GridView,本意是用个偷懒的办法快速解决了那个case,结果做的时候没那么方便,或者说直接把GridView绑定到一个XML文件不太好,如果通过DataTable来处理也显得比较麻烦。 比较好的办法其实是绑给业务对象,就和以前ORM一样做,GridView最终绑的是一个List。那么怎么来读取XML呢最方便呢?当然是用LINQ!可以参考我博客上的这篇文章:http://www.wyjexplorer.cn/Blog/View/EC3073A1BDFB9D90.html 今天抽出来单独写了一个Demo示众,3步搞定! 1.搞个XML文件: 1 Fucker 13838389438 No.250, Fucking Road...

GridView LINQ XML

C#将窗口最小化到系统托盘,并显示图标和快捷菜单

1. 拖一个notifyIcon和一个contextMenuStrip过来,他们会出现在窗体设计器的最下方: 然后完成你的menu,它暂时会出现在form上,但没关系,运行的时候不会显示。 2. 给notifyIcon设置icon属性,这一步很重要,不然系统托盘处不会有图标。然后将ContextMenuStrip属性设置为刚才的那个快捷菜单。 3. 现在运行程序的时候,任务栏右下角系统托盘处就会有我们的图标和菜单: 4. 现在我们来处理最小化隐藏和还原的问题: 首先要将form的ShowInTaskBar属性设为false,这样它就不会在任务栏中显示。但如果现在最小化,屏幕左下角仍然会有一条细小的标题栏。这里我们需要手工处理一下: 在form的resize事件里这样写: private void frmMain_Resize(object sender, Ev...

C# WinForm Icon