Linq延时执行

Dec 05 2010

下面的代码不总是会正常执行,如果出错的话则会报错为“序列不含任何元素”,其实,当时写的one.First()==null判断就是为了在为空时执行结果,但是,并没有达到预料的效果。

var one=from x in ds
        where x.Length>10
        select x;
if(one.First()==null)
{
    // Do Something
}
else
{
    // Do Other Things
}

因为当one没有任何结果的时候是不能正确执行Linq语句并得到结果的,这个时候就要使用SingleOrDefault来获取第一个数据。不过,最好的方式是使用.ToList().Count来进行判断,因为SingleOrDefault会出现元素多于一个而报错的情况。

在写程序的时候发现这个问题,但是却不能进行调试,查下发现原因是Linq是延迟执行的,所以在最上边一行看不到执行的结果,因为现在还没有执行。

下图,显示了其执行的过程:

IC107892

这也表示只进行数据创建或是写表达式是不会得到任何结果的。同时由于这个原因,下边的代码也是不正确的:

var one=from x in ds
        where x.Length>10
        select x;
ds.Remove(one.First());
Console.WriteLine(one.First().Length);

同样的原因,延迟执行,其实one.First()都在被调用时执行,所以Remove方法使用了以后其实ds数据集合中已经没有这个数据了,因此会报错。

这个让我想到了C#4.0中的新特性Lazy,嘿嘿~

评论关闭

模板让一切都简单

Dec 04 2010

最近做的一个项目是用代码生成器生成的代码,自己前段时间也写过一个简单的ORM映射工具,发现,对于编程的重复性劳作让成程序员成为了码农。其实,我们会发现很多程序都是不太变化的,起码基础上很相同,所以这些可以做成模板来自动生成。

对于模板代码,有微软默认的T4,还有codesmith生成器生成代码的方式,这些都挺方便,而且相应的语法都不难~今天说下简单的微软默认项目木板,使用sdk创建。

这些要求首先安装sdk,同时,还需要将.NET版本调到4.0,否则出现不了相应的项目。

其次,就是了解一些基础的项目模板占位符的表示方法,这些很简单,因为代码具有自解释性,例如$safeprojectname$,代表生成的项目名。需要的话,可以去微软的官方看下模板语言,比较简单。

项目通过build以后就会生成zip文件,这个文件包含了现在的模板项目中的文件,这个时候其实应该可以通过将zip文件导入模板文件夹实现新的项目模板导入,试了几次没有成功,好像是设置路径的原因吧。在微软官方的文档中看到可以通过生成vs插件的方式来安装新的模板,这个应该更方便,因为可以将比较不错的模板分享给大家。

插件创建的方式也不叫简单,设置一些基本信息以后,将content设置为刚才build的zip文件就行了。然后顺利安装。享受模板带来的便利吧,貌似最后文件安装位置在:

C:\Users\username\Documents\Visual Studio 2010\Projects\ProjectTemplate1\ProjectTemplate1\obj\Debug\CSharp\1033

评论关闭

岁月那个偷儿呀

Dec 03 2010

h_head_VFBS_13c20000c0162f76变形了前段时间饭否上的那句话,因为今天是我生日,就感慨下~

其实生日前段时间就已经过了,一个小蛋糕、一场小电影。

还记得高三的时候把哈利波特从头到尾全部看完,那是顶着多大的压力在自娱自乐啦。虽然我不是一个正宗的哈迷,不过也确实很为这个系列痴迷,所以,电影看得是哈利波特七·上。

哈利波特从小正太变成大叔了,我也不如大叔的行列了~岁月不饶人,何必自扰~

饭否经过了505天回来了,发现原来自己在饭否有账号,不过只发过两个状态,嘿嘿~看到一年半之前发的状态,很多事情又浮现在眼前~

岁月那个偷儿呀~

珍惜这日子~

感谢大家今天的生日祝福~

2 responses so far

« Newer - Older »