自己动手重新实现LINQ to Objects 4 - Range
本文翻译自 Jon Skeet 的系列博文”Edulinq”。
本篇原文地址:
本篇博文较短,接下来的几篇估计也会比较短。我觉得只有 很相似的几个 LINQ 操作符才适合放到同一篇博文里面,比如 Count 和
LongCount 就比较适合放在一起讲。不过我也要采纳读者的意见,如果你喜欢“肥胖”一点的博文的话,请留言说明。
本文将要讲解 Range 操作符。
本文翻译自 Jon Skeet 的系列博文”Edulinq”。
本篇原文地址:
本篇博文较短,接下来的几篇估计也会比较短。我觉得只有 很相似的几个 LINQ 操作符才适合放到同一篇博文里面,比如 Count 和
LongCount 就比较适合放在一起讲。不过我也要采纳读者的意见,如果你喜欢“肥胖”一点的博文的话,请留言说明。
本文将要讲解 Range 操作符。
本文翻译自 Jon Skeet 的系列博文”Edulinq”。
本篇原文地址:
距离上次写完本系列博文的 第一篇 和 第二篇 已经有一段日子了,希望接下来的进度会快一些。
现在我给本项目在 Google Code 上建立了源码管理
,现在就无需每篇博文包含一个 zip 文件了。创建项目时,我给它取了个显而易见的名字,叫做 Edulinq 。我修改了代码中的命名空间,而且现在
这一系列博文的 tag 也修改为了
Edulinq 了。好了,闲话少叙 … 我们来开始重新实现 LINQ 吧,这次要实现 Select 操作符。
本文翻译自 Jon Skeet 的系列博文”Edulinq”。
本篇原文地址:
提示:本篇文章较长。虽然我选择了一个比较简单的操作符来在本文中实现,不过我们还是会遇到一些特例以及一些与 LINQ
相关的原则。因为我还在试着找出表现本文内容的最佳方式,所以本文的排版方式暂时是实验性的。
我们将要实现“ Where ”子句(也可以说是方法或操作符)。 Where 在总体上来说比较容易理解,但是涉及到延迟执行和流式处理的部分会有些麻烦。
Where 方法是泛型的,不过只有一个类型参数(在我看来这很重要,因为我觉得一个方法的泛型参数越多就越令人难以理解)。哦,对了,我们将在本文开始涉及查询表
达式,这算是本文的一点额外猛料。
本文翻译自 Jon Skeet
的系列博文“Edulinq”。
大约一年半之前,我在 DDD
的活动日上做了一次演讲。我当时试图去重新实现LINQ to
Objects,在一小时内能实现多少算多少。根据会后的反馈信息来看,我当时做得太快了…而且我还是远远没有实现完整。不过无论如何我还是觉得重新实现LINQ
to Objects是一个很有趣的练习,所以我觉得我应该用且行且博、不徐不疾方式来再做一遍。
这一系列的博文都会标上 “Edulinq”的标签
,你可以用这种方式过滤出这一系列博文。
我的计划是要完整的重新实现LINQ to Objects,用每篇博客来解释一个方法(或者是一组方法)。我将会尽力把代码写的达到生产质量,但是我不会写任何XML文档注释 -
既然我已经在写博客来解释了,那我就不想在代码中再重复一次了。我将在适当的情况下做一些优化,但愿会 比LINQ to Objects本身的实现做得更好 。
原文作者: James Ashley
在WP7社区中一个经常被问到的问题就是:在Pivot中放置了可以接受滑动手势的控件(比如说一个Slider)时,如何禁用Pivot控件本身内置的“用手指滑动
来切换视图”的功能呢?
对此问题,微软标准的答案是:你不应该这么做。这是“不好的做法”(Bad Practice),会造成用户体验的混淆。这种说法的前提是假设用户不会自己根据上下文
去思考,而总是预期“滑动”这一手势会在任何页面中都有一样的作用。这种答案听起来还不错,而且对于Pivot中内置Slider这种例子来说也很合理。况且,我们还
是可以把Slider纵向的放置在Pivot内的,那这个答案就显得更有道理了。
话又说回来,在WP7的TextBox中,我们可以用“按住并滑动”这一手势来操作光标在文本框内的位置。那么在Pivot控件中放置TextBox算不算是造成了不
好的用户体验呢?算不算是“不好的做法”(Bad
Practice)呢?我是不是应该想办法把TextBox也纵向放置呢?还有,ToggleSwitch控件(此控件来自于Silverlight for
Windows Phone Toolkit )又该怎么办呢?
滑动这一手势对于手机来说是很常用的。很多针对WP7的新控件都会用到它。如果所有这些即将面世的新控件都不能放置在Pivot控件中的话,那就太可惜了。
恰好赶上这个月的十一号GearBox要在Duke Nukem北美发售之前搞一个Community
Day,就在达拉斯。作为一个八流的FPS爱好者一定要去凑凑热闹。
去往达拉斯的路上,透过车窗随便拍了一张

