<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_Ted's Blog</title><subtitle type="text">爱技术、爱生活!</subtitle><id>http://feed.cnblogs.com/blog/u/33163/rss</id><updated>2011-11-25T02:45:19Z</updated><author><name>ted</name><uri>http://www.cnblogs.com/tedzhao/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/tedzhao/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/33163/rss"/><entry><id>http://www.cnblogs.com/tedzhao/archive/2011/11/25/2262820.html</id><title type="text">最近看的一些文章链接</title><summary type="text">最近看的一些文章链接</summary><published>2011-11-25T02:45:00Z</published><updated>2011-11-25T02:45:00Z</updated><author><name>ted</name><uri>http://www.cnblogs.com/tedzhao/</uri></author><link rel="alternate" href="http://www.cnblogs.com/tedzhao/archive/2011/11/25/2262820.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/tedzhao/archive/2011/11/25/2262820.html"/><content type="html">&lt;div  lang="x-western"&gt;&#xD;
&lt;p align="left"&gt;&lt;strong&gt;&lt;a href="http://www.ibm.com/developerworks/cn/java/j-lo-javawebhiperf1/"&gt;Java Web 高性能开发，第 1 部分: 前端的高性能&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;strong&gt;&lt;a href="http://www.ibm.com/developerworks/cn/rational/r-cn-guiautotesting1/"&gt;实 战 GUI 产品的自动化测试，第 1 部分: 简介&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;strong&gt;&lt;a href="http://www.ibm.com/developerworks/cn/rational/r-cn-guiautotesting2/"&gt;实 战 GUI 产品的自动化测试，第 2 部分: 构建利于维护的自动化测试系统&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;strong&gt;&lt;a href="http://www.ibm.com/developerworks/cn/rational/r-cn-guiautotesting3/"&gt;实 战 GUI 产品的自动化测试，第 3 部分: 如何提高测试结果分析的效率&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;strong&gt;&lt;a href="http://www.ibm.com/developerworks/cn/rational/r-cn-guiautotesting4/"&gt;实 战 GUI 产品的自动化测试，第 4 部分: 高阶技巧&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;strong&gt;&lt;a href="http://www.codeproject.com/KB/cs/VS2010InterestingFeatures.aspx"&gt;Simple but Interesting Features of VS2010 and C# 4.0&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;strong&gt;&lt;a href="http://blog.zhaojie.me/2011/03/my-interview-questions-for-dotnet-programmers.html"&gt;我在面试.NET/C#程序员时会提出的问题&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;/div&gt;&lt;img src="http://www.cnblogs.com/tedzhao/aggbug/2262820.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/tedzhao/archive/2011/11/25/2262820.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/tedzhao/archive/2011/11/08/WPF_FrameworkElement_LoadedAndInitialized.html</id><title type="text">WPF概念解析一： FrameworkElement的Loaded事件和Initialized事件</title><summary type="text">在WPF中FrameworkElement类定义了两个事件：Loaded和Initialized事件。当控件被加载到页面上的 时候，这两个事件会相继发生， 那么这两个事件的差别是什么哪？在进行自定义控件开发的时候，应该如何使用这两个事件哪？</summary><published>2011-11-08T03:33:00Z</published><updated>2011-11-08T03:33:00Z</updated><author><name>ted</name><uri>http://www.cnblogs.com/tedzhao/</uri></author><link rel="alternate" href="http://www.cnblogs.com/tedzhao/archive/2011/11/08/WPF_FrameworkElement_LoadedAndInitialized.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/tedzhao/archive/2011/11/08/WPF_FrameworkElement_LoadedAndInitialized.html"/><content type="html">&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: Calibri;"&gt;WPF FrameworkElement的Loaded事件和Initialized事件&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: Calibri;"&gt;在WPF中FrameworkElement类定义了两个事件：Loaded和Initialized事件。当控件被加载到页面上的&#xD;
          时候，这两个事件会相继发生， 那么这两个事件的差别是什么哪？在进行自定义控件开发的时候，应该如何使用这两个事件那？&lt;/span&gt;&lt;br /&gt; 小结：&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&lt;span style="font-family: Calibri;"&gt;Initialized事件：该事件表明Frameworkelement已经被创建，&#xD;
          而且它的所有属性已经被设置。通常情况下子Element的事件会先于父Element触发，当Element接到该事件的时候，只&#xD;
          是说明其sub-tree已经被初始化，而父Element还没有被初始化。当Element的XMAL sub-tree被加载的&#xD;
          时候，该事件会被触发，这个时候FrameworkElement的IsInitialized属性为True。&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span style="font-family: Calibri;"&gt;Loaded事件：该事件表明&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;Frameworkelement&#xD;
          不但被创建，初始化，而且该Element已经被加载到VirtualTree上，接下来该Element将被Render。从根节&#xD;
          点开始，该事件会以广播的方式在子Element触发，这个时候，FrameworkElement的IsLoaded属性为&#xD;
          True。&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: Calibri;"&gt;Initialized事件&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: Calibri;"&gt;Initialized事件标示当前Element的所有属性都已经被设置。WPF中&#xD;
        FrameworkElement实现了ISupportInitialize接口，当EndInit方法被调用的时候，置&#xD;
        IsInitialized属性为True，然后触发&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;Initialized&#xD;
        事件。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: Calibri;"&gt;&amp;nbsp;&lt;br /&gt;&#xD;
      &lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;ISupportInitialize接口允许开发人员在控件的&#xD;
        BeginInit后推迟某些属性的设置，直至EndInit时机才统一&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;进行&#xD;
        多个属性的设置。利用&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;ISupportInitialize接口&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;可以解决由于属性设置顺序以及属性之间相互约束产生的问题。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt; &lt;span style="font-family: Calibri;"&gt;WPF的XAML Loader已经支持了&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;ISupportInitialize接口，创建完成对象后（解析完对象的开始节点），会调用&#xD;
        BeginInit方法，当加载完成该对象的XAML tree之后（解析完对象的结束节点）回调用EndInit方法。&lt;/span&gt;&lt;br /&gt; 如下面的例子：&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;&amp;lt;Button Width="100"&amp;gt;&#xD;
     Hello World!&#xD;
&amp;lt;/Button&amp;gt;&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: Calibri;"&gt;Button被创建的时候，BeginInit被调用，然后Width属性被设置&lt;/span&gt;，Content 属性被设置，最后EndInit方法被调用。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt; &lt;span style="font-family: Calibri;"&gt;另外一件事情是在Initialized之前Element的隐式Style不会被应用，如下面的例&#xD;
      子：在Button类型的Style中定义了Background为Blue，但是Button1对象&lt;/span&gt;在&lt;span style="font-family: Calibri;"&gt;Initialized之前它的Background为Null。&lt;br /&gt;&#xD;
    &lt;/span&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;&amp;lt;Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" &amp;gt;&#xD;
  &amp;lt;Page.Resources&amp;gt;&#xD;
    &amp;lt;Style TargetType="Button"&amp;gt;&#xD;
      &amp;lt;Setter Property="Background" Value="Blue" /&amp;gt;&#xD;
    &amp;lt;/Style&amp;gt;&#xD;
  &amp;lt;/Page.Resources&amp;gt;&#xD;
  &amp;lt;Button Name="Button1"&amp;gt;Clack&amp;lt;/Button&amp;gt;&#xD;
