Edi Wang

.NET and Azure Developer

C#

我在《上海轨道交通》应用中是如何解析XML数据的

本文针对.NET初学者介绍LINQ TO XML,你会看见很多为了通俗易懂而故意描述得不专业的语句,所以高手勿入!本文介绍的方法不只针对WP,其他任何.NET项目也可以参考。 我在Windows Phone平台上发布的《上海轨道交通》使用的是离线XML作为数据存储。好处是不需要安装任何三方库,.NET自己就有能力解析。如果用JSON装逼还得下载JSON.NET呢。又因为都是只读数据,也用不着为了装逼而用SQL Lite或SQL CE什么的数据库杀鸡用牛刀。 下面介绍一下如何在工程里内嵌XML文件并解析到对象的一般方法。 《上海轨道交通》的XML文件保存的是所有的站点信息,单个节点看起来就像这样: 由此可见,一个站点包括了多个 …
C# XML

如何让应用程序要求以管理员身份运行(C#)

从Windows Vista开始,为了防止操作系统被恶意软件菊爆,Windows加入了UAC机制,在没有关闭UAC的时候,用户的程序都没有管理员权限去执行。但是如果软件需要做一些操作,比如读写注册表,就需要以管理员身份启动。然而普通用户并不清楚这一点,这有可能导致我们的程序被差评,如果是个妹子,发现你的软件不能用,那你连好人卡都收不到了。 幸好,用.NET开发的程序可以很方便的做到自动要求以管理员身份运行。 首先为了达到演示效果,我需要在程序界面上通知当前环境是不是以管理员身份运行,为此我找了一个UACHelper,这个东西挺实用的,就算不是以管理员身份运行的,也不会在用户面前直接爆掉。 public static class UacHelper { private const string uacRegistryKey = "Software\\Microsoft\\ …
C# Windows UAC

巧用委托简化重复代码

在C#编程中通常会碰到许多重复劳动的情况,而面向对象编程的原则就是消除这些重复劳动,增加代码重用性。我们虽然有很多基本的模式去做抽象和封装,但还是会碰到一些看似不得已的重复劳动的情况。比如你在写一个数据访问层的类,按照规范,每个方法都需要加try-catch,就像这样: public void Method1() { try { // logic... } catch (DataException ex) { // fuck the ex... } } public void Method2() { try { // logic... } catch (DataException ex) { // …
C# lambda Delegate

Performance tips for Entity Framework

自从我用了EF,每次都很关心是否有潜在的性能问题。所以每次我写LINQ查询,都会使用SQL Profiler看一下实际生成的SQL语句,以便发现潜在的性能问题。也强烈建议大家这么去做,以免日后软件大了出了问题很难查。 一、只选择某列或某些列 有些时候,在C#里写LINQ虽然看着舒服,但性能不一定好,所以有必要做一些调整。比如这种情况: 我需要知道一篇文章的点击数,仅此而已,我可能会写: context.Post.FirstOrDefault(p => p.Id == postId).Hits; 或者: context.Post.Find(postId).Hits; 我期待着他们只去数据库里筛选Hits这一列的数据,然而,通过SQL Profiler会发现,这两条语句居然把全部列都给select出来了,访问Hits的操作实际是在内存中进行的。 虽然小表看不出性能问题,但万一你的表里有一列是存 …
C# ADO.NET Performance

在Entity Framework中使用LINQ语句分页

我们知道,内存分页效率很低。并且,如果是WebForm的项目,页面上会有巨型ViewState,这必然不好。我自己博客用的是一个存储过程做的分页,用到现在都挺好,没有任何效率问题。后来想到,既然项目里有Entity Framework,那为什么不利用EF完成分页呢~ 稍做研究之后发现,EF分页其实很简单。不过一样写文章了,光贴代码是不负责的,还是得稍微介绍一下相关的知识。 一、页数计算 关于分页的基本原理,网上有很多文章,我就不多叙述了。但我发现很多介绍分页的文章里,计算页码公式都掐掉了,广为流传的版本是: totalPage = totalRecord / pageSize + 1 稍微推敲一下就会发现,这个公式在totalRecord和pageSize正好整除时,会多一页。比如10条记录,每页5条,应该是2页的,但结果是3。然而,不写+1又不行,因为要考虑到记录总数小于页尺寸的情况。现 …
C# Entity Framework SQL

C#创建Windows服务入门图解(VS2010)

Windows服务大家都知道,比如Audio、Theme都是大家比较熟悉的服务,他们可以设为自动启动的,并且在注册表的开机自启动项里是没有痕迹的。所以以前曾经用来隐藏过木马。但以前搞的那个木马服务,是通过手工导注册表来做的。从来没正式的开发过一个服务。 之前做的一个项目里有人用Service的方法定时获取远程数据,很犀利,我感觉还是挺有用的。所以今天我也开荒了一下用C#开发Windows服务,正规的体验了一下开发流程。下面就是我做的最入门的例子,MSDN上有类似的教程,但MSDN漏了一些比较重要的步骤,所以大家请看我开荒成功的版本: 首先,在VS2010里建立一个Windows Service项目: 它会提供我们一个默认的Serivce1,可以删掉,换成自己的。比如Fucker.cs,当然,你得把Program.cs里调用的语句换掉: static void Main() { …
C# Service

Read Excel 2010 via C#

昨天一个同学让我帮忙写个小工具,读一个Excel,只读B列的内容。我拿C#写了一个.NET4的winform程序。虽然简单,但有很多可圈可点的地方,因此撰写本文以警后人。 那个Excel是2010格式的,所以我们先要安装AccessDatabaseEngine,下载地址如下: http://download.microsoft.com/download/7/0/3/703ffbcb-dc0c-4e19-b0da-1463960fdcdb/AccessDatabaseEngine.exe 这样程序读取Excel的时候就不会抛出OleDb驱动未注册的异常了。 我们先看看Excel文件,格式很简单: 我们需要读的,是B列除标题以外的内容。即B2到B6的内容,观察到它是字符串,所以程序里要作为string读取。 程序界面设计如下,点击ReadExcel后,会将B列的内容显示到listBox1里: …
C# DataTable Excel

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 = …
C# Algorithm Refactor

当using遇到return

C#一大牛逼之处就是using语句简化了我们的程序。它的作用是在using结束后,立即释放被引用的资源。实质其实是调用被引用对象的Dispose()方法。这也是为喵被using的类型一定要实现IDisposable接口。虽然在.NET和JAVA里,程序员都不用关心手动释放内存的问题,但我认为在使用资源的时候加上using,是一种良好的习惯。有时候如果你不释放资源的话,可能会发生独占的问题。 好了,扯多了,话说回来,看看我今天遇到的一个有意思的问题。 今天心血来潮,想检验一下自己的代码,于是给项目启用了代码分析,用的是“Microsoft最少量建议规则”。结果以下代码产生了编译警告: public DataSet ExecuteDataSet(DbCommand cmd, Trans t) { cmd.Connection = t.DbConnection; cmd. …
C#

LINQ to List泛型的几种简单查询

最近比较喜欢LINQ,真是碉堡了。下面写了个例子演示一下LINQ对List的操作,包括排序、where条件、选部分数据等查询。最近偷懒,不写注释了,大家自己看一下就明白了~ 测试用的BLL和Model public class TestBLL { public List GetList() { return new List() { new TestModel(){ Id=1, Name="RYWE", Content="IOJADJ", Posttime=DateTime.Now.AddHours(1) }, new TestModel(){ Id=2, Name="JGFA", Content="CAFYRE", Posttime=DateTime.Now.AddHours(0) }, …
C# Generics