到达现场,室内很暗。摆了一些GearBox出品的其他游戏的海报。

这次来点干货,丢大爷的玉照
这是从成都起飞时候在飞机上照的,灰蒙蒙的,什么都看不清楚。
飞行中途没怎么开手机,所以也没怎么拍照,下面是到了公司之后的照片。
这是公司进门之后墙上挂的的东西
MS合作ISV的牌子,2010-2011,是金的
[翻译]List
原文地址: http://blogs.msdn.com/b/ericlippert/archive/2011/04/04/so-many-interfaces.aspx
原作者: Eric Lippert
Eric Lippert是微软员工,C#编译器的主要开发人员之一。
今天,我在 StackOverflow
上回答了一个问题。按照以往的习惯,我把它以对话体的形式整理成一篇博客。
MSDN的文档中说List
上一篇博文
中提到了“可选参数”这个C# 4.0中新增的语言特性,但是写过之后还是不满足,心里还是有一些疑问没有得到解释。于是又做了一些探索,过程中竟然发现这么一个小小
的语言特性背后隐藏着的有趣问题还真不少。这次就把探索过程中的发现和疑问记录下来。
Cnblogs上有一篇 蒋金楠的文章
中提到一句:“缺省参数最终体现为两个特殊的自定义特性OptionalAttribute和DefaultParameterValueAttribute
”。为了验证这个说法的正确性,我自己做了一些试验。
要研究语言特性的实现原理最好的方法莫过于反编译出IL代码来一探究竟了。所以,那就顺着这条线索走吧。
首先用C#代码写一个很简单的测试方法:
public void TestMethod(string str = "A")
{
}
前几天推荐一个同事用“可选参数”,推荐完了我还画蛇添足的说这是.Net 4中的新特性。但是事后才发现这个新特性是C# 4.0的语言特性,与.Net
4无关。其实也不只这一次,我平时也经常把语言、框架、运行时,有时甚至还有开发工具混为一谈。于是今天就总结一下C#中我感兴趣的几个语言特性是从何而来的。
** 1.可选参数 **
可选参数是C# 4.0中的新特性,其作用在于在调用者不提供参数值时给参数一个默认值,用起来是这样的:
static void Main(string[] args)
{
TestMethod();
TestMethod(10);
Console.ReadLine();
}
public static void TestMethod(int parameter = 5)
{
Console.WriteLine(parameter);
}
以上的代码在第一次调用TestMethod时输出5,第二次输出10,也就是在没有给TestMethod提供参数值时,会自动以5作为参数值。
该特性的实现依赖于OptionalAttribute和DefaultParameterValueAttribute这两个attribute,也就是说Test
Method这个方法完全可以声明为这样:
从名字就可以看出来,Words Via Subtitle是用来通过字幕学单词的辅助工具。它通过解析美剧或者电影的字幕文件把其中的生词取出,用网络上提供的开放
API或者本地词库解释生词。另外,程序还可以提供单词读音(机器发音),可以播放一个单词在剧中出现的语境,可以把所有生词串起来像幻灯片一样连续播放,也就是说显
示一个单词及其解释,然后用机器发音读该单词,然后播放该单词在剧中出现的句子,然后切换到下一个生词再重复这一过程。
这个程序去年就写过一个雏形,最近断断续续的重写了。这次主要的改进是将字幕的分析和单词的解释从主程序中抽出来做成插件,也就是说主程序部署到一台机器之后如果想要
增加对一种字幕格式的支持就只需要写一个插件拷到部署的机器上去就ok了,无需把整个程序重新编译、重新部署。同样,如果想要增加一种单词解释器也可以通过添加一个插
件完成,比如说现在只有一个很小的本地词库和一个网络释义,之后有人想给这个程序增加一个Google词典的解释器就可以写一个插件来完成。这次重写用了WPF、ME
F,以及Ribbon Controls等最近接触的新东西,不过在这儿暂时不介绍程序是怎么写,也不说字幕解析插件和解释提供器插件如何编写,先简单介绍一下各功能
的使用吧。对代码感兴趣的朋友可以去CodePlex上去搜索WVS(Words Via Subtitle的简写),我把这个程序作为一个开源项目上传到那儿了
,用的MS-PL协议,完全开源哈。
下面就开始说一下大概怎么用这个程序吧。
运行程序,用左上角的Open按钮(
](/images/attachment/201010/24/0_12879076954nrG.gif)
)打开一个字幕文件(现在可以支持srt和ass格式的,当然以后可以通过插件来添加对更多种类的字幕的支持)。
](/images/attachment/201010/24/0_1287907700gCeG.gif)
上图中右下角可选的文件格式会随着插件的增多而增多。
前几天有朋友推荐我玩百度的网页游戏“七彩鱼”,玩儿了几天感觉还行,就是老得盯着喂鱼太麻烦。十一闲着没啥事儿干,于是就自己写了个喂鱼器。
具体使用方法写起来有点麻烦,我录了一段视频传到了56上,地址在下面:
http://www.56.com/u84/v_NTUyNzE0NjU.html
喂鱼器程序的下载地址:
http://download.csdn.net/source/2732931
如果您用的是Vista或者Win7,本程序可以直接运行。但是如果是XP用户而且从没安装过.Net Framework的话那需要装一下.Net
Framework(2.0或以上版本)。
发现这个有点像 Bug 又不太像 Bug 的东西的过程是这样的:
我继承自 ContentControl 写了一个 MyContentControl ,在其中定义了一个叫做 IconProperty
的依赖属性及其对应的 CLR 属性并且在其静态构造中调用了 DefaultStyleKeyProperty.OverrideMetadata
方法,代码很少,看起来是这个样子的:
1 | class MyContentControl: ContentControl { |
其中的 Icon 属性声明类型为 ImageSource ,目的简单明了,当然就是给这个控件加个图标了。
然后再给这个自定义控件定义一个放在 Generic.xaml 里的 Template ,一样很简单,只是用一个 StackPanel 把它的
Icon 和 Content 包起来,代码是这样的:
1 | <Style TargetType="{x:Type local:MyContentControl}"> |
WPF中的ItemsControl定义了 ItemContainerStyle 这一属性,顾名思义,该属性用来给
ItemsControl中包含的每一个Item的容器定义样式 。
比如在ListBox中这个容器就是ListBoxItem,在TabControl中这个容器就是TabItem。
下面是 ItemContainerStyle 的一种简单应用:
XAML:
1 | <Window> |
在这段 XAML中 定义了一个ListBox,在其ItemTemplate中有一个TextBlock绑定到数据实体的Text属性上。在其
ItemContainerStyle 中将其每个
Item的IsSelected属性绑定到数据实体的IsSelected上。其数据实体的生成在下面的代码中:
最近需要在 .NET 4 的环境中调用 GDAL 库。 GDAL 本身是一套非托管类库,不过还好提供了托管的 Wrapper 。
这些托管的程序集被包含在了 FWTools 的安装包中, FWTools 中带的版本依赖于 gdal_fw.dll, gdal_fw.dll
是 GDAL 核心类库的修改版,而它依赖的其他非托管程序集太多了,加起来有 18M 左右。所以还是自己下载代码编译的好。
这篇文章
介绍了 1.4 版本的编译方法,该方法同样适用于现在的 1.7 版本。
编译好之后引用、调用、 Debug 都没问题,一切正常,但是如果用 Release 编译并在 VS 之外运行的话则会报出
AccessViolationException ,异常信息提示说访问了受保护的内存。我的第一反应就是托管的 Wrapper 中用 P/Invoke
调用了非托管程序集,而非托管程序集导致了这个问题。但是这个猜测并不能解释为什么只有在 .NET 4+Release+IDE
外运行的情况下才会出错的现象。
猜来猜去,找来找去找到了问题的所在:
GDAL 的托管 Wrapper 中有一个叫做 SWIGStringHelper
的类型,该类型的静态构造方法中执行了一些比较重要的初始化操作。另外一个叫做 OsrPINVOKE 的类中声明了一个 SWIGStringHelper
类型的私有静态字段,并在声明时就初始化了该字段,而且 OsrPINVOKE 中没有显式声明的静态构造。
MEF编程指南(前两节)
在应用程序中使用MEF
在应用程序中使用MEF需要创建一个CompositionContainer的实例,向其中添加可组合的部件,将宿主应用包含进去然后组合。
以下是使用MEF需要用到的步骤:
1、 创建一个宿主类。在接下来的示例中,我们将会使用一个控制台应用,所以宿主也就是Program类了。
2、 引用System.ComponentModel.Composition程序集
.NET 4.0 FAQ 第一部分—DLR
简介
本篇文章中我们将讨论.NET FrameWork 4.0提供了哪些新特性。然后再探讨DLR特性 中的动态对象和Expando对象。我们也将会创建一个Exp
ando对象来看我们可以从中获得哪些益处。很多的开发人员误以为动态对象是用来替代反射和object类型的,我们也将会纠正这种错误的概念。
.NET 4.0中有哪些重要的新特性?
与其去浏览.NET 4.0冗长的新特性列表,我们还是专注于我们认为最重要的三项新特性上吧。
• WF和WCF 4.0:这是.NET
昨天遇到了一个 Bug ,如果在浏览器中打开多个标签,并把其中一个标签拖拽到主窗口的一侧来划分出独立的一个区域,然后在新区域中通过点击加号键添加的新标签内不会被添加上 WebBrowser 。
说得好绕嘴啊,截张图吧:

而且没有加上 WebBrowser 的标签的标题是 new content (我们在 AvalonDock 中给新标签的默认标题)而不是 New Tab (客户代码中重新赋的值)。
OK ,问题明了了,是不是新添加的标签的 Got_Focus 没能够挂到客户代码中的方法上去呢?
的确是这样,当我们把一个标签( DocumentContent )拖拽到一侧从而划分出一个新区域的时候, AvalonDock 会创建一个新的 DocumentPane 来代表这个新区域。
闲话少叙,书接上文。
现在我们已经通过 ReStyle 给 DocumentPane 加上了一个加号的按钮,并且可以通过点击该按钮给 DocumentPane 的
Items 添加一个 DocumentContent 了。
不过每个新添加进来的 DocumentContent 内部都是空的,而我们需要的是每个新标签中都有一个 WebBrowser
,要实现这一点很简单,只要给 DocumentContent 的 Content ( DocumentContent 是
ContentControl 的子类)属性赋值为一个 WebBrowser 的实例就 OK 了。
但是这不应该是 AvalonDock 的默认行为,所以我们要把这部分写到客户端 – 也就是引用 AvalonDock.dll
文件或者直接引用 AvalonDock 工程的 Solution 中去。
如何可以在客户端得知有一个新的 DocumentContent 被添加进 DocumentPane 中去了呢?自然是用事件了。
首先来写一个自定义的 EventArgs 吧:
AvalonDock 是 CodePlex 上的一个开源项目,利用它可以很容易的做出类似于 VS 的 UI 效果。
下图是 AvalonDock 源码中自带的一个 Demo :
我们可以用这款第三方控件为基础来制作多标签浏览器。
下面是最终效果图:

甚至可以把其中一个标签拖出主窗体成为一个独立的窗口:
Words Via Subtitle 改进:视频播放例句、加快生成 WPS 文档的速度
关于 Words Via Subtitle 的介绍:
1
http://blog.csdn.net/cuipengfei1/archive/2009/09/03/4516588.aspx
2
http://blog.csdn.net/cuipengfei1/archive/2009/09/10/4539180.aspx
最近给这个小程序添加了视频播放例句的功能,使用方法如下:
载入字幕文件并指定了与之对应的视频文件之后,选中某个感觉生疏的单词,然后点击播放例句按钮,该单词所在句子就会以视频的方式开始播放,播完该句子视频暂停。其实这
个功能写起来也挺简单的,就是在字幕中找到一个单词所在句子对应的时间信息,然后依照该时间段播放视频。
上周写了一个
通过英文剧集、电影学单词的小工具
,这几天又做了一点小的改进。主要是下面这两点:


为什么要写这个功能呢?因为九月中下旬有很多美剧要回归,包括 TBBT , Lie to me , Heroes , Fringe 。到时候每
一集出来之后可以用这个程序迅速的把一集中出现的生词,其音标及解释还有语境总结出来。可以把它发到博客里,或者发到美剧对应的社区或者贴吧里去,会比一般的影迷手工
总结的快很多。