&amp;lt;/Page&amp;gt;&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: Calibri;"&gt;如果使用代码来创建FrameworkElement对象，同时也没有调用该对象的BeginInit和EndInit方法，那么在该对象被添加到VisualTree上的时候，Initialized事件会被触发。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: Calibri;"&gt;&lt;span style="font-family: Calibri;"&gt;Initialized事件是自底向上触发，由父向子。通常情况下只有子对象被初始化之后，父对象才应该被初始化。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: Calibri;"&gt;Loaded事件&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: Calibri;"&gt;FrameworkElement的Loaded事件被触发的时候，该对象已经被初始化，而且即&#xD;
        将被绘制。开发人员可以在该事件中进行一些应用程序的初始化工作。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt; &lt;span style="font-family: Calibri;"&gt;&#xD;
        Initialized事件也可以做一些初始化的事情，但是在该事件中Element的有一些属性是不准确的，例如ActualWidth和&#xD;
        ActualHeight，因为该对象仅仅是被初始化，还没有开始计算ActualWidth和ActualHeight，一些数据绑定&#xD;
        的属性也还没有开始计算。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt; &lt;span style="font-family: Calibri;"&gt;Loaded事件通常会在第一次Render之前触发，Element已经被Layout，数据&#xD;
        绑定也已经被计算。需要注意的是如果你在Loaded中Invalidate了Layout，在Render之前该事件有可能会被重新触&#xD;
        发。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt; Loaded事件是自顶向下以广播方式触发，从根节点，由父向子触发。而&lt;span style="font-family: Calibri;"&gt;Initialized&#xD;
        事件是自底向上触发，先子后父。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: Calibri;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/tedzhao/aggbug/2240651.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/tedzhao/archive/2011/11/08/WPF_FrameworkElement_LoadedAndInitialized.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/tedzhao/archive/2011/09/22/Silverlight_Control_Tab_Sequence.html</id><title type="text">How Silverlight implements tab sequence concepts</title><summary type="text">How Silverlight implements tab sequence conceptsThe Silverlight programming model defines a Control class that is a base class of many of the practical controls that produce a Silverlight application user interface. One of the behaviors of the Control class is that only a Control can receive keyboar</summary><published>2011-09-22T02:33:00Z</published><updated>2011-09-22T02:33:00Z</updated><author><name>ted</name><uri>http://www.cnblogs.com/tedzhao/</uri></author><link rel="alternate" href="http://www.cnblogs.com/tedzhao/archive/2011/09/22/Silverlight_Control_Tab_Sequence.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/tedzhao/archive/2011/09/22/Silverlight_Control_Tab_Sequence.html"/><content type="html">&lt;p&gt;&lt;strong&gt;How Silverlight implements tab sequence concepts&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;The Silverlight programming model defines a Control class that is a base class of many of the practical controls that produce a Silverlight application user interface. One of the behaviors of the Control class is that only a Control can receive keyboard focus as a discrete element within the Silverlight content area.&lt;/p&gt;&#xD;
&lt;p&gt;When a Silverlight application user interface is constructed from the visual tree, a default tab sequence for all Silverlight content is also constructed, using the same principles of order that were used by the visible layout. This default tab sequence is usually adequate as a tab sequence that supports users that press the TAB key to traverse the UI. The same TAB sequence and/or the focusable state of controls is also used by many assistive technologies or modes of assistive technologies to construct the representation of the interface for the Silverlight content.&lt;/p&gt;&#xD;
&lt;p&gt;For cases where developers decide that the default tab sequence is not adequate, the developer can take one of two approaches for changing the tab sequence:&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Change other properties of the control where a change to the tab sequence happens as a secondary effect.&lt;/li&gt;&#xD;
&lt;li&gt;Reorder the tab sequence directly.&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;div id=""&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;Changing control properties&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Setting the Visibility property of a control to Collapsed causes the control to no longer render in the UI. As a secondary effect, that control is removed from the tab sequence.&lt;/li&gt;&#xD;
&lt;li&gt;Setting the IsEnabled property of a control to false causes the control to no longer be focusable by keyboard or clickable by the mouse. In many cases, the visual appearance of the control changes also, through a theme style. For example, the control may appear as gray rather than black. As a secondary effect, that control is removed from the tab sequence.&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div id=""&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;Changing specific tab properties&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Setting the IsTabStop property of a control to false causes the control to no longer be focusable by keyboard or programmatic focus, and that control is removed from the tab sequence.&lt;/li&gt;&#xD;
&lt;li&gt;Setting the TabIndex property of a control to a specific index causes the control to be inserted at that position in the tab sequence. The default value of TabIndex is Single.MaxValue, therefore any non-default value promotes that control to be first in an otherwise default tab sequence. More typically, authors would specify a TabIndex for any controls that are involved in a deliberate segment of tab order re-ordering.&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div id=""&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;Tab order and language&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Left-to-right is the default only for languages that use left-to-right reading order. For languages that use right-to-left reading order, right-to-left is also the default tab order as implemented by Silverlight runtime behavior. That language preference is declared by the acting CultureInfo.&lt;/p&gt;&#xD;
&lt;/div&gt;&lt;img src="http://www.cnblogs.com/tedzhao/aggbug/2184783.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/tedzhao/archive/2011/09/22/Silverlight_Control_Tab_Sequence.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/tedzhao/archive/2011/03/28/CleanIDE_And_ConcentrateAttention.html</id><title type="text">从IDE界面到如何保持专注力</title><summary type="text">从清爽的IDE界面谈起，聊到如何保持专注力，提高做事情的效率。</summary><published>2011-03-28T10:58:00Z</published><updated>2011-03-28T10:58:00Z</updated><author><name>ted</name><uri>http://www.cnblogs.com/tedzhao/</uri></author><link rel="alternate" href="http://www.cnblogs.com/tedzhao/archive/2011/03/28/CleanIDE_And_ConcentrateAttention.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/tedzhao/archive/2011/03/28/CleanIDE_And_ConcentrateAttention.html"/><content type="html">&lt;p&gt;今天无意间把IDE上的所有工具栏都干掉了，发现效果还挺好的，如下图：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/29609/2011032516040845.png" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;操作方式：右键点击菜单栏，在弹出菜单中将所有打勾的项目去掉。&lt;/p&gt;&#xD;
&lt;p&gt;一个非常Cleaning Coding Environment, 可以心无旁骛的Coding，有效帮助你保持专注度。&lt;/p&gt;&#xD;
&lt;p&gt;你可以试试-：）&lt;/p&gt;&#xD;
&lt;p&gt;这样做还有一个好处就是，你会逐渐降低对鼠标的依赖，几乎所有的操作都依赖于键盘。有效治疗鼠标手、以及由鼠标引发的肩部不适。-：）&lt;/p&gt;&#xD;
&lt;br /&gt;&#xD;
&lt;p&gt;前几天在看李笑来的《&lt;a href="http://book.douban.com/subject/3609132/"&gt;把时间当作朋友&lt;/a&gt;》一书中有这样一个片段：&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;或许是因为考试临近，或许是因为工作需要，你现在必须把一本书读完。这本书当然不可能是言情小说，所以就不可以一目十行地看；它需要你认真阅读并理解，它甚至可能要你根据它所陈述的原理或者规则进一步创造一些什么才算是真正有所收获。&#xD;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 经过一番挣扎，你终于决定&amp;ldquo;正式开始&amp;rdquo;！你坐到你喜欢的沙发上翻开某一页开始看。过了一会儿，你突然觉得自己非常渴，所以出去找水喝。打开冰箱顺手拿出一瓶饮料，倒到杯子里。刚喝一口，一下子想起来，不对，你不应该喝这种带糖的饮料！真是的！都是你妈妈不好，无论说多少次，她都不会记得把带糖的饮料和不带糖的饮料分开放。于是，你跑到你妈妈的卧室里，与她理论了一番，最终发现于事无补，只好悻悻地回来重新整理了一下冰箱。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 你重新回到沙发上，接着看你的书。看了一会儿，你换了个姿势。巧的是你不小心压到了电视遥控器，电视一下子亮了。这个节目主持人恰好是你最喜欢的，哇，今天她穿的这裙子太漂亮了！不过，今天的话题怎么这么无聊？！你不由自主地还是看了一会儿，又顺手用遥控器翻了翻其他的电视台&amp;hellip;&amp;hellip;幸亏这个时候，一连几个电视台都没有什么好节目，你才有点失望地想：现在的节目真的很无聊！还不如看书呢。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 嗯？怎么这么渴？你这才想起来，你刚才整理完冰箱之后，把那杯含有糖分的饮料放在你妈妈的桌子上了，而那之后，你却忘了重新给自己倒一杯不含糖分的饮料，就直接回到沙发上了。于是，你起身去弄点喝的。喝了两口，你突然想起来你现在正喝的饮料，是你最喜欢喝的。第一次跟你前男朋友约会的时候，他请你喝的就是这种饮料&amp;hellip;&amp;hellip;唉，也不知道他现在在哪儿，干什么呢？&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 手机响了，一个短信。一个朋友，问你在干嘛？你没好意思说你在学习；你只是含混地回复说，你病了，在家休息呢，不想出去&amp;hellip;&amp;hellip;你又回到沙发上。想了想，还是换一下背景音乐吧，现在这个太伤感。于是，你扭身换了张CD，然后重新坐好，开始看书。过了好一阵子，你突然发现你刚刚在发呆，于是打了个寒颤。然后，你下意识地看了一下表，天哪，两个小时这就过去了，可是你连一页书都没看完呢。&#xD;
&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;我相信这样的场面一定在我们的生活中出现过，如何才能排除内心干扰，有效保持专注力哪？出现上面的场面正是由于我们的大脑太活跃了，太容易接受外部反馈，反过来会操纵我们的注意力。&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;必须有意识的控制我们的大脑，面对纷繁复杂的外界信息，有所取有所不取。按照作者的说法就是&amp;ldquo;运用心智，获得解放&amp;rdquo;，不再让自己成为自己的大脑的奴隶，而是选择翻身做主人。&lt;/p&gt;&#xD;
&lt;p&gt;古人说的&amp;ldquo;心远地自偏&amp;rdquo;也是这个道理。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/tedzhao/aggbug/1985837.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/tedzhao/archive/2011/03/28/CleanIDE_And_ConcentrateAttention.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/tedzhao/archive/2011/03/02/JoelTest.html</id><title type="text">使用Joel Test来衡量开发团队的过程</title><summary type="text">Joel Test是一组非常简单的问题列表，可以非常快捷的来评审软件团队的开发过程。最早是由Joel Spolsky发布在其网站Joel on Software上面，尽管Joel宣称它是“一个不太靠谱的、粗糙的来评定团队的测试”，但是它被软件管理者、面试主考官还有软件投资者广泛使用。</summary><published>2011-03-02T12:50:00Z</published><updated>2011-03-02T12:50:00Z</updated><author><name>ted</name><uri>http://www.cnblogs.com/tedzhao/</uri></author><link rel="alternate" href="http://www.cnblogs.com/tedzhao/archive/2011/03/02/JoelTest.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/tedzhao/archive/2011/03/02/JoelTest.html"/><content type="html">&lt;p&gt;Joel Test是一组非常简单的问题列表，可以非常快捷的来评审软件团队的开发过程。最早是由Joel&#xD;
Spolsky发布在其网站&lt;a href="http://www.joelonsoftware.com/articles/fog0000000043.html" title="Joel on Software (weblog)"&gt;Joel on Software&lt;/a&gt;上面，尽管Joel宣称它是&amp;ldquo;一个不太靠谱的、粗糙的来评定团队的测试&amp;rdquo;，但是它被软件管理者、面试主考官还有软件投资者广泛使用。&lt;/p&gt;&#xD;
&lt;br /&gt;&#xD;
&lt;p&gt;&lt;strong&gt;下面是问题列表:&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="padding-left: 30px;"&gt;1. 是否启用版本控制？&lt;/p&gt;&#xD;
&lt;p style="padding-left: 30px;"&gt;2. 是否可以一步构建?&lt;/p&gt;&#xD;
&lt;p style="padding-left: 30px;"&gt;3. 是否进行每日构建？&lt;/p&gt;&#xD;
&lt;p style="padding-left: 30px;"&gt;4. 是否有bug跟踪列表？&lt;/p&gt;&#xD;
&lt;p style="padding-left: 30px;"&gt;5. 是否在修改bug后，才开始写新代码？&#xD;
&lt;/p&gt;&#xD;
&lt;p style="padding-left: 30px;"&gt;6. 是否及时更新工作计划？&lt;/p&gt;&#xD;
&lt;p style="padding-left: 30px;"&gt;7. 是否在开发前编写了大家一致认可的功能文档？&lt;/p&gt;&#xD;
&lt;p style="padding-left: 30px;"&gt;8. 是否给予团队安静的工作环境？&lt;/p&gt;&#xD;
&lt;p style="padding-left: 30px;"&gt;9. 是否在使用最好的软件开发工具？&lt;/p&gt;&#xD;
&lt;p style="padding-left: 30px;"&gt;10. 是否有专职测试人员？&lt;/p&gt;&#xD;
&lt;p style="padding-left: 30px;"&gt;11. 是否在面试时以实际编写代码来检查求职者？&lt;/p&gt;&#xD;
&lt;p style="padding-left: 30px;"&gt;12. 是否利用陌生人进行可用性测试？&lt;/p&gt;&#xD;
&lt;br /&gt;&#xD;
&lt;p&gt;&lt;strong&gt;这里重点关注几条：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="padding-left: 30px;"&gt;5. 是否在修改bug后，才开始写新代码？&lt;/p&gt;&#xD;
&lt;p style="padding-left: 50px;"&gt;微软制定了&amp;ldquo;零缺陷策略&amp;rdquo;。其真正含义是：在任何时候，都要把解决现有程序里的问题作为首要问题来抓，然后再去写新程序。&lt;br /&gt;&#xD;
为什么要这样做呢？&lt;br /&gt;&#xD;
第一条：越早解决问题，越容易解决。&lt;br /&gt;&#xD;
第二条：刚写的程序里发现问题，你能够比较容易地估算解决它的时间。如果你的开发过程中有许多虫没有及时解决，那你的开发计划肯定不可靠。反过来，如果你们已经把已知的虫全部解决了，要做的事只是写新的程序，那你的开发计划就会比较准确。&lt;br /&gt;&#xD;
第三条：把已知的虫全部解决，这样做还有一个好处：保持&amp;ldquo;让开发中的产品随时处在可以交给用户的状态。如果你的 竞争对手推出一个新的功能想把你的客户抢走，你可以马上在你的产品里加上这个功能，立刻将新产品交付用户，因为你没有一大堆积累下来的问题要解决。&lt;/p&gt;&#xD;
&lt;p style="padding-left: 30px;"&gt;12. 是否利用陌生人进行可用性测试？&lt;/p&gt;&#xD;
&lt;p style="padding-left: 50px;"&gt;这句话的意思是，让你从走廊里随便抓几个人来试用你的软件。如果你抓五个人来用你的软件，那就有可能发现95%的可用性问题。&lt;/p&gt;&#xD;
&lt;br /&gt;&#xD;
&lt;p&gt;&lt;strong&gt;得分：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;对于每一个问题如果回答&amp;ldquo;Yes&amp;rdquo;，可以得一分。12分是优秀的团队，11分可以看成刚刚及格，这些都是最基本的问题，缺一不可。尽管一些大的团队例如微软可以得12分，但是许多团队只能得2到3分。&lt;/p&gt;&#xD;
&lt;br /&gt;&#xD;
&lt;p&gt;&lt;strong&gt;这个问题列表是Joel在2000年做的，十年过去了，&lt;a href="http://geekswithblogs.net/btudor/archive/2009/06/16/132842.aspx"&gt;Joel&#xD;
Test Update for 2010&lt;/a&gt; 诞生了。&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;下面是新的列表：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="padding-left: 30px;"&gt;1. 是否采用了配置管理系统？&lt;/p&gt;&#xD;
&lt;p style="padding-left: 50px;"&gt;需要定义一个配置管理系统，除了对源代码进行版本管理外，还应该包括建立代码分支、定义分支合并策略，版本稳定策略，产品部署计划，系统角色和权限定义，还有每个阶段的质量检验关方法（quality gates）。&#xD;
&lt;/p&gt;&#xD;
&lt;p style="padding-left: 30px;"&gt;2. 是否每个人都可以一步构建？&lt;/p&gt;&#xD;
&lt;p style="padding-left: 30px;"&gt;3. 是否每日构建中添加了自动测试？&lt;/p&gt;&#xD;
&lt;p style="padding-left: 30px;"&gt;4. 是否将Bug数据库与源代码管理集成？&lt;/p&gt;&#xD;
&lt;p style="padding-left: 50px;"&gt;一个Bug的修复对应着那些代码的改变？每一次代码的改变是否关联着一个Bug或者开发任务？一次代码分支的合并关联着那些Bug？&#xD;
每一次代码的提交应该修复某个Bug或者完成某个开发任务，我们可以通过Bug报告来查询代码中的改变。换句话说，源代码管理应该与Bug追踪、项目任务追踪集成。&#xD;
&lt;/p&gt;&#xD;
&lt;p style="padding-left: 30px;"&gt;5. Do you fix bugs and write new code?&lt;/p&gt;&#xD;
&lt;p style="padding-left: 50px;"&gt;通过建立代码分支、以及分支合并等等手段开发团队可以将同时进行上一次发布的Bug修复和下一次发布的代码编写。质量保证团队必须要确保在上一次的发布版本中Bug能够被修复，而且要能够将修正代码同步到当前的发布版本。&lt;/p&gt;&#xD;
&lt;p style="padding-left: 30px;"&gt;6. 是否能够追踪任务并且管理变化？&lt;/p&gt;&#xD;
&lt;p style="padding-left: 30px;"&gt;7. 是否拥有一个需求管理系统？&lt;/p&gt;&#xD;
&lt;p style="padding-left: 50px;"&gt;需要支持需求功能文档的变更管理。我看到很多的开发团队有着很好的文档编写开发流程，但是文档的变更管理流程却很糟糕。&lt;/p&gt;&#xD;
&lt;p style="padding-left: 30px;"&gt;8. 是否给予团队一个安静的工作环境以及一些作战室？&lt;/p&gt;&#xD;
&lt;p style="padding-left: 30px;"&gt;9. 是否在使用最好的软件开发工具？&lt;/p&gt;&#xD;
&lt;p style="padding-left: 30px;"&gt;10. 测试人员是否参与到需求管理中？&lt;/p&gt;&#xD;
&lt;p style="padding-left: 30px;"&gt;11. 是否在面试时让求职者评审实际代码？&lt;/p&gt;&#xD;
&lt;p style="padding-left: 30px;"&gt;12. 是否利用陌生人进行可用性测试？&lt;/p&gt;&#xD;
&lt;ol&gt;&#xD;
&lt;/ol&gt;&#xD;
&lt;br /&gt;&#xD;
&lt;p&gt;&lt;strong&gt;怎么样看看你所在的团队情况如何？&lt;/strong&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/tedzhao/aggbug/1962363.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/tedzhao/archive/2011/03/02/JoelTest.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/tedzhao/archive/2011/03/01/BookReadMethod.html</id><title type="text">读书的方法</title><summary type="text">介绍读书的方法。</summary><published>2011-03-01T13:24:00Z</published><updated>2011-03-01T13:24:00Z</updated><author><name>ted</name><uri>http://www.cnblogs.com/tedzhao/</uri></author><link rel="alternate" href="http://www.cnblogs.com/tedzhao/archive/2011/03/01/BookReadMethod.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/tedzhao/archive/2011/03/01/BookReadMethod.html"/><content type="html">&lt;p&gt;一段时间以来，自己买的书还有借的书倒是多了不少，有的书拿回来就撇一边了，有的在快速阅读中快速忘记。有没有好的读书方法哪，使得读书就像喝美酒，越喝越醇。&lt;/p&gt;&#xD;
&lt;p&gt;几天前偶然看到了时寒冰先生的一篇关于如何读书，以及如何指导孩子读书的&lt;a href="http://blog.ifeng.com/946563.html"&gt;文章&lt;/a&gt;，觉得很有道理。&lt;/p&gt;&#xD;
&lt;p&gt;现摘出重点：&lt;/p&gt;&#xD;
&lt;br /&gt;&#xD;
&lt;p&gt;&lt;strong&gt;1. 高效率的读书方式&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;读书是获取知识、活跃思维、提高自我的捷径。&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;拿到书的时候，根据题目，先想想：这本书如果我写，大概会是怎样的观点，会以怎样的思路展开。然后，看一下简单的介绍及序言等，如果介绍的主要观点与自己的想法相同，章节的布局也没有新鲜之处，那么，这本书就可以不读或者只是粗略地看翻一下。反之，就买下来阅读。如果作者观点新颖，或者观点与自己接近但章节中体现出来的思路，有比自己深入、系统和完善之处，也买下来，重点读那些体现出作者深入思考的章节。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;strong&gt;所以，我读书的时候，一般都会先看目录。目录是提纲挈领，是作者思路的高度概括。通过目录，知道作者的一个大概思路，沿着作者的思路一路走下去，会让你的思路和逻辑越来越系统、严谨和清晰。因为，读书不仅获取知识，开阔视野，更重要的是，开打思路，学会更深入地、更多角度的思考。&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;strong&gt;带着一个清晰的框架去读书的时候，你会发现，你不仅在被动地接受知识，而是在和作者一起思考和洞悉事物的本质，甚至，你是在和作者一起写作。这会让你更清晰地感受到作者的独到之处，也帮你发现作者的不足或欠缺之处。这样，你读一本书，远远超过以普通方式读十本书获取的收益。&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;strong&gt;读书的时候，一定要有一支笔，把精彩的观点或阐述划上线，或把自己的感受随时写下来。因为，看别人观点的同时，实际上是在与作者对话，注意，读书是与作者对话！你不自然地会有一些感悟，把它记录下来非常非常重要。当你养成这种习惯，你会发现你的获取知识的速度会更快，效率会更高，思维会更加活跃。&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;需要注意的是，不要拒绝你非常厌恶的观点，只要对方能够自圆其说，你不妨也了解一下。中国人的局限性是：会认为与自己观点差异大的观点是荒谬的！往往从道德层面加以谴责，而完全不理会对方的逻辑关系。其实，荒谬的观点不一定没有道理。我们应该学会通过交流和辩论，让道理越来越清晰，而不是通过情绪化的宣泄让本来可以讨论的话题变得越来越模糊。每个人都或多或少的存在这个问题。我也在努力修正自己的这个缺点。&lt;/p&gt;&#xD;
&lt;br /&gt;&#xD;
&lt;p&gt;&lt;strong&gt;2. 让儿童喜悦读书&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;孩子们的特长是什么？精力饱满，想象力丰富，思维跳跃性强无拘无束。&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;电影、电视的确能够帮助孩子们认识外部世界，但它的局限性也非常明显&amp;mdash;&amp;mdash;它在一定程度上容易扼杀或者限制孩子们最需要激活和成长的想象力，因为，画面中已经给了孩子们一切，不需要去想象了。&lt;strong&gt;而想象是孩子培养思考能力的关键前提！电影、电视应该作为孩子汲取知识、开阔视野的一种途径，而非全部。&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;孩子在画画，或者玩的时候，或者睡前，打开音响，播放故事等，让孩子在潜移默化中吸取营养。孩子的想象力会弥补文字和声音的缺陷。等听几次，孩子甚至能够完整地把听到的故事讲下来，连语气都很惟妙惟肖。&lt;strong&gt;这种听书的方式，对于孩子语言和逻辑能力的培养和记忆力的培养都是极其有益的。当然，当孩子完美复述听来的故事的时候，一定要给予足够的赞美。&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;读书也一样。书不一定非常华丽才好，只要有注音，孩子能够慢慢读下来就行了。对于孩子而言，再美的画面也没有他自己想象出来的完美啊！&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;对于孩子们读的书，家长绝不可以抱着无所谓的态度。应该非常重视，至少在孩子觉得你非常重要。你应该在孩子读书以前提前通读一遍，以便与孩子交流心得。这种对话不仅可以开阔孩子的视野，提升孩子的认知能力和心理素质，也可以提高孩子的兴趣，同时，对家长而言也是一种快乐啊。孩子们的一些观点由于不受任何局限而常常语出惊人，令人感叹！&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;千万不要买几本书丢给孩子，给孩子布置任务，要求他在多少天内读完。这种对待成人的方式，除了导致孩子的强烈反感外，没有任何益处。孩子的学习效率完全源于兴趣。家长如果希望孩子读什么书，应该在买书以前，就多次在孩子面前&amp;ldquo;意外&amp;rdquo;谈到那本书，当孩子的好奇心被吊起来，剩下的事情你就不用管了。&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;另外，行万里路破万卷书，暑假带孩子出去走走，开阔眼界，也是非常有益的。&lt;strong&gt;旅游的时候也不要仅仅是照相而已，要注意感受美景，开阔眼界，多与孩子交流心得。&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;古语云，听君一席话胜读十年书。如果有机会带孩子接触一些大家或在某领域内有特长和影响的人士，让孩子得到潜移默化的熏陶，也是非常难得的方式。这种良好的气场带给孩子的影响，可能持续一生。孩子们更容易产生向接触过的人学习并超越他的动力。这正是&amp;ldquo;孟母三迁&amp;rdquo;的原因！人的气场是一种难以用科学证明的东西，但很多人的确在受此影响。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/tedzhao/aggbug/1968372.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/tedzhao/archive/2011/03/01/BookReadMethod.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/tedzhao/archive/2011/01/26/2011_ReadBookList.html</id><title type="text">2011读书列表</title><summary type="text">2011读书列表</summary><published>2011-01-26T14:51:00Z</published><updated>2011-01-26T14:51:00Z</updated><author><name>ted</name><uri>http://www.cnblogs.com/tedzhao/</uri></author><link rel="alternate" href="http://www.cnblogs.com/tedzhao/archive/2011/01/26/2011_ReadBookList.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/tedzhao/archive/2011/01/26/2011_ReadBookList.html"/><content type="html">&lt;p&gt;古人云&amp;ldquo;开卷有益&amp;rdquo;。&lt;/p&gt;&#xD;
&lt;p&gt;2011年读书清单，每一本都值得花时间精读：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://book.douban.com/subject/4722716/"&gt;&lt;img src="http://img31.ddimg.cn/86/0/20813351-1_b.jpg" width="200" height="200" /&gt;&lt;/a&gt;&lt;a href="http://book.douban.com/subject/1400512/"&gt;&lt;img src="http://img3.douban.com/mpic/s1890292.jpg" width="155" height="200" /&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp; &lt;a href="http://book.douban.com/subject/1231416/"&gt;&lt;img src="http://img3.douban.com/mpic/s1911282.jpg" width="147" height="197" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://book.douban.com/subject/4112632/"&gt;&lt;img src="http://img3.douban.com/mpic/s4295322.jpg" width="148" height="217" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;本文会持续更新至2011年末。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/tedzhao/aggbug/1945598.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/tedzhao/archive/2011/01/26/2011_ReadBookList.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/tedzhao/archive/2011/01/22/HTML_Parser.html</id><title type="text">HTML Parser</title><summary type="text">前些时候，做一个网页内容提取工具的时候，遇到HTML解析这个问题，顺手研究了一翻，记一下结论。</summary><published>2011-01-22T08:45:00Z</published><updated>2011-01-22T08:45:00Z</updated><author><name>ted</name><uri>http://www.cnblogs.com/tedzhao/</uri></author><link rel="alternate" href="http://www.cnblogs.com/tedzhao/archive/2011/01/22/HTML_Parser.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/tedzhao/archive/2011/01/22/HTML_Parser.html"/><content type="html">&lt;div id=":7k" &gt;&#xD;
&lt;div id=":7l"&gt;&#xD;
&lt;div lang="EN-US"&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;p  style="margin-left: 0.25in;"&gt;&lt;b&gt;&lt;span lang="ZH-CN"&gt;引子&lt;/span&gt;&lt;/b&gt;&lt;span lang="ZH-CN"&gt;：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p  style="margin-left: 0.25in;"&gt;&lt;span lang="ZH-CN"&gt;以前一直在当当上买书，后来听说京东也要卖书了，要跟当当&lt;/span&gt;PK&lt;span lang="ZH-CN"&gt;。&lt;wbr&gt;&lt;/wbr&gt;于是就想做一个比价的工具，需求就是提供一个书名，&lt;wbr&gt;&lt;/wbr&gt;要求返回各个网上书店是否有货，价格是多少，&lt;wbr&gt;&lt;/wbr&gt;还有一些书的基本信息。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p  style="margin-left: 0.25in;"&gt;&lt;/p&gt;&#xD;
&lt;p  style="margin-left: 0.25in;"&gt;&lt;span lang="ZH-CN"&gt;当然貌似现在已经有这样的一些网站，但是作为程序员，&lt;wbr&gt;&lt;/wbr&gt;还是想自己做一个，研究研究相关技术。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p  style="margin-left: 0.25in;"&gt;&lt;/p&gt;&#xD;
&lt;p  style="margin-left: 0.25in;"&gt;&lt;b&gt;&lt;span lang="ZH-CN"&gt;开始：&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&#xD;
&lt;p  style="margin-left: 0.25in;"&gt;&lt;span lang="ZH-CN"&gt;一番&lt;/span&gt;Google&lt;span lang="ZH-CN"&gt;之后，各大网点均没有提供查询&lt;/span&gt;API&lt;span lang="ZH-CN"&gt;，&lt;wbr&gt;&lt;/wbr&gt;只能是通过其自身&lt;/span&gt;WEB&lt;span lang="ZH-CN"&gt;网页上的查询，&lt;wbr&gt;&lt;/wbr&gt;也就是在其网页上输入书名后，点击搜索，观察新页面的&lt;/span&gt;URL&lt;span lang="ZH-CN"&gt;，&lt;wbr&gt;&lt;/wbr&gt;然后改变查询关键字来搞定。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p  style="margin-left: 0.25in;"&gt;&lt;/p&gt;&#xD;
&lt;p  style="margin-left: 0.25in;"&gt;.NET&lt;span lang="ZH-CN"&gt;提供了&lt;/span&gt;WebClient&lt;span lang="ZH-CN"&gt;，&lt;/span&gt;WebRequest&lt;span lang="ZH-CN"&gt;等类型&lt;wbr&gt;&lt;/wbr&gt;可以进行&lt;/span&gt;Http&lt;span lang="ZH-CN"&gt;请求，对上一步拿到的&lt;/span&gt;URL&lt;span lang="ZH-CN"&gt;进行请求后，&lt;wbr&gt;&lt;/wbr&gt;会拿到一段很长的&lt;/span&gt;HTML&lt;span lang="ZH-CN"&gt;文本。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p  style="margin-left: 0.25in;"&gt;&lt;/p&gt;&#xD;
&lt;p  style="margin-left: 0.25in;"&gt;&lt;span lang="ZH-CN"&gt;这样就来到了本文的正题，如何进行&lt;/span&gt;HTML&lt;span lang="ZH-CN"&gt;解析。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p  style="margin-left: 0.25in;"&gt;&lt;/p&gt;&#xD;
&lt;p  style="margin-left: 0.25in;"&gt;&lt;b&gt;HTML &lt;/b&gt;&lt;b&gt;&lt;span lang="ZH-CN"&gt;解析：&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&#xD;
&lt;p style="padding-left: 30px;"&gt;&lt;span&gt;1.&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&#xD;
&lt;/span&gt;&lt;/span&gt;&lt;span lang="ZH-CN"&gt;解析之前要进行过滤，滤掉所有的&lt;/span&gt;CSS&lt;span lang="ZH-CN"&gt;，&lt;/span&gt;JavaScript&lt;span lang="ZH-CN"&gt;语&lt;wbr&gt;&lt;/wbr&gt;句，这个可以使用正则表达式搞定。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="padding-left: 30px;"&gt;&lt;span lang="ZH-CN"&gt;如下代码：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="padding-left: 30px;"&gt;source &amp;nbsp;= Regex.Replace(source,&#xD;
@"&amp;lt;script[^&amp;gt;]*?&amp;gt;.*?&amp;lt;/script&amp;gt;", string.Empty,&#xD;
RegexOptions.IgnoreCase);&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2.&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&#xD;
&lt;/span&gt;&lt;/span&gt;&lt;span lang="ZH-CN"&gt;目前&lt;/span&gt;HTML&lt;span lang="ZH-CN"&gt;的解析大致有两种做法，&lt;wbr&gt;&lt;/wbr&gt;可以根据需求采用合适的做法：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin-left: 0.75in;"&gt;&lt;span&gt;-&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&#xD;
&lt;/span&gt;&lt;/span&gt;HTML DOM&lt;/p&gt;&#xD;
&lt;p style="margin-left: 0.75in;"&gt;&lt;span lang="ZH-CN"&gt;将&lt;/span&gt;HTML&lt;span lang="ZH-CN"&gt;文本解析成一颗&lt;/span&gt;HTML&#xD;
DOM Tree&lt;span lang="ZH-CN"&gt;，而后基于树状结构供用户使用。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;h1 style="margin-right: 0in; margin-left: 0.25in; margin-bottom: 0.0001pt; text-indent: 0.5in;"&gt;&lt;span style="font-size: 11pt; font-weight: normal;"&gt;&lt;a href="http://htmlagilitypack.codeplex.com/" target="_blank"&gt;Html Agility Pack&lt;/a&gt;&lt;/span&gt;&lt;span style="font-size: 11pt; font-weight: normal;" lang="ZH-CN"&gt;是一个开源类库，就属于这一种做法，支持&lt;/span&gt;&lt;span style="font-size: 11pt; font-weight: normal;"&gt;XPATH&lt;/span&gt;&lt;span style="font-size: 11pt; font-weight: normal;" lang="ZH-CN"&gt;和&lt;/span&gt;&lt;span style="font-size: 11pt; font-weight: normal;"&gt;L&lt;wbr&gt;&lt;/wbr&gt;INQ&lt;/span&gt;&lt;span style="font-size: 11pt; font-weight: normal;" lang="ZH-CN"&gt;查询，易用性非常好。&lt;/span&gt;&lt;span style="font-size: 11pt; font-weight: normal;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;h1 style="margin: 0in 0in 0.0001pt;"&gt;&lt;span style="font-size: 11pt; font-weight: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Scott Mitchell&lt;/span&gt;&lt;span style="font-size: 11pt; font-weight: normal;" lang="ZH-CN"&gt;写了一篇很好的文章来介绍这个类库的使用：&lt;/span&gt;&lt;span style="font-size: 11pt; font-weight: normal;"&gt;&lt;a href="http://www.4guysfromrolla.com/articles/011211-1.aspx" target="_blank"&gt;Pa&lt;wbr&gt;&lt;/wbr&gt;rsing HTML&#xD;
Documents with the Html Agility Pack&lt;/a&gt; &lt;/span&gt;&lt;span style="font-size: 11pt; font-weight: normal;" lang="ZH-CN"&gt;。&lt;/span&gt;&lt;span style="font-size: 11pt; font-weight: normal;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;p &gt;&lt;/p&gt;&#xD;
&lt;p style="margin-left: 0.75in;"&gt;&lt;span&gt;-&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&#xD;
&lt;/span&gt;&lt;/span&gt;&lt;span lang="ZH-CN"&gt;顺序读取&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p  style="margin-left: 0.75in;"&gt;&lt;span lang="ZH-CN"&gt;其思想是将所有节点分为三类：头节点例如&amp;ldquo;&lt;/span&gt;&amp;lt;p&amp;gt;&lt;span lang="ZH-CN"&gt;&amp;rdquo;，文本例如&amp;ldquo;&lt;/span&gt;&lt;wbr&gt;&lt;/wbr&gt;Text&lt;span lang="ZH-CN"&gt;&amp;rdquo;，还有尾节点例如&amp;ldquo;&lt;/span&gt;&amp;lt;/p&amp;gt;&lt;span lang="ZH-CN"&gt;&amp;rdquo;。整个&lt;/span&gt;HTML&lt;span lang="ZH-CN"&gt;文本被打&lt;wbr&gt;&lt;/wbr&gt;平，解析成为一个节点列表。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;h1 style="margin-right: 0in; margin-left: 0.25in; margin-bottom: 0.0001pt; text-indent: 0.5in;"&gt;&lt;span style="font-size: 11pt; font-weight: normal;"&gt;&lt;a href="http://www.majestic12.co.uk/projects/html_parser.php" target="_blank"&gt;HTML parser&lt;/a&gt;&lt;/span&gt;&lt;span style="font-size: 11pt; font-weight: normal;" lang="ZH-CN"&gt;就是这样一种做法，其特点是性能快。&lt;/span&gt;&lt;span style="font-size: 11pt; font-weight: normal;"&gt;CSDN&lt;/span&gt;&lt;span style="font-size: 11pt; font-weight: normal;" lang="ZH-CN"&gt;上有一&lt;wbr&gt;&lt;/wbr&gt;篇帖子写的很好，思想跟这个类似，链接：&lt;/span&gt;&lt;span style="font-size: 11pt; font-weight: normal;"&gt;&amp;nbsp;&#xD;
&lt;a href="http://blog.csdn.net/liigo/archive/2011/01/19/6153829.aspx" target="_blank"&gt;http://blog.csdn.net/liigo/&lt;wbr&gt;&lt;/wbr&gt;archive/2011/01/19/6153829.&lt;wbr&gt;&lt;/wbr&gt;aspx&lt;/a&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p  style="margin-left: 0.75in;"&gt;&lt;/p&gt;&#xD;
&lt;p &gt;&lt;span lang="ZH-CN"&gt;根据我的需求，我还是使用了&lt;/span&gt;&lt;b&gt;&lt;a href="http://htmlagilitypack.codeplex.com/" target="_blank"&gt;&lt;span style="font-weight: normal;"&gt;Html&#xD;
Agility Pack&lt;/span&gt;&lt;/a&gt;&lt;/b&gt;&lt;span lang="ZH-CN"&gt;库，可以很方便的从&lt;/span&gt;HTML&lt;span lang="ZH-CN"&gt;中检索出需要的信息。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p &gt;&lt;/p&gt;&#xD;
&lt;p &gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/b&gt;&lt;b&gt;&lt;span lang="ZH-CN"&gt;结语：&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&#xD;
&lt;p &gt;HTML Parser&lt;span lang="ZH-CN"&gt;用处还是很大的。比如&lt;/span&gt;Web&lt;span lang="ZH-CN"&gt;页面格式检查、&lt;wbr&gt;&lt;/wbr&gt;内容检索、内容抓取、内容更改等等。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&lt;img src="http://www.cnblogs.com/tedzhao/aggbug/1941591.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/tedzhao/archive/2011/01/22/HTML_Parser.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/tedzhao/archive/2011/01/11/Collection_Interface_Summary.html</id><title type="text">WPF和Silverlight集合类型接口汇总</title><summary type="text">最近一直在整理WPF和Silverlight下数据绑定控件的问题，其中一个点就是关于数据源的。WPF和Silverlight下数据绑定控件的数据源往往就是一个集合，例如IEnumerable，ICollectionView等等。.Net Framework定义了很多的集合类型，每一个都略有不同，都有自己的特性。好记性不如烂笔头，在这里总结一下，以备后用。</summary><published>2011-01-11T01:27:00Z</published><updated>2011-01-11T01:27:00Z</updated><author><name>ted</name><uri>http://www.cnblogs.com/tedzhao/</uri></author><link rel="alternate" href="http://www.cnblogs.com/tedzhao/archive/2011/01/11/Collection_Interface_Summary.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/tedzhao/archive/2011/01/11/Collection_Interface_Summary.html"/><content type="html">&lt;p&gt;原创文章，如需转载，请注明出处。&lt;/p&gt;&#xD;
&lt;p&gt;最近一直在整理WPF和Silverlight下数据绑定控件的问题，其中一个点就是关于数据源的。WPF和Silverlight下数据绑定控件的数据源往往就是一个集合，例如IEnumerable，ICollectionView等等。&lt;br /&gt;.Net Framework定义了很多的集合类型，每一个都略有不同，都有自己的特性。好记性不如烂笔头，在这里总结一下，以备后用。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;1. Collection Basic&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;IEnumerable and IEnumerable&amp;lt;T&amp;gt;&lt;/strong&gt;&lt;br /&gt;IEnumerable&amp;lt;T&amp;gt; is just like IEnumerable, but strongly typed.&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;interface&lt;/span&gt;&lt;span style="color: #000000;"&gt; IEnumerable&lt;br /&gt;{&lt;br /&gt;    IEnumerator GetEnumerator();&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;interface&lt;/span&gt;&lt;span style="color: #000000;"&gt; IEnumerable&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; : IEnumerable&lt;br /&gt;{&lt;br /&gt;    IEnumerator&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; GetEnumerator();&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;strong&gt;ICollection and ICollection&amp;lt;T&amp;gt;&lt;/strong&gt;&lt;br /&gt;ICollection&amp;lt;T&amp;gt; seems like ICollection, but it&amp;rsquo;s actually a very different abstraction. We found that ICollection was not very useful. At the same time, we did not have an abstraction that represented an read/write non-indexed collection. ICollection&amp;lt;T&amp;gt; is such abstraction and you could say that ICollection does not have an exact corresponding peer in the generic world.&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('e8298239-e25a-498b-b9ee-c3a459b77f68')"&gt;&#xD;
&lt;div id="cnblogs_code_open_e8298239-e25a-498b-b9ee-c3a459b77f68" &gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;interface&lt;/span&gt;&lt;span style="color: #000000;"&gt; ICollection : IEnumerable&lt;br /&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; CopyTo(Array array, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; index);&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; Count { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; IsSynchronized { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; SyncRoot { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;interface&lt;/span&gt;&lt;span style="color: #000000;"&gt; ICollection&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; : IEnumerable&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;, IEnumerable&lt;br /&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Add(T item);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Clear();&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; Contains(T item);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; CopyTo(T[] array, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; arrayIndex);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; Remove(T item);&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; Count { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; IsReadOnly { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;strong&gt;IList and IList&amp;lt;T&amp;gt;&lt;/strong&gt;&lt;br /&gt;IList&amp;lt;T&amp;gt; is just strongly typed IList, and just remove the IsFixedSize property.&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('69f011e6-7d9a-4ec4-bf33-29e822ff5c13')"&gt;&#xD;
&lt;div id="cnblogs_code_open_69f011e6-7d9a-4ec4-bf33-29e822ff5c13" &gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;interface&lt;/span&gt;&lt;span style="color: #000000;"&gt; IList : ICollection, IEnumerable&lt;br /&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; Add(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; value);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Clear();&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; Contains(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; value);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; IndexOf(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; value);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Insert(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; index, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; value);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Remove(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; value);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; RemoveAt(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; index);&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; IsFixedSize { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; IsReadOnly { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;[&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; index] { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;interface&lt;/span&gt;&lt;span style="color: #000000;"&gt; IList&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; : ICollection&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;, IEnumerable&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;, IEnumerable&lt;br /&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; IndexOf(T item);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Insert(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; index, T item);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; RemoveAt(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; index);&lt;br /&gt;&lt;br /&gt;    T &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;[&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; index] { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;strong&gt;List&amp;lt;T&amp;gt; vs. Collection&amp;lt;T&amp;gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Difference：Collection&amp;lt;T&amp;gt; is made for extensibility and &#xD;
List&amp;lt;T&amp;gt; is made for performance，and the List&amp;lt;T&amp;gt; is optimized&#xD;
 for speed, size, and power. Use List&amp;lt;T&amp;gt; for all your heavy &#xD;
lifting internally, and expose a Collection&amp;lt;T&amp;gt; in public API.&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('89ac09a4-1f4c-4ad4-b080-9338352e38fe')"&gt;&#xD;
&lt;div id="cnblogs_code_open_89ac09a4-1f4c-4ad4-b080-9338352e38fe" &gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; List&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; : IList&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;, ICollection&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;, IEnumerable&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;, IList, ICollection, IEnumerable&lt;br /&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;...&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; Collection&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; : IList&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;, ICollection&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;, IEnumerable&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;, IList, ICollection, IEnumerable&lt;br /&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;...&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;br /&gt;这些是.Net Framework 1.0 或者2.0定义的最基本的集合类型接口，以上是一个简单的总结。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;2. Collection in WPF and Silverlight&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;下面的这些接口是WPF、Silverlight下做数据绑定需要重点关注的。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;strong&gt;INotifyCollectionChanged(.Net 3.0) &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Notifies listeners of dynamic changes, such as when items get added and removed or the whole list is refreshed.&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;interface&lt;/span&gt;&lt;span style="color: #000000;"&gt; INotifyCollectionChanged&lt;br /&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;event&lt;/span&gt;&lt;span style="color: #000000;"&gt; NotifyCollectionChangedEventHandler CollectionChanged;&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;strong&gt;INotifyPropertyChanged(.Net 2.0):&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Notifies clients that a property value has changed, typically binding clients, that a property value has changed.&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;interface&lt;/span&gt;&lt;span style="color: #000000;"&gt; INotifyPropertyChanged&lt;br /&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;event&lt;/span&gt;&lt;span style="color: #000000;"&gt; PropertyChangedEventHandler PropertyChanged;&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;strong&gt;ICollectionView(.Net 3.0)&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Enables collections to have the functionalities of current record management, custom sorting, filtering, and grouping.&lt;br /&gt;A collection view is a layer on top of a binding source collection that allows user to navigate and display the source collection based on sort, filter, and group queries, without having to change the underlying source collection itself. A collection view also maintains a pointer to the current item in the collection. If the source collection implements the INotifyCollectionChanged interface, the changes raised by the CollectionChanged event are propagated to the views.&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('89b47436-341c-44e1-bb61-20bba394eb23')"&gt;&lt;strong&gt;ICollectionView&lt;/strong&gt;&#xD;
&lt;div id="cnblogs_code_open_89b47436-341c-44e1-bb61-20bba394eb23" &gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;interface&lt;/span&gt;&lt;span style="color: #000000;"&gt; ICollectionView : IEnumerable, INotifyCollectionChanged&lt;br /&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;event&lt;/span&gt;&lt;span style="color: #000000;"&gt; EventHandler CurrentChanged;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;event&lt;/span&gt;&lt;span style="color: #000000;"&gt; CurrentChangingEventHandler CurrentChanging;&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; Contains(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; item);&lt;br /&gt;    IDisposable DeferRefresh();&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; MoveCurrentTo(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; item);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; MoveCurrentToFirst();&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; MoveCurrentToLast();&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; MoveCurrentToNext();&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; MoveCurrentToPosition(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; position);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; MoveCurrentToPrevious();&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Refresh();&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; CanFilter { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; CanGroup { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; CanSort { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br /&gt;    CultureInfo Culture { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; CurrentItem { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; CurrentPosition { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br /&gt;    Predicate&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; Filter { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br /&gt;    ObservableCollection&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;GroupDescription&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; GroupDescriptions { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br /&gt;    ReadOnlyObservableCollection&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; Groups { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; IsCurrentAfterLast { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; IsCurrentBeforeFirst { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; IsEmpty { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br /&gt;    SortDescriptionCollection SortDescriptions { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br /&gt;    IEnumerable SourceCollection { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;strong&gt;ICollectionViewFactory(.Net 3.0)&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;An interface that enables implementing collections to create a view to their data. Normally, user code does not call methods on this interface.&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;interface&lt;/span&gt;&lt;span style="color: #000000;"&gt; ICollectionViewFactory&lt;br /&gt;{&lt;br /&gt;    ICollectionView CreateView();&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;strong&gt;IPagedCollectionView(Silverlight 3.0)&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Defines methods and properties that a collection view implements to provide paging capabilities to a collection.&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('958c1dd5-eb1b-43bb-b2b0-d32d2b8dbbb6')"&gt;&#xD;
&lt;div id="cnblogs_code_open_958c1dd5-eb1b-43bb-b2b0-d32d2b8dbbb6" &gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;interface&lt;/span&gt;&lt;span style="color: #000000;"&gt; IPagedCollectionView&lt;br /&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;event&lt;/span&gt;&lt;span style="color: #000000;"&gt; EventHandler&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;EventArgs&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; PageChanged;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;event&lt;/span&gt;&lt;span style="color: #000000;"&gt; EventHandler&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;PageChangingEventArgs&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; PageChanging;&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; MoveToFirstPage();&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; MoveToLastPage();&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; MoveToNextPage();&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; MoveToPage(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; pageIndex);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; MoveToPreviousPage();&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; CanChangePage { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; IsPageChanging { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; ItemCount { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; PageIndex { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; PageSize { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; TotalItemCount { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;strong&gt;IEditableCollectionView(.Net 3.5)&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Defines methods and properties that a CollectionView implements to provide editing capabilities to a collection.&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('32c1b431-881b-4790-827f-23ba214143db')"&gt;&#xD;
&lt;div id="cnblogs_code_open_32c1b431-881b-4790-827f-23ba214143db" &gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;interface&lt;/span&gt;&lt;span style="color: #000000;"&gt; IEditableCollectionView&lt;br /&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; AddNew();&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; CancelEdit();&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; CancelNew();&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; CommitEdit();&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; CommitNew();&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; EditItem(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; item);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Remove(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; item);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; RemoveAt(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; index);&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; CanAddNew { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; CanCancelEdit { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; CanRemove { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; CurrentAddItem { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; CurrentEditItem { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; IsAddingNew { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; IsEditingItem { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br /&gt;    NewItemPlaceholderPosition NewItemPlaceholderPosition { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;strong&gt;IEditableCollectionViewAddNewItem(WPF .Net 3.5)&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Defines methods and properties that a CollectionView implements to enable specifying adding items of a specific type.&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;interface&lt;/span&gt;&lt;span style="color: #000000;"&gt; IEditableCollectionViewAddNewItem : IEditableCollectionView&lt;br /&gt;{&lt;br /&gt;    Object AddNewItem(Object newItem);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; CanAddNewItem { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;关于IEditableCollectionView这个接口，参见我的文章：&lt;a href="http://www.cnblogs.com/tedzhao/archive/2010/11/12/IEditableObject_and_IEditableCollectionView.html"&gt;http://www.cnblogs.com/tedzhao/archive/2010/11/12/IEditableObject_and_IEditableCollectionView.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;看完了接口，再来几个集合类。&lt;br /&gt;&lt;strong&gt;ObservableCollection(.Net 3.0)&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Represents a dynamic data collection that provides notifications when items get added, removed, or when the whole list is refreshed.&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; ObservableCollection&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; : Collection&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;, INotifyCollectionChanged, &lt;br /&gt;             INotifyPropertyChanged&lt;br /&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;...&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;strong&gt;PagedCollectionView(Silverlight 3.0)&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Represents a view for grouping, sorting, filtering, and navigating a paged data collection.&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;sealed&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; PagedCollectionView : ICollectionView, IEnumerable, &lt;br /&gt;          INotifyCollectionChanged, IPagedCollectionView, &lt;br /&gt;          IEditableCollectionView, INotifyPropertyChanged&lt;br /&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;...&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;strong&gt;CollectionView(WPF, .Net 3.0)&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Represents a view for grouping, sorting, filtering, and navigating a data collection.&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; CollectionView : DispatcherObject, ICollectionView, &lt;br /&gt;          IEnumerable, INotifyCollectionChanged, INotifyPropertyChanged&lt;br /&gt;{    &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;   //&lt;/span&gt;&lt;span style="color: #008000;"&gt;...&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;br /&gt;这几个集合类型是WPF\Silverlight上最常见的数据源。由于Silverlight是Web应用，所以单独定义了一个IPagedCollectionView接口用来支持分页。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;3. IQueryable and IEnumerable&lt;span style="color: #ff0000;"&gt;(更新于2011.03.01)&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p align="justify"&gt;&lt;strong&gt;IEnumerable&amp;lt;T&amp;gt;&lt;/strong&gt; is great for working with in-memory collections, but &lt;strong&gt;IQueryable&amp;lt;T&amp;gt;&lt;/strong&gt; allows for a remote data source, like a database or web service.&lt;/p&gt;&#xD;
&lt;p align="justify"&gt;&lt;strong&gt;IEnumerable&lt;/strong&gt; doesn&amp;rsquo;t have the concept&#xD;
 of moving between items, it is a forward only collection. something that most any data source can provide. Using &#xD;
only this minimal functionality, LINQ can provide all of these great &#xD;
operators. &lt;/p&gt;&#xD;
&lt;p align="justify"&gt;&lt;strong&gt;IQueryable&amp;lt;T&amp;gt;&lt;/strong&gt; is a very &#xD;
powerful feature that enables a variety of interesting deferred &#xD;
execution scenarios (like paging and composition based queries). &lt;/p&gt;&lt;img src="http://www.cnblogs.com/tedzhao/aggbug/1930223.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/tedzhao/archive/2011/01/11/Collection_Interface_Summary.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/tedzhao/archive/2010/12/23/Programmer_Interview.html</id><title type="text">如何面试程序员</title><summary type="text">最近看了阮一峰先生写的“如何面试程序员”，如果你从一个被面试者的角度来看的话，其中有一些问题确实是发人深省。</summary><published>2010-12-23T08:35:00Z</published><updated>2010-12-23T08:35:00Z</updated><author><name>ted</name><uri>http://www.cnblogs.com/tedzhao/</uri></author><link rel="alternate" href="http://www.cnblogs.com/tedzhao/archive/2010/12/23/Programmer_Interview.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/tedzhao/archive/2010/12/23/Programmer_Interview.html"/><content type="html">&lt;p&gt;最近看了阮一峰先生写的&amp;ldquo;&lt;a href="http://www.ruanyifeng.com/blog/2010/12/how_to_interview_a_programmer.html"&gt;如何面试程序员&lt;/a&gt;&amp;rdquo;，如果你从一个被面试者的角度来看的话，其中有一些问题确实是发人深省，下面是一些摘录：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="background-color: #c0c0c0;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Why did you get into development?&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="background-color: #c0c0c0;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 你为什么开发软件？&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="background-color: #c0c0c0;"&gt;　　Howmany technical books did you read in the past year?&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #c0c0c0;"&gt;　　去年你读了几本技术书籍？&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="background-color: #c0c0c0;"&gt;　　Whatwas your favorite technical book in the past year? What did you learn from it?&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #c0c0c0;"&gt;　　去年你最喜欢的技术书籍是哪本？你从中学到了什么？&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="background-color: #c0c0c0;"&gt;　　Whatwebsites do you read regularly, related to development?&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #c0c0c0;"&gt;　　平时你经常访问哪些编程类网站？&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="background-color: #c0c0c0;"&gt;　　Doyou maintain any open-source projects?&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #c0c0c0;"&gt;　　你有自己的开源项目吗？&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="background-color: #c0c0c0;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="background-color: #c0c0c0;"&gt;&lt;span style="background-color: #ffffff;"&gt;还有更深层次的：&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="background-color: #c0c0c0;"&gt;　&amp;nbsp;&amp;nbsp; What's your favorite programming language? Why? &lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #c0c0c0;"&gt;　　你最喜欢的编程语言是哪种？为什么？&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="background-color: #c0c0c0;"&gt;　　If you could add one feature to your favorite language,what would it be? Why?&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #c0c0c0;"&gt;　　如果允许你为这种语言加一种功能，你会加什么功能？为什么？&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="background-color: #c0c0c0;"&gt;　　If you could remove one feature from it, what would itbe? Why?&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #c0c0c0;"&gt;　　如果允许你取消一种功能，会是什么功能？为什么？&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="background-color: #c0c0c0;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="background-color: #ffffff;"&gt;假如现在让你回答这些问题&lt;/span&gt;&lt;span style="background-color: #c0c0c0;"&gt;&lt;span style="background-color: #ffffff;"&gt;，你能回答好吗？你有准备一些项目进行开源吗，对于当前的开发语言的想法是什么？&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="background-color: #c0c0c0;"&gt;&lt;span style="background-color: #ffffff;"&gt;新的一年快来了，这些问题也许可以变成下一年的目标，您说哪？&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/tedzhao/aggbug/1912251.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/tedzhao/archive/2010/12/23/Programmer_Interview.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
