<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.paulomorgado.net/~d/styles/itemcontent.css"?><rss xmlns:a10="http://www.w3.org/2005/Atom" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>Paulo Morgado [EN]</title><link>http://paulomorgado.net/en/</link><description>.NET and Software Architecture and Engeneering</description><generator>CommunityServer 2008.5 SP2 (Build: 40407.4157)</generator><a10:id>/Blogs/EN</a10:id><dc:language xmlns:dc="http://purl.org/dc/elements/1.1/">en</dc:language><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.paulomorgado.net/PauloMorgado/Blogs/EN" /><feedburner:info uri="paulomorgado/blogs/en" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><creativeCommons:license>http://creativecommons.org/licenses/by/3.0/</creativeCommons:license><image><link>http://paulomorgado.net/en/</link><url>http://paulomorgado.net/images/profile/paulomorgado_100x100.png</url><title>Paulo Morgado [EN]</title></image><feedburner:emailServiceId>PauloMorgado/Blogs/EN</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.paulomorgado.net%2FPauloMorgado%2FBlogs%2FEN" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.paulomorgado.net%2FPauloMorgado%2FBlogs%2FEN" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.paulomorgado.net%2FPauloMorgado%2FBlogs%2FEN" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.paulomorgado.net/PauloMorgado/Blogs/EN" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.paulomorgado.net%2FPauloMorgado%2FBlogs%2FEN" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.paulomorgado.net%2FPauloMorgado%2FBlogs%2FEN" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.paulomorgado.net%2FPauloMorgado%2FBlogs%2FEN" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare href="http://www.plusmo.com/add?url=http%3A%2F%2Ffeeds.paulomorgado.net%2FPauloMorgado%2FBlogs%2FEN" src="http://plusmo.com/res/graphics/fbplusmo.gif">Subscribe with Plusmo</feedburner:feedFlare><feedburner:feedFlare href="http://www.thefreedictionary.com/_/hp/AddRSS.aspx?http%3A%2F%2Ffeeds.paulomorgado.net%2FPauloMorgado%2FBlogs%2FEN" src="http://img.tfd.com/hp/addToTheFreeDictionary.gif">Subscribe with The Free Dictionary</feedburner:feedFlare><feedburner:feedFlare href="http://www.bitty.com/manual/?contenttype=rssfeed&amp;contentvalue=http%3A%2F%2Ffeeds.paulomorgado.net%2FPauloMorgado%2FBlogs%2FEN" src="http://www.bitty.com/img/bittychicklet_91x17.gif">Subscribe with Bitty Browser</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsalloy.com/?rss=http%3A%2F%2Ffeeds.paulomorgado.net%2FPauloMorgado%2FBlogs%2FEN" src="http://www.newsalloy.com/subrss3.gif">Subscribe with NewsAlloy</feedburner:feedFlare><feedburner:feedFlare href="http://www.live.com/?add=http%3A%2F%2Ffeeds.paulomorgado.net%2FPauloMorgado%2FBlogs%2FEN" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><feedburner:feedFlare href="http://mix.excite.eu/add?feedurl=http%3A%2F%2Ffeeds.paulomorgado.net%2FPauloMorgado%2FBlogs%2FEN" src="http://image.excite.co.uk/mix/addtomix.gif">Subscribe with Excite MIX</feedburner:feedFlare><feedburner:feedFlare href="http://www.yourminis.com/subscribe.aspx?u=http%3A%2F%2Ffeeds.paulomorgado.net%2FPauloMorgado%2FBlogs%2FEN" src="http://www.yourminis.com/images/addtoyourminisbadge.gif">Subscribe with Yourminis.com</feedburner:feedFlare><feedburner:feedFlare href="http://download.attensa.com/app/get_attensa.html?feedurl=http%3A%2F%2Ffeeds.paulomorgado.net%2FPauloMorgado%2FBlogs%2FEN" src="http://www.attensa.com/blogs/attensa/WindowsLiveWriter/BadgeredintoBadges_10C02/attensa_feed_button5.gif">Subscribe with Attensa for Outlook</feedburner:feedFlare><feedburner:feedFlare href="http://www.webwag.com/wwgthis.php?url=http%3A%2F%2Ffeeds.paulomorgado.net%2FPauloMorgado%2FBlogs%2FEN" src="http://www.webwag.com/images/wwgthis.gif">Subscribe with Webwag</feedburner:feedFlare><feedburner:feedFlare href="http://hub.netomat.net/account/account.autoSubscribe.jspa?urls=http%3A%2F%2Ffeeds.paulomorgado.net%2FPauloMorgado%2FBlogs%2FEN" src="http://www.netomat.net/blogger/images/icon_netomat_feedbutton.gif">Subscribe with netomat Hub</feedburner:feedFlare><feedburner:feedFlare href="http://www.podcastready.com/oneclick_bookmark.php?url=http%3A%2F%2Ffeeds.paulomorgado.net%2FPauloMorgado%2FBlogs%2FEN" src="http://www.podcastready.com/images/podcastready_button.gif">Subscribe with Podcast Ready</feedburner:feedFlare><feedburner:feedFlare href="http://www.flurry.com/pushRssFeed.do?r=fb&amp;url=http%3A%2F%2Ffeeds.paulomorgado.net%2FPauloMorgado%2FBlogs%2FEN" src="http://www.flurry.com/images/flurry_rss_logo2.gif">Subscribe with Flurry</feedburner:feedFlare><feedburner:feedFlare href="http://www.wikio.com/subscribe?url=http%3A%2F%2Ffeeds.paulomorgado.net%2FPauloMorgado%2FBlogs%2FEN" src="http://www.wikio.com/shared/img/add2wikio.gif">Subscribe with Wikio</feedburner:feedFlare><feedburner:feedFlare href="http://www.dailyrotation.com/index.php?feed=http%3A%2F%2Ffeeds.paulomorgado.net%2FPauloMorgado%2FBlogs%2FEN" src="http://www.dailyrotation.com/rss-dr2.gif">Subscribe with Daily Rotation</feedburner:feedFlare><feedburner:browserFriendly>.NET and Software Architecture and Engeneering</feedburner:browserFriendly><item><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1801440</guid><link>http://feeds.paulomorgado.net/~r/PauloMorgado/Blogs/EN/~3/PIXaSRlHLyU/announcing-the-microsoft-roslyn-ctp.aspx</link><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/VisualStudio/default.aspx">VisualStudio</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/VisualBasic/default.aspx">VisualBasic</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/CodeProject/default.aspx">CodeProject</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Roslyn/default.aspx">Roslyn</category><title>Announcing The Microsoft Roslyn CTP</title><description>&lt;p align="justify"&gt;The Roslyn team has announced general availability of the &lt;strong&gt;Roslyn CTP&lt;/strong&gt;!&lt;img src="http://c.statcounter.com/6351077/0/9a1b981a/1/" alt="StatCounter"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;The official launch is at &lt;a href="http://msdn.com/roslyn" target="_blank"&gt;http://msdn.com/roslyn&lt;/a&gt;, and there were a number of blogs to publicize the availability broadly (&lt;a href="http://blogs.msdn.com/b/somasegar/archive/2011/10/19/roslyn-ctp-available-now.aspx" target="_blank"&gt;soma&lt;/a&gt;, &lt;a href="http://blogs.msdn.com/b/ericlippert/archive/2011/10/19/the-roslyn-preview-is-now-available.aspx" target="_blank"&gt;ericli&lt;/a&gt;, &lt;a href="http://blogs.msdn.com/b/visualstudio/archive/2011/10/19/introducing-the-microsoft-roslyn-ctp.aspx" target="_blank"&gt;vsteam&lt;/a&gt;, &lt;a href="http://blogs.msdn.com/b/vbteam/archive/2011/10/19/introducing-the-microsoft-roslyn-ctp.aspx" target="_blank"&gt;vbteam&lt;/a&gt;, &lt;a href="http://blogs.msdn.com/b/csharpfaq/archive/2011/10/19/introducing-the-microsoft-roslyn-ctp.aspx" target="_blank"&gt;c#faq&lt;/a&gt;) and across twitter.&lt;/p&gt;  &lt;p align="justify"&gt;This release marks a significant step to the new way of thinking of compilers, and the agility that is now possible with language innovation, IDE tooling, and powering the ecosystem. The &lt;strong&gt;C#&lt;/strong&gt; and &lt;strong&gt;VB&lt;/strong&gt; compilers are no longer black boxes – something we put source text into, do some magic on, and get an assembly out.&amp;#160; All that rich information about code is no longer thrown away, but is now exposed as a full-fidelity object model that can be easily consumed by all.&amp;#160; In addition, it was released a preview of the first-ever Interactive window for &lt;strong&gt;C#&lt;/strong&gt; that contains full IDE support – including &lt;a title="IntelliSense" href="http://wikipedia.org/wiki/Intellisense" target="_blank"&gt;IntelliSense&lt;/a&gt; and even automatically detecting missing using directives.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;How to get started:&lt;/b&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;Download the &lt;a href="http://download.microsoft.com/download/F/4/7/F4700C93-A150-48D8-A62C-7D075E161F38/RoslynSetup.exe" target="_blank"&gt;CTP&lt;/a&gt;.&amp;#160; The CTP installs on Visual Studio 2010 SP1 and can be safely installed side-by-side with Visual Studio 11.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Go to &lt;strong&gt;Start&lt;/strong&gt; -&amp;gt; &lt;strong&gt;All Programs&lt;/strong&gt; -&amp;gt;&amp;#160; &lt;strong&gt;Microsoft Codename Roslyn CTP&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Getting Started&lt;/strong&gt; to launch the entry point into all the documentation, samples, and tools.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Read the &lt;a href="http://download.microsoft.com/download/E/A/D/EADEC33E-FBA3-43BF-9226-427BDAC27610/Roslyn%20Project%20Overview.docx" target="_blank"&gt;Roslyn Project Overview&lt;/a&gt; for a good overview of the project.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Learn from the rich samples included (paste as &lt;strong&gt;C#&lt;/strong&gt;/&lt;strong&gt;VB&lt;/strong&gt;, refactorings, code analysis, and code generation tools).&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Run the &lt;a href="http://go.microsoft.com/fwlink/?LinkID=231190" target="_blank"&gt;walkthroughs&lt;/a&gt; to learn about the Compiler APIs, the Services API, or using the Interactive window.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;For those of you that aren’t extension writers, download the CTP to try out the Interactive window and use the Copy Paste C#/VB extensions that were built to help with your daily work now!&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;The release includes the following features:&lt;/b&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;&lt;i&gt;Visual Studio Project Templates&lt;/i&gt;         &lt;br /&gt;These project templates help you get started using the Roslyn APIs and building new Visual Studio extensions using the C# or VB APIs.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;&lt;i&gt;Reference Assemblies&lt;/i&gt;         &lt;br /&gt;The Roslyn assemblies can be added to projects via the &lt;strong&gt;Add Reference&lt;/strong&gt; dialog.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;&lt;i&gt;Interactive Window&lt;/i&gt;         &lt;br /&gt;A new tool window called &lt;strong&gt;C# Interactive&lt;/strong&gt; is available in Visual Studio by invoking &lt;strong&gt;View&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Other Windows&lt;/strong&gt; -&amp;gt; &lt;strong&gt;C# Interactive&lt;/strong&gt; from the menu. You can explore by either executing snippets of code in the C# Interactive tool window, or cumulatively building up execution context as you experiment.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;&lt;i&gt;Script File Editing Support&lt;/i&gt;        &lt;br /&gt;C# Script (.csx) files allow top-level statements much like the C# Interactive window. You can create a new C# Script file by invoking File -&amp;gt; New File -&amp;gt; Script -&amp;gt; Visual C# Script from the Visual Studio menu. In addition to typing directly into the tool window, you can also select code in C# and C# Script (.csx) files and invoke &amp;quot;Execute in Interactive&amp;quot; or &amp;quot;Copy to Interactive&amp;quot; from the context menu. C# Script editing features like IntelliSense are powered by the Roslyn Language Service.&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;Please keep in mind that this is only &lt;b&gt;a technology preview&lt;/b&gt;, and it’s not done yet! The primary goal of this CTP is to gather feedback on the public APIs and give an early look at the Interactive window feature. The shape of the APIs are in a fairly stable state, especially the Compiler ones, but there are still a set of known limitations and only a subset of the C# and Visual Basic languages are implemented in the current release.&amp;#160; For a full list of non-implemented language features, see &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/roslyn/thread/f5adeaf0-49d0-42dc-861b-0f6ffd731825" target="_blank"&gt;here&lt;/a&gt;. The Interactive window is only available for C# at this time, but VB is following shortly.&lt;/p&gt;  &lt;p align="justify"&gt;The Roslyn team looks forward to hearing your feedback on the &lt;a href="http://social.msdn.microsoft.com/forums/en-us/roslyn" target="_blank"&gt;forums&lt;/a&gt; e through &lt;a href="http://go.microsoft.com/fwlink/?LinkID=230759" target="_blank"&gt;Connect&lt;/a&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1801440" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/VYqICKZDDz12c8gkbWrlwA-sWj4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VYqICKZDDz12c8gkbWrlwA-sWj4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/VYqICKZDDz12c8gkbWrlwA-sWj4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VYqICKZDDz12c8gkbWrlwA-sWj4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=PIXaSRlHLyU:qK9ZwERSle4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=PIXaSRlHLyU:qK9ZwERSle4:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=PIXaSRlHLyU:qK9ZwERSle4:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=PIXaSRlHLyU:qK9ZwERSle4:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=PIXaSRlHLyU:qK9ZwERSle4:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=PIXaSRlHLyU:qK9ZwERSle4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=PIXaSRlHLyU:qK9ZwERSle4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=PIXaSRlHLyU:qK9ZwERSle4:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=PIXaSRlHLyU:qK9ZwERSle4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=PIXaSRlHLyU:qK9ZwERSle4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=PIXaSRlHLyU:qK9ZwERSle4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=PIXaSRlHLyU:qK9ZwERSle4:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=PIXaSRlHLyU:qK9ZwERSle4:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=PIXaSRlHLyU:qK9ZwERSle4:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=PIXaSRlHLyU:qK9ZwERSle4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=PIXaSRlHLyU:qK9ZwERSle4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=PIXaSRlHLyU:qK9ZwERSle4:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=PIXaSRlHLyU:qK9ZwERSle4:3yuytNF0dJw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=PIXaSRlHLyU:qK9ZwERSle4:3yuytNF0dJw" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PauloMorgado/Blogs/EN/~4/PIXaSRlHLyU" height="1" width="1"/&gt;</description><pubDate>Thu, 20 Oct 2011 00:39:11 Z</pubDate><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Paulo Morgado</dc:creator><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1801440</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1801440</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2011/10/20/announcing-the-microsoft-roslyn-ctp.aspx#comments</comments><feedburner:origLink>http://msmvps.com/blogs/paulomorgado/archive/2011/10/20/announcing-the-microsoft-roslyn-ctp.aspx</feedburner:origLink></item><item><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1801302</guid><link>http://feeds.paulomorgado.net/~r/PauloMorgado/Blogs/EN/~3/2Wu0qHuK4r8/what-is-the-net-framework-4-5.aspx</link><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET4.0/default.aspx">.NET4.0</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/CodeProject/default.aspx">CodeProject</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/async/default.aspx">async</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET4.5/default.aspx">.NET4.5</category><title>What Is The .NET Framework 4.5?</title><description>&lt;p align="justify"&gt;According to the &lt;a title=".NET Blog" href="http://blogs.msdn.com/b/dotnet/" target="_blank"&gt;.NET Blog&lt;/a&gt;, &lt;strong&gt;.NET Framework 4.5&lt;/strong&gt; is an in-place update that replaces &lt;strong&gt;.NET Framework 4.0&lt;/strong&gt; (rather than a side-by-side installation). The goal is for &lt;strong&gt;.NET 4.5&lt;/strong&gt; to be fully &lt;a href="http://en.wikipedia.org/wiki/Backward_compatibility"&gt;backward compatible&lt;/a&gt; with applications built for &lt;strong&gt;.NET 4.0&lt;/strong&gt; (.NET 3.5 and .NET 4.5 will be side-by-side).&lt;img src="http://c.statcounter.com/6351077/0/9a1b981a/1/" alt="StatCounter"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;One of the first things you’ll notice about &lt;strong&gt;.NET 4.5&lt;/strong&gt; is the version number of the &lt;a title="Common Language Runtime (CLR)" href="http://msdn.microsoft.com/library/8bs2ecf4.aspx" target="_blank"&gt;CLR&lt;/a&gt; (4.0.30319) is the same as &lt;strong&gt;.NET 4.0&lt;/strong&gt;; this is the practice used by other in-place updates. (&lt;a title="Compatibility of .NET Framework 4.5" href="http://blogs.msdn.com/b/dotnet/archive/2011/09/26/compatibility-of-net-framework-4-5.aspx" target="_blank"&gt;read more&lt;/a&gt;)&lt;/p&gt;  &lt;p align="justify"&gt;In fact, if you compare a system with &lt;strong&gt;.NET 4.5&lt;/strong&gt; with a system with .NET 4.0 you’ll see that 4.5 is just an update to 4.0:&lt;/p&gt;  &lt;table border="1" cellspacing="0" cellpadding="2"&gt;&lt;thead&gt;     &lt;tr&gt;       &lt;th valign="top" colspan="3"&gt;Registry key: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full&lt;/th&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;th valign="top"&gt;Value&lt;/th&gt;        &lt;th valign="top"&gt;.NET 4.0 &lt;/th&gt;        &lt;th valign="top"&gt;.NET 4.5 &lt;/th&gt;     &lt;/tr&gt;   &lt;/thead&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top"&gt;Version&lt;/td&gt;        &lt;td style="text-align:right;" valign="top"&gt;4.0.30319&lt;/td&gt;        &lt;td style="text-align:right;" valign="top"&gt;4.5.40805&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top"&gt;CBS&lt;/td&gt;        &lt;td style="text-align:right;" valign="top"&gt;1&lt;/td&gt;        &lt;td style="text-align:right;" valign="top"&gt;1&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top"&gt;TargetVersion&lt;/td&gt;        &lt;td style="text-align:right;" valign="top"&gt;4.0.0&lt;/td&gt;        &lt;td style="text-align:right;" valign="top"&gt;4.0.0&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top"&gt;Install&lt;/td&gt;        &lt;td style="text-align:right;" valign="top"&gt;1&lt;/td&gt;        &lt;td style="text-align:right;" valign="top"&gt;1&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top"&gt;Servicing&lt;/td&gt;        &lt;td style="text-align:right;" valign="top"&gt;0&lt;/td&gt;        &lt;td style="text-align:right;" valign="top"&gt;0&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top"&gt;Release&lt;/td&gt;        &lt;td style="text-align:right;" valign="top"&gt;&amp;#160;&lt;/td&gt;        &lt;td style="text-align:right;" valign="top"&gt;368485&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top"&gt;InstallPath&lt;/td&gt;        &lt;td style="text-align:left;" valign="top"&gt;C:\Windows\Microsoft.NET\Framework64\v4.0.30319\&lt;/td&gt;        &lt;td style="text-align:left;" valign="top"&gt;C:\Windows\Microsoft.NET\Framework64\v4.0.30319\&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p align="justify"&gt;One of the major additions to the framework is the support for the &lt;a title="Task-based Asynchronous Pattern" href="http://www.microsoft.com/download/en/details.aspx?id=19957" target="_blank"&gt;Task-based Asynchronous Pattern&lt;/a&gt;. All classes with asynchronous APIs have be augmented with a Task-based asynchronous API.&lt;/p&gt;  &lt;p align="justify"&gt;Task exception handling has also changed in .NET 4.5 to accommodate the new &lt;strong&gt;async&lt;/strong&gt; keywords in &lt;a title="Microsoft Visual C#" href="http://csharp.net/" target="_blank"&gt;C#&lt;/a&gt; and VB. (&lt;a title="Task Exception Handling in .NET 4.5" href="http://blogs.msdn.com/b/pfxteam/archive/2011/09/28/10217876.aspx" target="_blank"&gt;read more&lt;/a&gt;)&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1801302" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/8txnEeXYdtMEcfsyD9Qk2A_948k/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8txnEeXYdtMEcfsyD9Qk2A_948k/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/8txnEeXYdtMEcfsyD9Qk2A_948k/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8txnEeXYdtMEcfsyD9Qk2A_948k/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=2Wu0qHuK4r8:YaM0Zjy3NtE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=2Wu0qHuK4r8:YaM0Zjy3NtE:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=2Wu0qHuK4r8:YaM0Zjy3NtE:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=2Wu0qHuK4r8:YaM0Zjy3NtE:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=2Wu0qHuK4r8:YaM0Zjy3NtE:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=2Wu0qHuK4r8:YaM0Zjy3NtE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=2Wu0qHuK4r8:YaM0Zjy3NtE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=2Wu0qHuK4r8:YaM0Zjy3NtE:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=2Wu0qHuK4r8:YaM0Zjy3NtE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=2Wu0qHuK4r8:YaM0Zjy3NtE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=2Wu0qHuK4r8:YaM0Zjy3NtE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=2Wu0qHuK4r8:YaM0Zjy3NtE:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=2Wu0qHuK4r8:YaM0Zjy3NtE:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=2Wu0qHuK4r8:YaM0Zjy3NtE:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=2Wu0qHuK4r8:YaM0Zjy3NtE:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=2Wu0qHuK4r8:YaM0Zjy3NtE:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=2Wu0qHuK4r8:YaM0Zjy3NtE:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=2Wu0qHuK4r8:YaM0Zjy3NtE:3yuytNF0dJw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=2Wu0qHuK4r8:YaM0Zjy3NtE:3yuytNF0dJw" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PauloMorgado/Blogs/EN/~4/2Wu0qHuK4r8" height="1" width="1"/&gt;</description><pubDate>Mon, 17 Oct 2011 00:50:30 Z</pubDate><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Paulo Morgado</dc:creator><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1801302</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1801302</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2011/10/17/what-is-the-net-framework-4-5.aspx#comments</comments><feedburner:origLink>http://msmvps.com/blogs/paulomorgado/archive/2011/10/17/what-is-the-net-framework-4-5.aspx</feedburner:origLink></item><item><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1801008</guid><link>http://feeds.paulomorgado.net/~r/PauloMorgado/Blogs/EN/~3/tQMRoYaZshg/internet-explorer-10-user-agent-strings-on-windows-8-64bit.aspx</link><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Web/default.aspx">Web</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/InternetExplorer/default.aspx">InternetExplorer</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Windows/default.aspx">Windows</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/CodeProject/default.aspx">CodeProject</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Windows8/default.aspx">Windows8</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/InternetExplorer10/default.aspx">InternetExplorer10</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/WinRT/default.aspx">WinRT</category><title>Internet Explorer 10 User Agent Strings On Windows 8 64bit</title><description>&lt;p align="justify"&gt;&lt;a title="Internet Explorer" href="http://www.microsoft.com/windows/internet-explorer/" target="_blank"&gt;Internet Explorer&lt;/a&gt; 10 is the web browser &lt;a title="Microsoft Corporation" href="http://www.microsoft.com/" target="_blank"&gt;Microsoft&lt;/a&gt; is delivering with &lt;a title="Microsoft Windows" href="http://www.microsoft.com/windows/" target="_blank"&gt;&lt;strong&gt;Windows&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; 8&lt;/strong&gt;.&lt;img src="http://c.statcounter.com/6351077/0/9a1b981a/1/" alt="StatCounter"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;According to its different usages and modes, its &lt;a title="Understanding User-Agent Strings" href="http://msdn.microsoft.com/library/ms537503.aspx" target="_blank"&gt;user agent string&lt;/a&gt; is as follows:&lt;/p&gt;  &lt;table border="1" cellspacing="0" cellpadding="2" width="100%"&gt;&lt;thead&gt;     &lt;tr&gt;       &lt;th valign="top" width="160"&gt;Application&lt;/th&gt;        &lt;th valign="top" width="96"&gt;Environment&lt;/th&gt;        &lt;th valign="top" width="80"&gt;32/64 bit&lt;/th&gt;        &lt;th valign="top"&gt;User Agent String&lt;/th&gt;     &lt;/tr&gt;   &lt;/thead&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" align="left"&gt;Internet Explorer&lt;/td&gt;        &lt;td valign="top" align="center"&gt;Metro&lt;/td&gt;        &lt;td valign="top" align="center"&gt;-&lt;/td&gt;        &lt;td valign="top" align="left"&gt;Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0)&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" align="left"&gt;Javascript Application&lt;/td&gt;        &lt;td valign="top" align="center"&gt;Metro&lt;/td&gt;        &lt;td valign="top" align="center"&gt;-&lt;/td&gt;        &lt;td valign="top" align="left"&gt;Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0;)&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" align="left"&gt;C#/VB Application&lt;/td&gt;        &lt;td valign="top" align="center"&gt;Metro&lt;/td&gt;        &lt;td valign="top" align="center"&gt;32bit&lt;/td&gt;        &lt;td valign="top" width="1039"&gt;Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" align="left"&gt;C#/VB Application&lt;/td&gt;        &lt;td valign="top" align="center"&gt;Metro&lt;/td&gt;        &lt;td valign="top" align="center"&gt;64bit&lt;/td&gt;        &lt;td valign="top" width="1039"&gt;Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0)&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" align="left"&gt;Internet Explorer&lt;/td&gt;        &lt;td valign="top" align="center"&gt;Desktop&lt;/td&gt;        &lt;td valign="top" align="center"&gt;32bit&lt;/td&gt;        &lt;td valign="top" width="1039"&gt;         &lt;div align="left"&gt;Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)&lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" align="left"&gt;Internet Explorer&lt;/td&gt;        &lt;td valign="top" align="center"&gt;Desktop&lt;/td&gt;        &lt;td valign="top" align="center"&gt;64bit&lt;sup&gt;&lt;font size="1"&gt;(1)&lt;/font&gt;&lt;/sup&gt;&lt;/td&gt;        &lt;td valign="top" width="1039"&gt;Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0)&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" align="left"&gt;WPF Application&lt;/td&gt;        &lt;td valign="top" align="center"&gt;Desktop&lt;/td&gt;        &lt;td valign="top" align="center"&gt;32bit&lt;/td&gt;        &lt;td valign="top" width="1039"&gt;Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; WOW64; Trident/6.0; .NET4.0E; .NET4.0C; Tablet PC 2.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Zune 4.7; InfoPath.3)&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" align="left"&gt;WPF Application&lt;/td&gt;        &lt;td valign="top" align="center"&gt;Desktop&lt;/td&gt;        &lt;td valign="top" align="center"&gt;64bit&lt;/td&gt;        &lt;td valign="top" width="1039"&gt;Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; Win64; x64; Trident/6.0; .NET4.0E; .NET4.0C; Tablet PC 2.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Zune 4.7; InfoPath.3)&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;div align="right"&gt;&lt;sup&gt;&lt;font size="1"&gt;(1)&lt;/font&gt;&lt;/sup&gt; Needs to be enabled for each security zone.&lt;/div&gt;  &lt;p align="justify"&gt;Analyzing the above table I conclude that:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;     &lt;div align="justify"&gt;&lt;strong&gt;Metro Internet Explorer&lt;/strong&gt; is always a 64bit application on 64bit &lt;strong&gt;Windows 8&lt;/strong&gt;.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;&lt;strong&gt;Javascript Metro Style Applications&lt;/strong&gt; don’t announce if they are 32bit or 64bit.&lt;/div&gt;      &lt;ol&gt;       &lt;li&gt;         &lt;div align="justify"&gt;They look like they are running on a 32bit &lt;strong&gt;Windows 8&lt;/strong&gt;.&lt;/div&gt;       &lt;/li&gt;     &lt;/ol&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;&lt;strong&gt;Desktop Internet Explorer&lt;/strong&gt; retains the same behavior introduced with &lt;strong&gt;Internet Explorer 8&lt;/strong&gt;.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;&lt;strong&gt;Metro Style C#/VB Applications&lt;/strong&gt; hosting the web browser (&lt;a title="WebView Control" href="http://msdn.microsoft.com/library/windows/apps/windows.ui.xaml.controls.webview.aspx" target="_blank"&gt;WebView control&lt;/a&gt;) exhibit the same behavior as &lt;strong&gt;Internet Explorer&lt;/strong&gt;.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;&lt;strong&gt;Desktop &lt;/strong&gt;&lt;strong&gt;WPF&lt;/strong&gt;&lt;strong&gt; Applications&lt;/strong&gt; hosting the web browser (&lt;a title="WebBrowser Control" href="http://msdn.microsoft.com/library/system.windows.controls.webbrowser.aspx" target="_blank"&gt;WebBrowser control&lt;/a&gt;) retain the same behavior introduced with &lt;strong&gt;Internet Explorer 8&lt;/strong&gt;.&lt;/div&gt;      &lt;ol&gt;       &lt;li&gt;         &lt;div align="justify"&gt;This can be overriden by &lt;a title="Defining Document Compatibility" href="http://msdn.microsoft.com/library/cc288325.aspx" target="_blank"&gt;defining the document compatibility on the server&lt;/a&gt; or &lt;a title="Internet Feature Controls (B..C) - Browser Emulation" href="http://msdn.microsoft.com/library/ee330730.aspx#browser_emulation" target="_blank"&gt;setting the browser emulation feature for the application on the client&lt;/a&gt;.&lt;/div&gt;       &lt;/li&gt;     &lt;/ol&gt;   &lt;/li&gt; &lt;/ol&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1801008" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/6EBh2FW17chVlSVOXMqCdak5BpA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6EBh2FW17chVlSVOXMqCdak5BpA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/6EBh2FW17chVlSVOXMqCdak5BpA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6EBh2FW17chVlSVOXMqCdak5BpA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=tQMRoYaZshg:adjQYzq2m-w:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=tQMRoYaZshg:adjQYzq2m-w:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=tQMRoYaZshg:adjQYzq2m-w:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=tQMRoYaZshg:adjQYzq2m-w:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=tQMRoYaZshg:adjQYzq2m-w:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=tQMRoYaZshg:adjQYzq2m-w:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=tQMRoYaZshg:adjQYzq2m-w:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=tQMRoYaZshg:adjQYzq2m-w:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=tQMRoYaZshg:adjQYzq2m-w:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=tQMRoYaZshg:adjQYzq2m-w:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=tQMRoYaZshg:adjQYzq2m-w:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=tQMRoYaZshg:adjQYzq2m-w:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=tQMRoYaZshg:adjQYzq2m-w:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=tQMRoYaZshg:adjQYzq2m-w:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=tQMRoYaZshg:adjQYzq2m-w:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=tQMRoYaZshg:adjQYzq2m-w:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=tQMRoYaZshg:adjQYzq2m-w:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=tQMRoYaZshg:adjQYzq2m-w:3yuytNF0dJw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=tQMRoYaZshg:adjQYzq2m-w:3yuytNF0dJw" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PauloMorgado/Blogs/EN/~4/tQMRoYaZshg" height="1" width="1"/&gt;</description><pubDate>Tue, 11 Oct 2011 00:03:04 Z</pubDate><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Paulo Morgado</dc:creator><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1801008</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1801008</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2011/10/11/internet-explorer-10-user-agent-strings-on-windows-8-64bit.aspx#comments</comments><feedburner:origLink>http://msmvps.com/blogs/paulomorgado/archive/2011/10/11/internet-explorer-10-user-agent-strings-on-windows-8-64bit.aspx</feedburner:origLink></item><item><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1799373</guid><link>http://feeds.paulomorgado.net/~r/PauloMorgado/Blogs/EN/~3/lkYV3RU-bCI/build-keynotes-live-and-online.aspx</link><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Events/default.aspx">Events</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Windows/default.aspx">Windows</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/BuildWindows/default.aspx">BuildWindows</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Windows8/default.aspx">Windows8</category><title>BUILD Keynotes | Live and Online</title><description>&lt;p align="justify"&gt;&lt;a href="http://www.buildwindows.com/" target="_blank"&gt;BUILD&lt;/a&gt;, the conference that everybody is expecting &lt;a title="Microsoft Corporation" href="http://www.microsoft.com/" target="_blank"&gt;Microsoft&lt;/a&gt; to present the first news about &lt;a title="Microsoft Windows" href="http://www.microsoft.com/windows/" target="_blank"&gt;Windows&lt;/a&gt; 8, for Developers, is about to begin. The good news is that &lt;strong&gt;the Keynotes will be available live online&lt;/strong&gt; on the site &lt;a href="http://www.buildwindows.com" target="_blank"&gt;www.buildwindows.com&lt;/a&gt;!&lt;img src="http://c.statcounter.com/6351077/0/9a1b981a/1/" alt="StatCounter"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://channel9.msdn.com/" target="_blank"&gt;Channel9&lt;/a&gt; is also doing extensive cover of the event with online sessions, interviews, discussion panels, etc. (more news here: &lt;a href="http://news.cnet.com/8301-10805_3-20103036-75/behind-the-scenes-at-microsofts-channel-9/" target="_blank"&gt;http://news.cnet.com/8301-10805_3-20103036-75/behind-the-scenes-at-microsofts-channel-9/&lt;/a&gt;).&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1799373" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/eRUeL2iv2h5UwUnJuryrAw0M1OA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/eRUeL2iv2h5UwUnJuryrAw0M1OA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/eRUeL2iv2h5UwUnJuryrAw0M1OA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/eRUeL2iv2h5UwUnJuryrAw0M1OA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=lkYV3RU-bCI:QimdmPl00Fc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=lkYV3RU-bCI:QimdmPl00Fc:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=lkYV3RU-bCI:QimdmPl00Fc:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=lkYV3RU-bCI:QimdmPl00Fc:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=lkYV3RU-bCI:QimdmPl00Fc:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=lkYV3RU-bCI:QimdmPl00Fc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=lkYV3RU-bCI:QimdmPl00Fc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=lkYV3RU-bCI:QimdmPl00Fc:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=lkYV3RU-bCI:QimdmPl00Fc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=lkYV3RU-bCI:QimdmPl00Fc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=lkYV3RU-bCI:QimdmPl00Fc:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=lkYV3RU-bCI:QimdmPl00Fc:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=lkYV3RU-bCI:QimdmPl00Fc:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=lkYV3RU-bCI:QimdmPl00Fc:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=lkYV3RU-bCI:QimdmPl00Fc:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=lkYV3RU-bCI:QimdmPl00Fc:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=lkYV3RU-bCI:QimdmPl00Fc:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=lkYV3RU-bCI:QimdmPl00Fc:3yuytNF0dJw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=lkYV3RU-bCI:QimdmPl00Fc:3yuytNF0dJw" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PauloMorgado/Blogs/EN/~4/lkYV3RU-bCI" height="1" width="1"/&gt;</description><pubDate>Tue, 13 Sep 2011 01:49:51 Z</pubDate><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Paulo Morgado</dc:creator><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1799373</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1799373</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2011/09/13/build-keynotes-live-and-online.aspx#comments</comments><feedburner:origLink>http://msmvps.com/blogs/paulomorgado/archive/2011/09/13/build-keynotes-live-and-online.aspx</feedburner:origLink></item><item><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1798900</guid><link>http://feeds.paulomorgado.net/~r/PauloMorgado/Blogs/EN/~3/AyL8HEo52WA/cleaning-html-with-regular-expressions.aspx</link><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/HTML/default.aspx">HTML</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/CodeProject/default.aspx">CodeProject</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Regex/default.aspx">Regex</category><title>Cleaning HTML With Regular Expressions</title><description>&lt;p align="justify"&gt;While participating in a forum discussion, the need to clean up &lt;strong&gt;HTML&lt;/strong&gt; from &amp;quot;dangerous&amp;quot; constructs came up.&lt;img src="http://c.statcounter.com/6351077/0/9a1b981a/1/" alt="StatCounter"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;In the present case it was needed to remove &lt;strong&gt;SCRIPT&lt;/strong&gt;, &lt;strong&gt;OBJECT&lt;/strong&gt;, &lt;strong&gt;APPLET&lt;/strong&gt;, &lt;strong&gt;EMBBED&lt;/strong&gt;, &lt;strong&gt;FRAMESET&lt;/strong&gt;, &lt;strong&gt;IFRAME&lt;/strong&gt;, &lt;strong&gt;FORM&lt;/strong&gt;, &lt;strong&gt;INPUT&lt;/strong&gt;, &lt;strong&gt;BUTTON&lt;/strong&gt; and &lt;strong&gt;TEXTAREA&lt;/strong&gt; elements (as far as I can think of) from the &lt;strong&gt;HTML&lt;/strong&gt; source. Every event attribute (&lt;strong&gt;ON&lt;em&gt;EVENT&lt;/em&gt;&lt;/strong&gt;) should also be removed keep all other attributes, though.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;HTML&lt;/strong&gt; is very loose and extremely hard to parse. Elements can be defined as a start tag (&lt;strong&gt;&amp;lt;&lt;em&gt;element-name&lt;/em&gt;&amp;gt;&lt;/strong&gt;) and an end tag (&lt;strong&gt;&amp;lt;/&lt;em&gt;element-name&lt;/em&gt;&amp;gt;&lt;/strong&gt;) although some elements don&amp;#39;t require the end tag. If &lt;strong&gt;XHTML&lt;/strong&gt; is being parsed, elements without an end tag require the tag to be terminated with &lt;strong&gt;/&amp;gt;&lt;/strong&gt; instead of just &lt;strong&gt;&amp;gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p align="justify"&gt;Attributes are not easier to parse. By definition, attribute values are required to be delimited by quotes (&lt;strong&gt;&amp;#39;&lt;/strong&gt;) or double quotes (&lt;strong&gt;&amp;quot;&lt;/strong&gt;), but some browsers accept attribute values without any delimiter.&lt;/p&gt;
&lt;p align="justify"&gt;We could build a parser, but then it will become costly to add or remove elements or attributes. Using a &lt;a target="_blank" rel="nofollow" href="http://en.wikipedia.org/wiki/Regular_expression" title="Regular expression - Wikipedia, the free encyclopedia"&gt;regular expression&lt;/a&gt; to remove unwanted elements and attributes seems like the best option.&lt;/p&gt;
&lt;p align="justify"&gt;First, lets capture all unwanted elements with start and end tags. To capture these elements we must:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;Capture the begin tag character followed by the element name (for which we will store its name - &lt;strong&gt;t&lt;/strong&gt;): &lt;strong&gt;&amp;lt;(?&amp;lt;t&amp;gt;&lt;em&gt;element-name&lt;/em&gt;)&lt;/strong&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="left"&gt;Capture optional white spaces followed by any character: &lt;strong&gt;(\s+.*?)?&lt;/strong&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="left"&gt;Capture the end tag character: &lt;strong&gt;&amp;gt;&lt;/strong&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="left"&gt;Capture optional any characters: &lt;strong&gt;.*?&lt;/strong&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="left"&gt;Capture the begin tag character followed by closing tag character, the element name (referenced by the name - &lt;strong&gt;t&lt;/strong&gt;) and the end tag character: &lt;strong&gt;&amp;lt;/\k&amp;lt;t&amp;gt;&amp;gt;&lt;/strong&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="code"&gt;&amp;lt;&lt;em&gt;(&lt;/em&gt;?&amp;lt;t&amp;gt;&lt;em&gt;tag-name&lt;/em&gt;(\s+.*?)?&amp;gt;.*?&amp;lt;/\k&amp;lt;t&amp;gt;&amp;gt;&lt;/pre&gt;
&lt;p align="justify"&gt;To capture all unwanted element types, we end up with the following regular expression:&lt;/p&gt;
&lt;pre class="code"&gt;&amp;lt;(?&amp;lt;t&amp;gt;script|object|applet|embbed|frameset|iframe|form|textarea)(\s+.*?)?&amp;gt;.*?&amp;lt;/\k&amp;lt;t&amp;gt;&amp;gt;&lt;/pre&gt;
&lt;p align="justify"&gt;Next, lets capture all unwanted elements without an end tag. To capture these elements we must:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;Capture the begin tag character followed by the element name: &lt;strong&gt;&amp;lt;&lt;em&gt;element-name&lt;/em&gt;&lt;/strong&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="left"&gt;Capture optional white spaces followed by any character: &lt;strong&gt;(\s+.*?)?&lt;/strong&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="left"&gt;Capture an optional closing tag character: &lt;strong&gt;/?&lt;/strong&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="left"&gt;Capture the end tag character: &lt;strong&gt;&amp;gt;&lt;/strong&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="code"&gt;&amp;lt;&lt;em&gt;tag-name&lt;/em&gt;(\s+.*?)?/?&amp;gt;&lt;/pre&gt;
&lt;p align="justify"&gt;To capture all unwanted element types, we end up with the following regular expression:&lt;/p&gt;
&lt;pre class="code"&gt;&amp;lt;(script|object|applet|embbed|frameset|iframe|form|textarea|input|button)(\s+.*?)?/?&amp;gt;&lt;/pre&gt;
&lt;p align="justify"&gt;To remove those unwanted elements from the source &lt;strong&gt;HTML&lt;/strong&gt;, we can combine these two previous regular expressions into one and replace any match with an empty string:&lt;/p&gt;
&lt;pre class="code"&gt;&lt;span style="color:black;"&gt;&lt;span style="color:#a5a5a5;"&gt;Regex&lt;/span&gt;.Replace(
    sourceHtml,
    &lt;/span&gt;&lt;span style="color:#dc1414;"&gt;&amp;quot;|(&amp;lt;(?&amp;lt;t&amp;gt;script|object|applet|embbed|frameset|iframe|form|textarea)(\\s+.*?)?&amp;gt;.*?&amp;lt;/\\k&amp;lt;t&amp;gt;&amp;gt;)&amp;quot;
        &lt;/span&gt;&lt;span style="color:black;"&gt;+ &lt;/span&gt;&lt;span style="color:#dc1414;"&gt;&amp;quot;|(&amp;lt;(script|object|applet|embbed|frameset|iframe|form|input|button|textarea)(&lt;a&gt;\\s+.*?)?/?&amp;gt;)&amp;quot;&lt;/a&gt;    &lt;/span&gt;&lt;span style="color:black;"&gt;,
&lt;/span&gt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&lt;span style="color:black;"&gt;.Empty);&lt;/span&gt;&lt;/pre&gt;
&lt;p align="justify"&gt;And finally, the unwanted attributes. This one is trickier because we want to capture unwanted attributes inside an element&amp;#39;s start tag. To achieve that, we need to match an element&amp;#39;s opening tag and capture all attribute definitions. To capture these attributes we must:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="justify"&gt;Match but ignore the begin tag character followed by any element name: &lt;strong&gt;(?&amp;lt;=&amp;lt;\w+)&lt;/strong&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;Match all:&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="justify"&gt;Don&amp;rsquo;t capture mandatory with spaces: &lt;strong&gt;(?:\s+)&lt;/strong&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;Capture attribute definition:&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="justify"&gt;Capture mandatory attribute name: &lt;strong&gt;\w+&lt;/strong&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;Capture mandatory equals sign:&lt;strong&gt; =&lt;/strong&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;Capture value specification in one of the forms:&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="justify"&gt;Capture double quoted value: &lt;strong&gt;&amp;quot;[^&amp;quot;]*&amp;quot;&lt;/strong&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;Capture single quoted value: &lt;strong&gt;&amp;#39;[^&amp;#39;]*&amp;#39;&lt;/strong&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;Capture unquoted value: &lt;strong&gt;.*?&lt;/strong&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;Match but ignore end tag: &lt;strong&gt;(?=/?&amp;gt;)&lt;/strong&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="code"&gt;(?&amp;lt;=&amp;lt;\w+)((?:\s+)(\w+=((&amp;quot;[^&amp;quot;]*&amp;quot;)|(&amp;#39;[^&amp;#39;]*&amp;#39;)|(.*?)))*(?=/?&amp;gt;)&lt;/pre&gt;
&lt;p align="justify"&gt;The problem with the previous regular expression is that it matches the start tag and captures the whole list of attributes and not each unwanted attribute by itself. This prevents us from from replacing each match with a fixed value (empty string).&lt;/p&gt;
&lt;p align="justify"&gt;To solve this, we have to name what we want to capture and use the &lt;strong&gt;&lt;a target="_blank" rel="nofollow" href="http://msdn.microsoft.com/library/system.text.regularexpressions.regex.replace.aspx" title="Regex.Replace Method (System.Text.RegularExpressions)"&gt;Replace&lt;/a&gt;&lt;/strong&gt; overload that uses a &lt;strong&gt;&lt;a target="_blank" rel="nofollow" href="http://msdn.microsoft.com/library/system.text.regularexpressions.matchevaluator.aspx" title="MatchEvaluator Delegate (System.Text.RegularExpressions)"&gt;MatchEvaluator&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p align="justify"&gt;We could capture unwanted attributes as we did for the unwanted elements, but then we would need to remove them from the list of all the element&amp;rsquo;s attributes. Instead, we&amp;rsquo;ll capture the wanted attributes and build the list of attributes. To identify the wanted attributes, we&amp;rsquo;ll need to name them (&lt;strong&gt;a&lt;/strong&gt;). The resulting code will be something like this:&lt;/p&gt;
&lt;pre class="code"&gt;&lt;span style="color:black;"&gt;&lt;span style="color:#a5a5a5;"&gt;Regex&lt;/span&gt;.Replace(
    sourceHtml,
    &lt;/span&gt;&lt;span style="color:#dc1414;"&gt;&amp;quot;((?&amp;lt;=&amp;lt;\\w+)((?:\\s+)((?:on\\w+=((\&amp;quot;[^\&amp;quot;]*\&amp;quot;)|(&amp;#39;[^&amp;#39;]*&amp;#39;)|(.*?)))|(?&amp;lt;a&amp;gt;(?!on)\\w+=((\&amp;quot;[^\&amp;quot;]*\&amp;quot;)|(&amp;#39;[^&amp;#39;]*&amp;#39;)|(.*?)))))*(?=/?&amp;gt;))&amp;quot;&lt;/span&gt;&lt;span style="color:black;"&gt;,
    match =&amp;gt;
    {
        &lt;/span&gt;&lt;span style="color:blue;"&gt;if &lt;/span&gt;&lt;span style="color:black;"&gt;(!match.Groups[&lt;/span&gt;&lt;span style="color:#dc1414;"&gt;&amp;quot;a&amp;quot;&lt;/span&gt;&lt;span style="color:black;"&gt;].Success)
        {
            &lt;/span&gt;&lt;span style="color:blue;"&gt;return string&lt;/span&gt;&lt;span style="color:black;"&gt;.Empty;
        }
        
        &lt;/span&gt;&lt;span style="color:blue;"&gt;var &lt;/span&gt;&lt;span style="color:black;"&gt;attributesBuilder = &lt;/span&gt;&lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:black;"&gt;&lt;span style="color:#a5a5a5;"&gt;StringBuilder&lt;/span&gt;();
        
        &lt;/span&gt;&lt;span style="color:blue;"&gt;foreach&lt;/span&gt;&lt;span style="color:black;"&gt;(&lt;span style="color:#a5a5a5;"&gt;Capture&lt;/span&gt; capture &lt;/span&gt;&lt;span style="color:blue;"&gt;in &lt;/span&gt;&lt;span style="color:black;"&gt;match.Groups[&lt;/span&gt;&lt;span style="color:#dc1414;"&gt;&amp;quot;a&amp;quot;&lt;/span&gt;&lt;span style="color:black;"&gt;].Captures)
        {
            attributesBuilder.Append(&lt;/span&gt;&lt;span style="color:#dc1414;"&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span style="color:black;"&gt;);
            attributesBuilder.Append(capture.Value);
        }
        
        &lt;/span&gt;&lt;span style="color:blue;"&gt;return &lt;/span&gt;&lt;span style="color:black;"&gt;attributesBuilder.ToString();
    }
);
&lt;/span&gt;&lt;/pre&gt;
&lt;p align="justify"&gt;To avoid parsing the source &lt;strong&gt;HTML&lt;/strong&gt; more than once, we can combine all the regular expressions into a single one.&lt;/p&gt;
&lt;p align="justify"&gt;Because we are still outputting only the wanted attributes, there&amp;rsquo;s no change to the match evaluator.&lt;/p&gt;
&lt;p align="justify"&gt;A few options (&lt;strong&gt;&lt;a target="_blank" rel="nofollow" href="http://msdn.microsoft.com/library/system.text.regularexpressions.regexoptions.aspx" title="RegexOptions Enumeration (System.Text.RegularExpressions)"&gt;RegexOptions&lt;/a&gt;&lt;/strong&gt;) will also be added to increase functionality and performance:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;IgnoreCase&lt;/strong&gt;: For case-insensitive matching. &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CultureInvariant&lt;/strong&gt;: For ignoring cultural differences in language. &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multiline&lt;/strong&gt;: For multiline mode. &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ExplicitCapture&lt;/strong&gt;: For capturing only named captures. &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Compiled&lt;/strong&gt;: For compiling the regular expression into an assembly. Only if the regular expression is to be used many times. &lt;/li&gt;
&lt;/ul&gt;
&lt;p align="justify"&gt;The resulting code will be this:&lt;/p&gt;
&lt;pre class="code"&gt;&lt;span style="color:black;"&gt;&lt;span style="color:#a5a5a5;"&gt;Regex&lt;/span&gt;.Replace(
    sourceHtml,
    &lt;/span&gt;&lt;span style="color:#dc1414;"&gt;&amp;quot;(&amp;lt;(?&amp;lt;t&amp;gt;script|object|applet|embbed|frameset|iframe|form|textarea)(\\s+.*?)?&amp;gt;.*?&amp;lt;/\\k&amp;lt;t&amp;gt;&amp;gt;)&amp;quot;
        &lt;/span&gt;&lt;span style="color:black;"&gt;+ &lt;/span&gt;&lt;span style="color:#dc1414;"&gt;&amp;quot;|(&amp;lt;(script|object|applet|embbed|frameset|iframe|form|input|button|textarea)(\\s+.*?)?/?&amp;gt;)&amp;quot;&lt;/span&gt;
        &lt;span style="color:black;"&gt;+ &lt;/span&gt;&lt;span style="color:#dc1414;"&gt;&amp;quot;|((?&amp;lt;=&amp;lt;\\w+)((?:\\s+)((?:on\\w+=((\&amp;quot;[^\&amp;quot;]*\&amp;quot;)|(&amp;#39;[^&amp;#39;]*&amp;#39;)|(.*?)))|(?&amp;lt;a&amp;gt;(?!on)\\w+=((\&amp;quot;[^\&amp;quot;]*\&amp;quot;)|(&amp;#39;[^&amp;#39;]*&amp;#39;)|(.*?)))))*(?=/?&amp;gt;))&amp;quot;&lt;span style="color:black;"&gt;,
    match =&amp;gt;
    {
        &lt;/span&gt;&lt;span style="color:blue;"&gt;if &lt;/span&gt;&lt;span style="color:black;"&gt;(!match.Groups[&lt;/span&gt;&lt;span style="color:#dc1414;"&gt;&amp;quot;a&amp;quot;&lt;/span&gt;&lt;span style="color:black;"&gt;].Success)
        {
            &lt;/span&gt;&lt;span style="color:blue;"&gt;return string&lt;/span&gt;&lt;span style="color:black;"&gt;.Empty;
        }
        
        &lt;/span&gt;&lt;span style="color:blue;"&gt;var &lt;/span&gt;&lt;span style="color:black;"&gt;attributesBuilder = &lt;/span&gt;&lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:black;"&gt;&lt;span style="color:#a5a5a5;"&gt;StringBuilder&lt;/span&gt;();
        
        &lt;/span&gt;&lt;span style="color:blue;"&gt;foreach&lt;/span&gt;&lt;span style="color:black;"&gt;(&lt;span style="color:#a5a5a5;"&gt;Capture&lt;/span&gt; capture &lt;/span&gt;&lt;span style="color:blue;"&gt;in &lt;/span&gt;&lt;span style="color:black;"&gt;match.Groups[&lt;/span&gt;&lt;span style="color:#dc1414;"&gt;&amp;quot;a&amp;quot;&lt;/span&gt;&lt;span style="color:black;"&gt;].Captures)
        {
            attributesBuilder.Append(&lt;/span&gt;&lt;span style="color:#dc1414;"&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span style="color:black;"&gt;);
            attributesBuilder.Append(capture.Value);
        }
        
        &lt;/span&gt;&lt;span style="color:blue;"&gt;return &lt;/span&gt;&lt;span style="color:black;"&gt;attributesBuilder.ToString();
    },
    &lt;span style="color:#a5a5a5;"&gt;RegexOptions&lt;/span&gt;.IgnoreCase
        | &lt;span style="color:#a5a5a5;"&gt;RegexOptions&lt;/span&gt;.Multiline
        | &lt;span style="color:#a5a5a5;"&gt;RegexOptions&lt;/span&gt;.ExplicitCapture
        | &lt;span style="color:#a5a5a5;"&gt;RegexOptions&lt;/span&gt;.CultureInvariant
        | &lt;span style="color:#a5a5a5;"&gt;RegexOptions&lt;/span&gt;.Compiled
);
&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;This was not extensively tested and there might be some wanted &lt;strong&gt;HTML&lt;/strong&gt; remove and some unwanted &lt;strong&gt;HTML&lt;/strong&gt; kept, but it&amp;rsquo;s probably very close to a good solution.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1798900" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/IJjrVNJyK_AWNSuJo0bAtIn--sk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/IJjrVNJyK_AWNSuJo0bAtIn--sk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/IJjrVNJyK_AWNSuJo0bAtIn--sk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/IJjrVNJyK_AWNSuJo0bAtIn--sk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=AyL8HEo52WA:hBb5jOBgC-M:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=AyL8HEo52WA:hBb5jOBgC-M:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=AyL8HEo52WA:hBb5jOBgC-M:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=AyL8HEo52WA:hBb5jOBgC-M:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=AyL8HEo52WA:hBb5jOBgC-M:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=AyL8HEo52WA:hBb5jOBgC-M:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=AyL8HEo52WA:hBb5jOBgC-M:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=AyL8HEo52WA:hBb5jOBgC-M:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=AyL8HEo52WA:hBb5jOBgC-M:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=AyL8HEo52WA:hBb5jOBgC-M:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=AyL8HEo52WA:hBb5jOBgC-M:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=AyL8HEo52WA:hBb5jOBgC-M:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=AyL8HEo52WA:hBb5jOBgC-M:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=AyL8HEo52WA:hBb5jOBgC-M:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=AyL8HEo52WA:hBb5jOBgC-M:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=AyL8HEo52WA:hBb5jOBgC-M:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=AyL8HEo52WA:hBb5jOBgC-M:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=AyL8HEo52WA:hBb5jOBgC-M:3yuytNF0dJw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=AyL8HEo52WA:hBb5jOBgC-M:3yuytNF0dJw" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PauloMorgado/Blogs/EN/~4/AyL8HEo52WA" height="1" width="1"/&gt;</description><pubDate>Mon, 05 Sep 2011 04:42:00 Z</pubDate><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Paulo Morgado</dc:creator><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1798900</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1798900</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2011/09/05/cleaning-html-with-regular-expressions.aspx#comments</comments><feedburner:origLink>http://msmvps.com/blogs/paulomorgado/archive/2011/09/05/cleaning-html-with-regular-expressions.aspx</feedburner:origLink></item><item><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1796351</guid><link>http://feeds.paulomorgado.net/~r/PauloMorgado/Blogs/EN/~3/KntoQxg2zPk/the-new-msdn-forums-assistant.aspx</link><title>The new MSDN Forums Assistant</title><description>&lt;p align="left"&gt;&lt;a title="Microsoft Corporation" href="http://www.microsoft.com/" target="_blank"&gt;Microsoft&lt;/a&gt; has launched the &lt;strong&gt;MSDN Forum Assistant&lt;/strong&gt;, which allows you to access &lt;strong&gt;MSDN Forums&lt;/strong&gt; and receive updates directly to your desktop. Features include &lt;strong&gt;Ask a Question&lt;/strong&gt;, &lt;strong&gt;Latest Post&lt;/strong&gt;, &lt;strong&gt;Thread Updates&lt;/strong&gt;, &lt;strong&gt;Priority Support&lt;/strong&gt;, and &lt;strong&gt;Forum Q&amp;amp;A&lt;/strong&gt;. You can download the &lt;strong&gt;MSDN Forum Assistant&lt;/strong&gt; here: &lt;a href="http://gallery.live.com/liveItemDetail.aspx?li=822a3787-89e8-4c6d-8fc4-a413437d86e9" target="_blank"&gt;http://gallery.live.com/liveItemDetail.aspx?li=822a3787-89e8-4c6d-8fc4-a413437d86e9&lt;/a&gt;&lt;img src="http://c.statcounter.com/6351077/0/9a1b981a/1/" alt="StatCounter"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;You can find more information here:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;MSDN Forum Assistant Web Site: &lt;a href="http://msdn.microsoft.com/en-sg/gg650455" target="_blank"&gt;http://msdn.microsoft.com/en-sg/gg650455&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;Video Overview: &lt;a href="http://www.youtube.com/watch?v=JYrNemrjQc8" target="_blank"&gt;http://www.youtube.com/watch?v=JYrNemrjQc8&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1796351" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/xCF580ZjOaS8ivqCR3lnAfe3GBc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xCF580ZjOaS8ivqCR3lnAfe3GBc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/xCF580ZjOaS8ivqCR3lnAfe3GBc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xCF580ZjOaS8ivqCR3lnAfe3GBc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=KntoQxg2zPk:Nb9V7nDC65Y:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=KntoQxg2zPk:Nb9V7nDC65Y:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=KntoQxg2zPk:Nb9V7nDC65Y:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=KntoQxg2zPk:Nb9V7nDC65Y:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=KntoQxg2zPk:Nb9V7nDC65Y:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=KntoQxg2zPk:Nb9V7nDC65Y:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=KntoQxg2zPk:Nb9V7nDC65Y:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=KntoQxg2zPk:Nb9V7nDC65Y:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=KntoQxg2zPk:Nb9V7nDC65Y:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=KntoQxg2zPk:Nb9V7nDC65Y:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=KntoQxg2zPk:Nb9V7nDC65Y:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=KntoQxg2zPk:Nb9V7nDC65Y:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=KntoQxg2zPk:Nb9V7nDC65Y:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=KntoQxg2zPk:Nb9V7nDC65Y:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=KntoQxg2zPk:Nb9V7nDC65Y:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=KntoQxg2zPk:Nb9V7nDC65Y:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=KntoQxg2zPk:Nb9V7nDC65Y:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=KntoQxg2zPk:Nb9V7nDC65Y:3yuytNF0dJw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=KntoQxg2zPk:Nb9V7nDC65Y:3yuytNF0dJw" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PauloMorgado/Blogs/EN/~4/KntoQxg2zPk" height="1" width="1"/&gt;</description><pubDate>Mon, 18 Jul 2011 00:56:21 Z</pubDate><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Paulo Morgado</dc:creator><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1796351</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1796351</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2011/07/18/the-new-msdn-forums-assistant.aspx#comments</comments><feedburner:origLink>http://msmvps.com/blogs/paulomorgado/archive/2011/07/18/the-new-msdn-forums-assistant.aspx</feedburner:origLink></item><item><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1796349</guid><link>http://feeds.paulomorgado.net/~r/PauloMorgado/Blogs/EN/~3/tuxH9hjRK8o/visual-studio-uservoice-site.aspx</link><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/VisualStudio/default.aspx">VisualStudio</category><title>Visual Studio UserVoice Site</title><description>&lt;p align="justify"&gt;A &lt;a title="Visual Studio" href="http://www.microsoft.com/visualstudio/" target="_blank"&gt;Visual Studio&lt;/a&gt;&amp;#160;&lt;a title="UserVoice - Customer Feedback and Helpdesk Solutions" href="http://uservoice.com/" target="_blank"&gt;UserVoice&lt;/a&gt; site has been set up to collect community feedback:&lt;img src="http://c.statcounter.com/6351077/0/9a1b981a/1/" alt="StatCounter"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;&lt;a title="http://visualstudio.uservoice.com/" href="http://visualstudio.uservoice.com/"&gt;http://visualstudio.uservoice.com/&lt;/a&gt;&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;For filing bugs, the Visual Studio Connect site is still the place to go:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;&lt;a title="visualstudio" href="http://connect.microsoft.com/visualstudio"&gt;http://connect.microsoft.com/visualstudio&lt;/a&gt;&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1796349" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/QI6vmPICR0bUtqOUSX5mg9kFpO8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QI6vmPICR0bUtqOUSX5mg9kFpO8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/QI6vmPICR0bUtqOUSX5mg9kFpO8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QI6vmPICR0bUtqOUSX5mg9kFpO8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=tuxH9hjRK8o:HciuDexmQ9k:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=tuxH9hjRK8o:HciuDexmQ9k:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=tuxH9hjRK8o:HciuDexmQ9k:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=tuxH9hjRK8o:HciuDexmQ9k:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=tuxH9hjRK8o:HciuDexmQ9k:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=tuxH9hjRK8o:HciuDexmQ9k:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=tuxH9hjRK8o:HciuDexmQ9k:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=tuxH9hjRK8o:HciuDexmQ9k:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=tuxH9hjRK8o:HciuDexmQ9k:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=tuxH9hjRK8o:HciuDexmQ9k:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=tuxH9hjRK8o:HciuDexmQ9k:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=tuxH9hjRK8o:HciuDexmQ9k:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=tuxH9hjRK8o:HciuDexmQ9k:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=tuxH9hjRK8o:HciuDexmQ9k:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=tuxH9hjRK8o:HciuDexmQ9k:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=tuxH9hjRK8o:HciuDexmQ9k:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=tuxH9hjRK8o:HciuDexmQ9k:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=tuxH9hjRK8o:HciuDexmQ9k:3yuytNF0dJw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=tuxH9hjRK8o:HciuDexmQ9k:3yuytNF0dJw" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PauloMorgado/Blogs/EN/~4/tuxH9hjRK8o" height="1" width="1"/&gt;</description><pubDate>Mon, 18 Jul 2011 00:20:37 Z</pubDate><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Paulo Morgado</dc:creator><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1796349</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1796349</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2011/07/18/visual-studio-uservoice-site.aspx#comments</comments><feedburner:origLink>http://msmvps.com/blogs/paulomorgado/archive/2011/07/18/visual-studio-uservoice-site.aspx</feedburner:origLink></item><item><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1796345</guid><link>http://feeds.paulomorgado.net/~r/PauloMorgado/Blogs/EN/~3/qF6OMajA7ho/guid-generator-my-first-windows-phone-application-is-available-on-the-marketplace.aspx</link><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/WindowsPhone/default.aspx">WindowsPhone</category><title>GUID Generator: My first Windows Phone application is available on the marketplace</title><description>&lt;p align="justify"&gt;In order to complete the registration as a &lt;a title="Windows Phone" href="http://www.microsoft.com/windowsphone/" target="_blank"&gt;Windows Phone&lt;/a&gt; developer an application needs to be submitted.&lt;img src="http://c.statcounter.com/6351077/0/9a1b981a/1/" alt="StatCounter"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Following the advise of &lt;a title="Caio Proiete" href="http://caioproiete.com/" target="_blank"&gt;Caio&lt;/a&gt;, I wrote a &lt;strong&gt;GUID Generator&lt;/strong&gt;. It has now been published and you can get it &lt;a title="Paulo Morgado&amp;#39;s GUID Generator application for Windows Phone" href="http://windowsphone.com/s?appid=a8551bc8-a6ad-e011-a53c-78e7d1fa76f8" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p align="justify"&gt;Have you ever felt the need for a freshly generated GUID?&lt;/p&gt;    &lt;p align="justify"&gt;With this application you can have a freshly generated GUID whenever you want.&lt;/p&gt;    &lt;p align="justify"&gt;A GUID (Globally Unique Identifier) is a 128-bit integer (16 bytes) that can be used across all computers and networks wherever a unique identifier is required. Such an identifier has a very low probability of being duplicated. Do you want o try?&lt;/p&gt; &lt;/blockquote&gt;  &lt;p align="justify"&gt;Talking with friends with &lt;strong&gt;iPhone&lt;/strong&gt; and &lt;strong&gt;Android&lt;/strong&gt; phones I became aware that there is no such application for those platforms. How can they live without one?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1796345" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/PHCxbhFG-Iaq5AbYZ4wWObtwhnw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/PHCxbhFG-Iaq5AbYZ4wWObtwhnw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/PHCxbhFG-Iaq5AbYZ4wWObtwhnw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/PHCxbhFG-Iaq5AbYZ4wWObtwhnw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=qF6OMajA7ho:yN-LdxXXgZI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=qF6OMajA7ho:yN-LdxXXgZI:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=qF6OMajA7ho:yN-LdxXXgZI:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=qF6OMajA7ho:yN-LdxXXgZI:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=qF6OMajA7ho:yN-LdxXXgZI:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=qF6OMajA7ho:yN-LdxXXgZI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=qF6OMajA7ho:yN-LdxXXgZI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=qF6OMajA7ho:yN-LdxXXgZI:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=qF6OMajA7ho:yN-LdxXXgZI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=qF6OMajA7ho:yN-LdxXXgZI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=qF6OMajA7ho:yN-LdxXXgZI:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=qF6OMajA7ho:yN-LdxXXgZI:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=qF6OMajA7ho:yN-LdxXXgZI:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=qF6OMajA7ho:yN-LdxXXgZI:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=qF6OMajA7ho:yN-LdxXXgZI:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=qF6OMajA7ho:yN-LdxXXgZI:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=qF6OMajA7ho:yN-LdxXXgZI:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=qF6OMajA7ho:yN-LdxXXgZI:3yuytNF0dJw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=qF6OMajA7ho:yN-LdxXXgZI:3yuytNF0dJw" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PauloMorgado/Blogs/EN/~4/qF6OMajA7ho" height="1" width="1"/&gt;</description><pubDate>Sun, 17 Jul 2011 22:48:22 Z</pubDate><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Paulo Morgado</dc:creator><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1796345</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1796345</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2011/07/17/guid-generator-my-first-windows-phone-application-is-available-on-the-marketplace.aspx#comments</comments><feedburner:origLink>http://msmvps.com/blogs/paulomorgado/archive/2011/07/17/guid-generator-my-first-windows-phone-application-is-available-on-the-marketplace.aspx</feedburner:origLink></item><item><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1791940</guid><link>http://feeds.paulomorgado.net/~r/PauloMorgado/Blogs/EN/~3/a3pWqTjMYzI/extension-methods-and-type-inference-in-action.aspx</link><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/WinForms/default.aspx">WinForms</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET3.5/default.aspx">.NET3.5</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET4.0/default.aspx">.NET4.0</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/C_2300_4.0/default.aspx">C#4.0</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/C_2300_3.0/default.aspx">C#3.0</category><title>Extension Methods And Type Inference In Action</title><description>&lt;p align="justify"&gt;I make extensive use of &lt;a title="Extension Methods (C# Programming Guide)" href="http://msdn.microsoft.com/library/bb383977.aspx" target="_blank"&gt;extension methods&lt;/a&gt;, either to make classes small and focused or to improve readability.&lt;img src="http://c.statcounter.com/6351077/0/9a1b981a/1/" alt="StatCounter"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;While porting a &lt;a title="Microsoft .NET Framework" href="http://www.microsoft.com/net/" target="_blank"&gt;&lt;strong&gt;.NET&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; 1.1&lt;/strong&gt; &lt;strong&gt;WinForms&lt;/strong&gt; application to &lt;a title="Microsoft Visual C#" href="http://csharp.net/" target="_blank"&gt;C#&lt;/a&gt; 3.0, I found lots of code like this:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;delegate int &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Int32DelegateStringBoolean&lt;/span&gt;(&lt;span style="color:blue;"&gt;string &lt;/span&gt;text, &lt;span style="color:blue;"&gt;bool &lt;/span&gt;flag);

&lt;span style="color:blue;"&gt;void &lt;/span&gt;DoStuff()
{
    &lt;span style="color:green;"&gt;// ...

    &lt;span style="color:blue;"&gt;var &lt;/span&gt;&lt;font color="#000000"&gt;x = (&lt;/font&gt;&lt;span style="color:blue;"&gt;int&lt;/span&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;this&lt;/span&gt;.Invoke(&lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Int32DelegateStringBoolean&lt;/span&gt;(GetStuff), &lt;span style="color:blue;"&gt;new object&lt;/span&gt;[] { &lt;span style="color:#a31515;"&gt;&amp;quot;some text&amp;quot;&lt;/span&gt;, &lt;span style="color:blue;"&gt;true &lt;/span&gt;});

    &lt;span style="color:green;"&gt;// ...
&lt;/span&gt;}

&lt;span style="color:blue;"&gt;int &lt;/span&gt;GetStuff(&lt;span style="color:blue;"&gt;string &lt;/span&gt;text, &lt;span style="color:blue;"&gt;bool &lt;/span&gt;flag)
{
    &lt;span style="color:green;"&gt;// ...
&lt;/span&gt;}&lt;/pre&gt;

&lt;p align="justify"&gt;&lt;strong&gt;.NET 2.0&lt;/strong&gt; introduced a nicer API and it became possible to write the code calling &lt;strong&gt;Invoke&lt;/strong&gt; like this:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;var &lt;/span&gt;x = (&lt;span style="color:blue;"&gt;int&lt;/span&gt;)&lt;span style="color:blue;"&gt;this&lt;/span&gt;.Invoke(&lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Int32DelegateStringBoolean&lt;/span&gt;(GetStuff), &lt;span style="color:#a31515;"&gt;&amp;quot;some text&amp;quot;&lt;/span&gt;, &lt;span style="color:blue;"&gt;true&lt;/span&gt;);&lt;/pre&gt;

&lt;p align="justify"&gt;But it’s still not strongly typed enough to my taste and the compiler can’t verify if any mistake was made. This will still be valid code at compile time that will break at run time:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;var &lt;/span&gt;x = (&lt;span style="color:blue;"&gt;long&lt;/span&gt;)&lt;span style="color:blue;"&gt;this&lt;/span&gt;.Invoke(&lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Int32DelegateStringBoolean&lt;/span&gt;(GetStuff), &lt;span style="color:#a31515;"&gt;&amp;quot;some text&amp;quot;&lt;/span&gt;, 10M, 5);&lt;/pre&gt;

&lt;p align="justify"&gt;To make the code safer and more readable, I decided to create extension methods to extend the &lt;a title="Control Class" href="http://msdn.microsoft.com/library/system.windows.forms.control.aspx" target="_blank"&gt;Control&lt;/a&gt; class and provide strongly type &lt;strong&gt;Invoke&lt;/strong&gt; methods.&lt;/p&gt;

&lt;p align="justify"&gt;Instead of defining custom delegates for each need, I used the &lt;strong&gt;Action&lt;/strong&gt; and &lt;strong&gt;Func&lt;/strong&gt; delegates exiting in the framework and wrote extension methods like this:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;public static &lt;/span&gt;TResult InvokeFunc&amp;lt;T1, T2, TResult&amp;gt;(&lt;span style="color:blue;"&gt;this &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Control &lt;/span&gt;control, &lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;T1, T2, TResult&amp;gt; func, T1 param1, T2 param2)
{
    &lt;span style="color:blue;"&gt;return &lt;/span&gt;(TResult)(control.Invoke(func, param1, param2));
}&lt;/pre&gt;

&lt;p align="justify"&gt;Now I can replace the call to &lt;strong&gt;Invoke&lt;/strong&gt; with this call:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;var &lt;/span&gt;x = &lt;span style="color:blue;"&gt;this&lt;/span&gt;.InvokeFunc&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;, &lt;span style="color:blue;"&gt;bool&lt;/span&gt;, &lt;span style="color:blue;"&gt;int&lt;/span&gt;&amp;gt;(&lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;, &lt;span style="color:blue;"&gt;bool&lt;/span&gt;, &lt;span style="color:blue;"&gt;int&lt;/span&gt;&amp;gt;(GetStuff), &lt;span style="color:#a31515;"&gt;&amp;quot;some text&amp;quot;&lt;/span&gt;, &lt;span style="color:blue;"&gt;true&lt;/span&gt;);&lt;/pre&gt;

&lt;p align="justify"&gt;And the compiler is now able to match the type of the delegate, the parameters and the return value.&lt;/p&gt;

&lt;p align="justify"&gt;Starting with the &lt;strong&gt;C# 2.0&lt;/strong&gt; compiler, there is no need to write the delegate instantiation if the compiler can infer the type of the delegate, which makes the code even simpler:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;var &lt;/span&gt;x = &lt;span style="color:blue;"&gt;this&lt;/span&gt;.InvokeFunc&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;, &lt;span style="color:blue;"&gt;bool&lt;/span&gt;, &lt;span style="color:blue;"&gt;int&lt;/span&gt;&amp;gt;(GetStuff, &lt;span style="color:#a31515;"&gt;&amp;quot;some text&amp;quot;&lt;/span&gt;, &lt;span style="color:blue;"&gt;true&lt;/span&gt;);&lt;/pre&gt;

&lt;p align="justify"&gt;The &lt;strong&gt;C#&lt;/strong&gt; compiler is even capable of inferring the type parameters of the &lt;strong&gt;InvokeFunc&lt;/strong&gt; method making the code even smaller and more readable:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;var &lt;/span&gt;x = &lt;span style="color:blue;"&gt;this&lt;/span&gt;.InvokeFunc(GetStuff, &lt;span style="color:#a31515;"&gt;&amp;quot;some text&amp;quot;&lt;/span&gt;, &lt;span style="color:blue;"&gt;true&lt;/span&gt;);&lt;/pre&gt;

&lt;p align="justify"&gt;A lot better than what we started with, isn’t it?&lt;/p&gt;

&lt;p align="justify"&gt;So far, I’ve implemented these:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:gray;"&gt;/// &amp;lt;summary&amp;gt;
/// &lt;/span&gt;&lt;span style="color:green;"&gt;Provides extended functionality to &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;see cref=&amp;quot;System.Windows.Forms.Control&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;.
&lt;/span&gt;&lt;span style="color:gray;"&gt;/// &amp;lt;/summary&amp;gt;
&lt;/span&gt;&lt;span style="color:blue;"&gt;public static class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;ControlExtensions
&lt;/span&gt;{
    &lt;span style="color:gray;"&gt;/// &amp;lt;summary&amp;gt;
    /// &lt;/span&gt;&lt;span style="color:green;"&gt;Executes the specified function (&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;paramref name=&amp;quot;func&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;) on the thread that owns the control&amp;#39;s underlying window handle.
    &lt;/span&gt;&lt;span style="color:gray;"&gt;/// &amp;lt;/summary&amp;gt;
    /// &amp;lt;typeparam name=&amp;quot;TResult&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The type of the result.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/typeparam&amp;gt;
    /// &amp;lt;param name=&amp;quot;control&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The control to invoke the function on.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;func&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The function to invoke.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;A &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;typeparamref name=&amp;quot;TResult&amp;quot;/&amp;gt; &lt;/span&gt;&lt;span style="color:green;"&gt;that contains the return value from the function (&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;paramref name=&amp;quot;func&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;) being invoked.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/returns&amp;gt;
    &lt;/span&gt;&lt;span style="color:blue;"&gt;public static &lt;/span&gt;TResult InvokeFunc&amp;lt;TResult&amp;gt;(&lt;span style="color:blue;"&gt;this &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Control &lt;/span&gt;control, &lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;TResult&amp;gt; func)
    {
        &lt;span style="color:blue;"&gt;return &lt;/span&gt;(TResult)(control.Invoke(func));
    }

    &lt;span style="color:gray;"&gt;/// &amp;lt;summary&amp;gt;
    /// &lt;/span&gt;&lt;span style="color:green;"&gt;Executes the specified function (&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;paramref name=&amp;quot;func&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;) on the thread that owns the control&amp;#39;s underlying window handle.
    &lt;/span&gt;&lt;span style="color:gray;"&gt;/// &amp;lt;/summary&amp;gt;
    /// &amp;lt;typeparam name=&amp;quot;T1&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The type of the parameter of the function.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/typeparam&amp;gt;
    /// &amp;lt;typeparam name=&amp;quot;TResult&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The type of the result.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/typeparam&amp;gt;
    /// &amp;lt;param name=&amp;quot;control&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The control to invoke the function on.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;func&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The function to invoke.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;param1&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The parameter of the action.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;A &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;typeparamref name=&amp;quot;TResult&amp;quot;/&amp;gt; &lt;/span&gt;&lt;span style="color:green;"&gt;that contains the return value from the function (&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;paramref name=&amp;quot;func&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;) being invoked.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/returns&amp;gt;
    &lt;/span&gt;&lt;span style="color:blue;"&gt;public static &lt;/span&gt;TResult InvokeFunc&amp;lt;T1, TResult&amp;gt;(&lt;span style="color:blue;"&gt;this &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Control &lt;/span&gt;control, &lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;T1, TResult&amp;gt; func, T1 param1)
    {
        &lt;span style="color:blue;"&gt;return &lt;/span&gt;(TResult)(control.Invoke(func, param1));
    }

    &lt;span style="color:gray;"&gt;/// &amp;lt;summary&amp;gt;
    /// &lt;/span&gt;&lt;span style="color:green;"&gt;Executes the specified function (&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;paramref name=&amp;quot;func&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;) on the thread that owns the control&amp;#39;s underlying window handle.
    &lt;/span&gt;&lt;span style="color:gray;"&gt;/// &amp;lt;/summary&amp;gt;
    /// &amp;lt;typeparam name=&amp;quot;T1&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The type of the first parameter of the function.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/typeparam&amp;gt;
    /// &amp;lt;typeparam name=&amp;quot;T2&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The type of the second parameter of the function.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/typeparam&amp;gt;
    /// &amp;lt;typeparam name=&amp;quot;TResult&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The type of the result.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/typeparam&amp;gt;
    /// &amp;lt;param name=&amp;quot;control&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The control to invoke the function on.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;func&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The function to invoke.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;param1&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The first parameter of the function.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;param2&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The second parameter of the function.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;A &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;typeparamref name=&amp;quot;TResult&amp;quot;/&amp;gt; &lt;/span&gt;&lt;span style="color:green;"&gt;that contains the return value from the function (&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;paramref name=&amp;quot;func&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;) being invoked.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/returns&amp;gt;
    &lt;/span&gt;&lt;span style="color:blue;"&gt;public static &lt;/span&gt;TResult InvokeFunc&amp;lt;T1, T2, TResult&amp;gt;(&lt;span style="color:blue;"&gt;this &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Control &lt;/span&gt;control, &lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;T1, T2, TResult&amp;gt; func, T1 param1, T2 param2)
    {
        &lt;span style="color:blue;"&gt;return &lt;/span&gt;(TResult)(control.Invoke(func, param1, param2));
    }

    &lt;span style="color:gray;"&gt;/// &amp;lt;summary&amp;gt;
    /// &lt;/span&gt;&lt;span style="color:green;"&gt;Executes the specified function (&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;paramref name=&amp;quot;func&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;) on the thread that owns the control&amp;#39;s underlying window handle.
    &lt;/span&gt;&lt;span style="color:gray;"&gt;/// &amp;lt;/summary&amp;gt;
    /// &amp;lt;typeparam name=&amp;quot;T1&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The type of the first parameter of the function.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/typeparam&amp;gt;
    /// &amp;lt;typeparam name=&amp;quot;T2&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The type of the second parameter of the function.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/typeparam&amp;gt;
    /// &amp;lt;typeparam name=&amp;quot;T3&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The type of the third parameter of the function.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/typeparam&amp;gt;
    /// &amp;lt;typeparam name=&amp;quot;TResult&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The type of the result.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/typeparam&amp;gt;
    /// &amp;lt;param name=&amp;quot;control&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The control to invoke the function on.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;func&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The function to invoke.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;param1&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The first parameter of the function.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;param2&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The second parameter of the function.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;param3&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The third parameter of the function.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;A &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;typeparamref name=&amp;quot;TResult&amp;quot;/&amp;gt; &lt;/span&gt;&lt;span style="color:green;"&gt;that contains the return value from the function (&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;paramref name=&amp;quot;func&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;) being invoked.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/returns&amp;gt;
    &lt;/span&gt;&lt;span style="color:blue;"&gt;public static &lt;/span&gt;TResult InvokeFunc&amp;lt;T1, T2, T3, TResult&amp;gt;(&lt;span style="color:blue;"&gt;this &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Control &lt;/span&gt;control, &lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;T1, T2, T3, TResult&amp;gt; func, T1 param1, T2 param2, T3 param3)
    {
        &lt;span style="color:blue;"&gt;return &lt;/span&gt;(TResult)(control.Invoke(func, param1, param2, param3));
    }

    &lt;span style="color:gray;"&gt;/// &amp;lt;summary&amp;gt;
    /// &lt;/span&gt;&lt;span style="color:green;"&gt;Executes the specified function (&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;paramref name=&amp;quot;func&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;) on the thread that owns the control&amp;#39;s underlying window handle.
    &lt;/span&gt;&lt;span style="color:gray;"&gt;/// &amp;lt;/summary&amp;gt;
    /// &amp;lt;typeparam name=&amp;quot;T1&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The type of the first parameter of the function.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/typeparam&amp;gt;
    /// &amp;lt;typeparam name=&amp;quot;T2&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The type of the second parameter of the function.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/typeparam&amp;gt;
    /// &amp;lt;typeparam name=&amp;quot;T3&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The type of the third parameter of the function.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/typeparam&amp;gt;
    /// &amp;lt;typeparam name=&amp;quot;T4&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The type of the forth parameter of the function.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/typeparam&amp;gt;
    /// &amp;lt;typeparam name=&amp;quot;TResult&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The type of the result.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/typeparam&amp;gt;
    /// &amp;lt;param name=&amp;quot;control&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The control to invoke the function on.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;func&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The function to invoke.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;param1&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The first parameter of the function.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;param2&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The second parameter of the function.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;param3&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The third parameter of the function.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;param4&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The forth parameter of the function.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;A &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;typeparamref name=&amp;quot;TResult&amp;quot;/&amp;gt; &lt;/span&gt;&lt;span style="color:green;"&gt;that contains the return value from the function (&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;paramref name=&amp;quot;func&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;) being invoked.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/returns&amp;gt;
    &lt;/span&gt;&lt;span style="color:blue;"&gt;public static &lt;/span&gt;TResult InvokeFunc&amp;lt;T1, T2, T3, T4, TResult&amp;gt;(&lt;span style="color:blue;"&gt;this &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Control &lt;/span&gt;control, &lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;T1, T2, T3, T4, TResult&amp;gt; func, T1 param1, T2 param2, T3 param3, T4 param4)
    {
        &lt;span style="color:blue;"&gt;return &lt;/span&gt;(TResult)(control.Invoke(func, param1, param2, param3, param4));
    }

    &lt;span style="color:gray;"&gt;/// &amp;lt;summary&amp;gt;
    /// &lt;/span&gt;&lt;span style="color:green;"&gt;Executes the specified action (&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;paramref name=&amp;quot;action&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;) on the thread that owns the control&amp;#39;s underlying window handle.
    &lt;/span&gt;&lt;span style="color:gray;"&gt;/// &amp;lt;/summary&amp;gt;
    /// &amp;lt;param name=&amp;quot;control&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The control to invoke the action on.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;action&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The action to invoke.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    &lt;/span&gt;&lt;span style="color:blue;"&gt;public static void &lt;/span&gt;InvokeAction(&lt;span style="color:blue;"&gt;this &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Control &lt;/span&gt;control, &lt;span style="color:#2b91af;"&gt;Action &lt;/span&gt;action)
    {
        control.Invoke(action);
    }

    &lt;span style="color:gray;"&gt;/// &amp;lt;summary&amp;gt;
    /// &lt;/span&gt;&lt;span style="color:green;"&gt;Executes the specified action (&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;paramref name=&amp;quot;action&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;) on the thread that owns the control&amp;#39;s underlying window handle.
    &lt;/span&gt;&lt;span style="color:gray;"&gt;/// &amp;lt;/summary&amp;gt;
    /// &amp;lt;typeparam name=&amp;quot;T&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The type of the parameter.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/typeparam&amp;gt;
    /// &amp;lt;param name=&amp;quot;control&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The control to invoke the action on.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;action&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The action to invoke.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;param&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The parameter of the action.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    &lt;/span&gt;&lt;span style="color:blue;"&gt;public static void &lt;/span&gt;InvokeAction&amp;lt;T&amp;gt;(&lt;span style="color:blue;"&gt;this &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Control &lt;/span&gt;control, &lt;span style="color:#2b91af;"&gt;Action&lt;/span&gt;&amp;lt;T&amp;gt; action, T param)
    {
        control.Invoke(action, param);
    }

    &lt;span style="color:gray;"&gt;/// &amp;lt;summary&amp;gt;
    /// &lt;/span&gt;&lt;span style="color:green;"&gt;Executes the specified action (&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;paramref name=&amp;quot;action&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;) on the thread that owns the control&amp;#39;s underlying window handle.
    &lt;/span&gt;&lt;span style="color:gray;"&gt;/// &amp;lt;/summary&amp;gt;
    /// &amp;lt;typeparam name=&amp;quot;T1&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The type of the first parameter of the action.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/typeparam&amp;gt;
    /// &amp;lt;typeparam name=&amp;quot;T2&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The type of the second parameter of the action.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/typeparam&amp;gt;
    /// &amp;lt;param name=&amp;quot;control&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The control to invoke the action on.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;action&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The action to invoke.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;param1&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The first parameter of the action.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;param2&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The second parameter of the action.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    &lt;/span&gt;&lt;span style="color:blue;"&gt;public static void &lt;/span&gt;InvokeAction&amp;lt;T1, T2&amp;gt;(&lt;span style="color:blue;"&gt;this &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Control &lt;/span&gt;control, &lt;span style="color:#2b91af;"&gt;Action&lt;/span&gt;&amp;lt;T1, T2&amp;gt; action, T1 param1, T2 param2)
    {
        control.Invoke(action, param1, param2);
    }

    &lt;span style="color:gray;"&gt;/// &amp;lt;summary&amp;gt;
    /// &lt;/span&gt;&lt;span style="color:green;"&gt;Executes the specified action (&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;paramref name=&amp;quot;action&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;) on the thread that owns the control&amp;#39;s underlying window handle.
    &lt;/span&gt;&lt;span style="color:gray;"&gt;/// &amp;lt;/summary&amp;gt;
    /// &amp;lt;typeparam name=&amp;quot;T1&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The type of the first parameter of the action.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/typeparam&amp;gt;
    /// &amp;lt;typeparam name=&amp;quot;T2&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The type of the second parameter of the action.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/typeparam&amp;gt;
    /// &amp;lt;typeparam name=&amp;quot;T3&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The type of the third parameter of the action.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/typeparam&amp;gt;
    /// &amp;lt;param name=&amp;quot;control&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The control to invoke the action on.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;action&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The action to invoke.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;param1&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The first parameter of the action.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;param2&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The second parameter of the action.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;param3&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The third parameter of the action.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    &lt;/span&gt;&lt;span style="color:blue;"&gt;public static void &lt;/span&gt;InvokeAction&amp;lt;T1, T2, T3&amp;gt;(&lt;span style="color:blue;"&gt;this &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Control &lt;/span&gt;control, &lt;span style="color:#2b91af;"&gt;Action&lt;/span&gt;&amp;lt;T1, T2, T3&amp;gt; action, T1 param1, T2 param2, T3 param3)
    {
        control.Invoke(action, param1, param2, param3);
    }

    &lt;span style="color:gray;"&gt;/// &amp;lt;summary&amp;gt;
    /// &lt;/span&gt;&lt;span style="color:green;"&gt;Executes the specified action (&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;paramref name=&amp;quot;action&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;) on the thread that owns the control&amp;#39;s underlying window handle.
    &lt;/span&gt;&lt;span style="color:gray;"&gt;/// &amp;lt;/summary&amp;gt;
    /// &amp;lt;typeparam name=&amp;quot;T1&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The type of the first parameter of the action.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/typeparam&amp;gt;
    /// &amp;lt;typeparam name=&amp;quot;T2&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The type of the second parameter of the action.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/typeparam&amp;gt;
    /// &amp;lt;typeparam name=&amp;quot;T3&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The type of the third parameter of the action.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/typeparam&amp;gt;
    /// &amp;lt;typeparam name=&amp;quot;T4&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The type of the forth parameter of the action.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/typeparam&amp;gt;
    /// &amp;lt;param name=&amp;quot;control&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The control to invoke the action on.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;action&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The action to invoke.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;param1&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The first parameter of the action.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;param2&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The second parameter of the action.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;param3&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The third parameter of the action.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;param4&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The forth parameter of the action.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    &lt;/span&gt;&lt;span style="color:blue;"&gt;public static void &lt;/span&gt;InvokeAction&amp;lt;T1, T2, T3, T4&amp;gt;(&lt;span style="color:blue;"&gt;this &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Control &lt;/span&gt;control, &lt;span style="color:#2b91af;"&gt;Action&lt;/span&gt;&amp;lt;T1, T2, T3, T4&amp;gt; action, T1 param1, T2 param2, T3 param3, T4 param4)
    {
        control.Invoke(action, param1, param2, param3, param4);
    }
    &lt;span style="color:gray;"&gt;/// &amp;lt;summary&amp;gt;
    /// &lt;/span&gt;&lt;span style="color:green;"&gt;Executes the specified function (&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;paramref name=&amp;quot;func&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;) on the thread that owns the control&amp;#39;s underlying window handle.
    &lt;/span&gt;&lt;span style="color:gray;"&gt;/// &amp;lt;/summary&amp;gt;
    /// &amp;lt;typeparam name=&amp;quot;TResult&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The type of the result.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/typeparam&amp;gt;
    /// &amp;lt;param name=&amp;quot;control&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The control to BeginInvoke the function on.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;func&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The function to BeginInvoke.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;An System.IAsyncResult that represents the result of the operation.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/returns&amp;gt;
    &lt;/span&gt;&lt;span style="color:blue;"&gt;public static &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IAsyncResult &lt;/span&gt;BeginInvokeFunc&amp;lt;TResult&amp;gt;(&lt;span style="color:blue;"&gt;this &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Control &lt;/span&gt;control, &lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;TResult&amp;gt; func)
    {
        &lt;span style="color:blue;"&gt;return &lt;/span&gt;control.BeginInvoke(func);
    }

    &lt;span style="color:gray;"&gt;/// &amp;lt;summary&amp;gt;
    /// &lt;/span&gt;&lt;span style="color:green;"&gt;Executes the specified function (&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;paramref name=&amp;quot;func&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;) on the thread that owns the control&amp;#39;s underlying window handle.
    &lt;/span&gt;&lt;span style="color:gray;"&gt;/// &amp;lt;/summary&amp;gt;
    /// &amp;lt;typeparam name=&amp;quot;T1&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The type of the parameter of the function.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/typeparam&amp;gt;
    /// &amp;lt;typeparam name=&amp;quot;TResult&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The type of the result.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/typeparam&amp;gt;
    /// &amp;lt;param name=&amp;quot;control&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The control to BeginInvoke the function on.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;func&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The function to BeginInvoke.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;param1&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The parameter of the action.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;An System.IAsyncResult that represents the result of the operation.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/returns&amp;gt;
    &lt;/span&gt;&lt;span style="color:blue;"&gt;public static &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IAsyncResult &lt;/span&gt;BeginInvokeFunc&amp;lt;T1, TResult&amp;gt;(&lt;span style="color:blue;"&gt;this &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Control &lt;/span&gt;control, &lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;T1, TResult&amp;gt; func, T1 param1)
    {
        &lt;span style="color:blue;"&gt;return &lt;/span&gt;control.BeginInvoke(func, param1);
    }

    &lt;span style="color:gray;"&gt;/// &amp;lt;summary&amp;gt;
    /// &lt;/span&gt;&lt;span style="color:green;"&gt;Executes the specified function (&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;paramref name=&amp;quot;func&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;) on the thread that owns the control&amp;#39;s underlying window handle.
    &lt;/span&gt;&lt;span style="color:gray;"&gt;/// &amp;lt;/summary&amp;gt;
    /// &amp;lt;typeparam name=&amp;quot;T1&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The type of the first parameter of the function.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/typeparam&amp;gt;
    /// &amp;lt;typeparam name=&amp;quot;T2&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The type of the second parameter of the function.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/typeparam&amp;gt;
    /// &amp;lt;typeparam name=&amp;quot;TResult&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The type of the result.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/typeparam&amp;gt;
    /// &amp;lt;param name=&amp;quot;control&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The control to BeginInvoke the function on.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;func&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The function to BeginInvoke.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;param1&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The first parameter of the function.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;param2&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The second parameter of the function.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;An System.IAsyncResult that represents the result of the operation.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/returns&amp;gt;
    &lt;/span&gt;&lt;span style="color:blue;"&gt;public static &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IAsyncResult &lt;/span&gt;BeginInvokeFunc&amp;lt;T1, T2, TResult&amp;gt;(&lt;span style="color:blue;"&gt;this &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Control &lt;/span&gt;control, &lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;T1, T2, TResult&amp;gt; func, T1 param1, T2 param2)
    {
        &lt;span style="color:blue;"&gt;return &lt;/span&gt;control.BeginInvoke(func, param1, param2);
    }

    &lt;span style="color:gray;"&gt;/// &amp;lt;summary&amp;gt;
    /// &lt;/span&gt;&lt;span style="color:green;"&gt;Executes the specified function (&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;paramref name=&amp;quot;func&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;) on the thread that owns the control&amp;#39;s underlying window handle.
    &lt;/span&gt;&lt;span style="color:gray;"&gt;/// &amp;lt;/summary&amp;gt;
    /// &amp;lt;typeparam name=&amp;quot;T1&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The type of the first parameter of the function.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/typeparam&amp;gt;
    /// &amp;lt;typeparam name=&amp;quot;T2&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The type of the second parameter of the function.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/typeparam&amp;gt;
    /// &amp;lt;typeparam name=&amp;quot;T3&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The type of the third parameter of the function.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/typeparam&amp;gt;
    /// &amp;lt;typeparam name=&amp;quot;TResult&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The type of the result.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/typeparam&amp;gt;
    /// &amp;lt;param name=&amp;quot;control&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The control to BeginInvoke the function on.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;func&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The function to BeginInvoke.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;param1&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The first parameter of the function.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;param2&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The second parameter of the function.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;param3&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The third parameter of the function.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;An System.IAsyncResult that represents the result of the operation.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/returns&amp;gt;
    &lt;/span&gt;&lt;span style="color:blue;"&gt;public static &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IAsyncResult &lt;/span&gt;BeginInvokeFunc&amp;lt;T1, T2, T3, TResult&amp;gt;(&lt;span style="color:blue;"&gt;this &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Control &lt;/span&gt;control, &lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;T1, T2, T3, TResult&amp;gt; func, T1 param1, T2 param2, T3 param3)
    {
        &lt;span style="color:blue;"&gt;return &lt;/span&gt;control.BeginInvoke(func, param1, param2, param3);
    }

    &lt;span style="color:gray;"&gt;/// &amp;lt;summary&amp;gt;
    /// &lt;/span&gt;&lt;span style="color:green;"&gt;Executes the specified function (&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;paramref name=&amp;quot;func&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;) on the thread that owns the control&amp;#39;s underlying window handle.
    &lt;/span&gt;&lt;span style="color:gray;"&gt;/// &amp;lt;/summary&amp;gt;
    /// &amp;lt;typeparam name=&amp;quot;T1&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The type of the first parameter of the function.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/typeparam&amp;gt;
    /// &amp;lt;typeparam name=&amp;quot;T2&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The type of the second parameter of the function.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/typeparam&amp;gt;
    /// &amp;lt;typeparam name=&amp;quot;T3&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The type of the third parameter of the function.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/typeparam&amp;gt;
    /// &amp;lt;typeparam name=&amp;quot;T4&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The type of the forth parameter of the function.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/typeparam&amp;gt;
    /// &amp;lt;typeparam name=&amp;quot;TResult&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The type of the result.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/typeparam&amp;gt;
    /// &amp;lt;param name=&amp;quot;control&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The control to BeginInvoke the function on.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;func&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The function to BeginInvoke.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;param1&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The first parameter of the function.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;param2&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The second parameter of the function.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;param3&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The third parameter of the function.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;param4&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The forth parameter of the function.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;An System.IAsyncResult that represents the result of the operation.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/returns&amp;gt;
    &lt;/span&gt;&lt;span style="color:blue;"&gt;public static &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IAsyncResult &lt;/span&gt;BeginInvokeFunc&amp;lt;T1, T2, T3, T4, TResult&amp;gt;(&lt;span style="color:blue;"&gt;this &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Control &lt;/span&gt;control, &lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;T1, T2, T3, T4, TResult&amp;gt; func, T1 param1, T2 param2, T3 param3, T4 param4)
    {
        &lt;span style="color:blue;"&gt;return &lt;/span&gt;control.BeginInvoke(func, param1, param2, param3, param4);
    }

    &lt;span style="color:gray;"&gt;/// &amp;lt;summary&amp;gt;
    /// &lt;/span&gt;&lt;span style="color:green;"&gt;Executes the specified action (&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;paramref name=&amp;quot;action&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;) on the thread that owns the control&amp;#39;s underlying window handle.
    &lt;/span&gt;&lt;span style="color:gray;"&gt;/// &amp;lt;/summary&amp;gt;
    /// &amp;lt;param name=&amp;quot;control&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The control to BeginInvoke the action on.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;action&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The action to BeginInvoke.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;An System.IAsyncResult that represents the result of the operation.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/returns&amp;gt;
    &lt;/span&gt;&lt;span style="color:blue;"&gt;public static &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IAsyncResult &lt;/span&gt;BeginInvokeAction(&lt;span style="color:blue;"&gt;this &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Control &lt;/span&gt;control, &lt;span style="color:#2b91af;"&gt;Action &lt;/span&gt;action)
    {
        &lt;span style="color:blue;"&gt;return &lt;/span&gt;control.BeginInvoke(action);
    }

    &lt;span style="color:gray;"&gt;/// &amp;lt;summary&amp;gt;
    /// &lt;/span&gt;&lt;span style="color:green;"&gt;Executes the specified action (&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;paramref name=&amp;quot;action&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;) on the thread that owns the control&amp;#39;s underlying window handle.
    &lt;/span&gt;&lt;span style="color:gray;"&gt;/// &amp;lt;/summary&amp;gt;
    /// &amp;lt;typeparam name=&amp;quot;T&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The type of the parameter.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/typeparam&amp;gt;
    /// &amp;lt;param name=&amp;quot;control&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The control to BeginInvoke the action on.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;action&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The action to BeginInvoke.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;param&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The parameter of the action.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;An System.IAsyncResult that represents the result of the operation.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/returns&amp;gt;
    &lt;/span&gt;&lt;span style="color:blue;"&gt;public static &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IAsyncResult &lt;/span&gt;BeginInvokeAction&amp;lt;T&amp;gt;(&lt;span style="color:blue;"&gt;this &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Control &lt;/span&gt;control, &lt;span style="color:#2b91af;"&gt;Action&lt;/span&gt;&amp;lt;T&amp;gt; action, T param)
    {
        &lt;span style="color:blue;"&gt;return &lt;/span&gt;control.BeginInvoke(action, param);
    }

    &lt;span style="color:gray;"&gt;/// &amp;lt;summary&amp;gt;
    /// &lt;/span&gt;&lt;span style="color:green;"&gt;Executes the specified action (&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;paramref name=&amp;quot;action&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;) on the thread that owns the control&amp;#39;s underlying window handle.
    &lt;/span&gt;&lt;span style="color:gray;"&gt;/// &amp;lt;/summary&amp;gt;
    /// &amp;lt;typeparam name=&amp;quot;T1&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The type of the first parameter of the action.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/typeparam&amp;gt;
    /// &amp;lt;typeparam name=&amp;quot;T2&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The type of the second parameter of the action.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/typeparam&amp;gt;
    /// &amp;lt;param name=&amp;quot;control&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The control to BeginInvoke the action on.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;action&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The action to BeginInvoke.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;param1&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The first parameter of the action.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;param2&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The second parameter of the action.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;An System.IAsyncResult that represents the result of the operation.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/returns&amp;gt;
    &lt;/span&gt;&lt;span style="color:blue;"&gt;public static &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IAsyncResult &lt;/span&gt;BeginInvokeAction&amp;lt;T1, T2&amp;gt;(&lt;span style="color:blue;"&gt;this &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Control &lt;/span&gt;control, &lt;span style="color:#2b91af;"&gt;Action&lt;/span&gt;&amp;lt;T1, T2&amp;gt; action, T1 param1, T2 param2)
    {
        &lt;span style="color:blue;"&gt;return &lt;/span&gt;control.BeginInvoke(action, param1, param2);
    }

    &lt;span style="color:gray;"&gt;/// &amp;lt;summary&amp;gt;
    /// &lt;/span&gt;&lt;span style="color:green;"&gt;Executes the specified action (&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;paramref name=&amp;quot;action&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;) on the thread that owns the control&amp;#39;s underlying window handle.
    &lt;/span&gt;&lt;span style="color:gray;"&gt;/// &amp;lt;/summary&amp;gt;
    /// &amp;lt;typeparam name=&amp;quot;T1&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The type of the first parameter of the action.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/typeparam&amp;gt;
    /// &amp;lt;typeparam name=&amp;quot;T2&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The type of the second parameter of the action.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/typeparam&amp;gt;
    /// &amp;lt;typeparam name=&amp;quot;T3&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The type of the third parameter of the action.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/typeparam&amp;gt;
    /// &amp;lt;param name=&amp;quot;control&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The control to BeginInvoke the action on.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;action&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The action to BeginInvoke.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;param1&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The first parameter of the action.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;param2&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The second parameter of the action.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;param3&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The third parameter of the action.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;An System.IAsyncResult that represents the result of the operation.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/returns&amp;gt;
    &lt;/span&gt;&lt;span style="color:blue;"&gt;public static &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IAsyncResult &lt;/span&gt;BeginInvokeAction&amp;lt;T1, T2, T3&amp;gt;(&lt;span style="color:blue;"&gt;this &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Control &lt;/span&gt;control, &lt;span style="color:#2b91af;"&gt;Action&lt;/span&gt;&amp;lt;T1, T2, T3&amp;gt; action, T1 param1, T2 param2, T3 param3)
    {
        &lt;span style="color:blue;"&gt;return &lt;/span&gt;control.BeginInvoke(action, param1, param2, param3);
    }

    &lt;span style="color:gray;"&gt;/// &amp;lt;summary&amp;gt;
    /// &lt;/span&gt;&lt;span style="color:green;"&gt;Executes the specified action (&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;paramref name=&amp;quot;action&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;) on the thread that owns the control&amp;#39;s underlying window handle.
    &lt;/span&gt;&lt;span style="color:gray;"&gt;/// &amp;lt;/summary&amp;gt;
    /// &amp;lt;typeparam name=&amp;quot;T1&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The type of the first parameter of the action.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/typeparam&amp;gt;
    /// &amp;lt;typeparam name=&amp;quot;T2&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The type of the second parameter of the action.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/typeparam&amp;gt;
    /// &amp;lt;typeparam name=&amp;quot;T3&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The type of the third parameter of the action.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/typeparam&amp;gt;
    /// &amp;lt;typeparam name=&amp;quot;T4&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The type of the forth parameter of the action.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/typeparam&amp;gt;
    /// &amp;lt;param name=&amp;quot;control&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The control to BeginInvoke the action on.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;action&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The action to BeginInvoke.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;param1&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The first parameter of the action.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;param2&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The second parameter of the action.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;param3&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The third parameter of the action.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;param4&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The forth parameter of the action.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;An System.IAsyncResult that represents the result of the operation.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/returns&amp;gt;
    &lt;/span&gt;&lt;span style="color:blue;"&gt;public static &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IAsyncResult &lt;/span&gt;BeginInvokeAction&amp;lt;T1, T2, T3, T4&amp;gt;(&lt;span style="color:blue;"&gt;this &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Control &lt;/span&gt;control, &lt;span style="color:#2b91af;"&gt;Action&lt;/span&gt;&amp;lt;T1, T2, T3, T4&amp;gt; action, T1 param1, T2 param2, T3 param3, T4 param4)
    {
        &lt;span style="color:blue;"&gt;return &lt;/span&gt;control.BeginInvoke(action, param1, param2, param3, param4);
    }
}&lt;/pre&gt;

&lt;p align="justify"&gt;Use them if you need to.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1791940" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/D8F_0gt3C4qmmraGRYjki3Q2q6s/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/D8F_0gt3C4qmmraGRYjki3Q2q6s/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/D8F_0gt3C4qmmraGRYjki3Q2q6s/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/D8F_0gt3C4qmmraGRYjki3Q2q6s/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=a3pWqTjMYzI:oxv-C7-xKc0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=a3pWqTjMYzI:oxv-C7-xKc0:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=a3pWqTjMYzI:oxv-C7-xKc0:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=a3pWqTjMYzI:oxv-C7-xKc0:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=a3pWqTjMYzI:oxv-C7-xKc0:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=a3pWqTjMYzI:oxv-C7-xKc0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=a3pWqTjMYzI:oxv-C7-xKc0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=a3pWqTjMYzI:oxv-C7-xKc0:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=a3pWqTjMYzI:oxv-C7-xKc0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=a3pWqTjMYzI:oxv-C7-xKc0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=a3pWqTjMYzI:oxv-C7-xKc0:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=a3pWqTjMYzI:oxv-C7-xKc0:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=a3pWqTjMYzI:oxv-C7-xKc0:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=a3pWqTjMYzI:oxv-C7-xKc0:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=a3pWqTjMYzI:oxv-C7-xKc0:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=a3pWqTjMYzI:oxv-C7-xKc0:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=a3pWqTjMYzI:oxv-C7-xKc0:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=a3pWqTjMYzI:oxv-C7-xKc0:3yuytNF0dJw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=a3pWqTjMYzI:oxv-C7-xKc0:3yuytNF0dJw" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PauloMorgado/Blogs/EN/~4/a3pWqTjMYzI" height="1" width="1"/&gt;</description><pubDate>Mon, 18 Apr 2011 01:16:13 Z</pubDate><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Paulo Morgado</dc:creator><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1791940</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1791940</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2011/04/18/extension-methods-and-type-inference-in-action.aspx#comments</comments><feedburner:origLink>http://msmvps.com/blogs/paulomorgado/archive/2011/04/18/extension-methods-and-type-inference-in-action.aspx</feedburner:origLink></item><item><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1791933</guid><link>http://feeds.paulomorgado.net/~r/PauloMorgado/Blogs/EN/~3/j0R3ymR35OU/net-reflector-give-away.aspx</link><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/redgate/default.aspx">redgate</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Reflector/default.aspx">Reflector</category><title>.NET Reflector Give Away</title><description>&lt;p align="center"&gt;&lt;a target="_blank" href="http://www.reflector.net/blog/wp-content/themes/reflect/Logo.png" title="http://www.reflector.net/"&gt;&lt;img src="http://www.reflector.net/blog/wp-content/themes/reflect/Logo.png" style="border-bottom-style:none;border-left-style:none;display:block;border-top-style:none;float:none;margin-left:auto;border-right-style:none;margin-right:auto;" alt="" /&gt;&lt;/a&gt;&lt;img src="http://c.statcounter.com/6351077/0/9a1b981a/1/" alt="StatCounter"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a target="_blank" href="http://www.red-gate.com/" title="redgate - ingeniously simple tools"&gt;Red Gate&lt;/a&gt; gave me a few licenses of &lt;a target="_blank" href="http://www.reflector.net/" title=".NET Reflector"&gt;.NET Reflector&lt;/a&gt; to give away.&lt;/p&gt;
&lt;p align="justify"&gt;The first to answer to this post in any of my blogs with a phrase about &lt;strong&gt;.NET Reflector&lt;/strong&gt; and name and contact e-mail will get a free license.&lt;/p&gt;
&lt;p align="justify"&gt;Hurry up! There aren&amp;rsquo;t many!&lt;/p&gt;
&lt;p align="justify"&gt;&lt;strong&gt;Update:&lt;/strong&gt; I&amp;#39;ve given all licenses. Sorry for those who didn&amp;#39;t get one.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1791933" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/DTyqek_nmdubHDKOj39UKXi7c3Q/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/DTyqek_nmdubHDKOj39UKXi7c3Q/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/DTyqek_nmdubHDKOj39UKXi7c3Q/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/DTyqek_nmdubHDKOj39UKXi7c3Q/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=j0R3ymR35OU:z_jK5EtWkt4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=j0R3ymR35OU:z_jK5EtWkt4:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=j0R3ymR35OU:z_jK5EtWkt4:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=j0R3ymR35OU:z_jK5EtWkt4:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=j0R3ymR35OU:z_jK5EtWkt4:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=j0R3ymR35OU:z_jK5EtWkt4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=j0R3ymR35OU:z_jK5EtWkt4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=j0R3ymR35OU:z_jK5EtWkt4:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=j0R3ymR35OU:z_jK5EtWkt4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=j0R3ymR35OU:z_jK5EtWkt4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=j0R3ymR35OU:z_jK5EtWkt4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=j0R3ymR35OU:z_jK5EtWkt4:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=j0R3ymR35OU:z_jK5EtWkt4:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=j0R3ymR35OU:z_jK5EtWkt4:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=j0R3ymR35OU:z_jK5EtWkt4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=j0R3ymR35OU:z_jK5EtWkt4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=j0R3ymR35OU:z_jK5EtWkt4:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=j0R3ymR35OU:z_jK5EtWkt4:3yuytNF0dJw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=j0R3ymR35OU:z_jK5EtWkt4:3yuytNF0dJw" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PauloMorgado/Blogs/EN/~4/j0R3ymR35OU" height="1" width="1"/&gt;</description><pubDate>Sun, 17 Apr 2011 23:53:00 Z</pubDate><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Paulo Morgado</dc:creator><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><feedburner:origLink>http://msmvps.com/blogs/paulomorgado/archive/2011/04/18/net-reflector-give-away.aspx</feedburner:origLink></item><item><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1789723</guid><link>http://feeds.paulomorgado.net/~r/PauloMorgado/Blogs/EN/~3/cDazh0G9J18/net-reflector-7-released.aspx</link><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Tools/default.aspx">Tools</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/redgate/default.aspx">redgate</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Reflector/default.aspx">Reflector</category><title>.NET Reflector 7 Released</title><description>&lt;p align="justify"&gt;&lt;a title="http://www.reflector.net/" href="http://www.reflector.net/blog/wp-content/themes/reflect/Logo.png" target="_blank"&gt;&lt;img style="display:block;float:none;margin-left:auto;margin-right:auto;" src="http://www.reflector.net/blog/wp-content/themes/reflect/Logo.png" alt="" /&gt;&lt;/a&gt;&lt;img src="http://c.statcounter.com/6351077/0/9a1b981a/1/" alt="StatCounter"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;This new version fixes a number of bugs and adds support for more high level C# features such as iterator blocks.&lt;/p&gt;  &lt;p align="justify"&gt;A new tabbed browsing model was added and Jason Haley&amp;#39;s PowerCommands add-in was included as an exploratory step for future versions.&lt;/p&gt;  &lt;p align="justify"&gt;To find out more about version 7 just visit &lt;a title=".NET Reflector" href="http://www.reflector.net/" target="_blank"&gt;http://www.reflector.net/&lt;/a&gt;&lt;strong&gt;&lt;/strong&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;The release of version 7 also means that the free version of &lt;a title=".NET Reflector" href="http://www.reflector.net/" target="_blank"&gt;.NET Reflector&lt;/a&gt; is no longer available for download. Maybe you can still get one of the give away licenses that &lt;a title="redgate - ingeniously simple tools" href="http://www.red-gate.com/" target="_blank"&gt;Red Gate&lt;/a&gt; provided to communities and individuals.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1789723" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/2gxnslTr0cRFOhFjKpcotIDY6YQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2gxnslTr0cRFOhFjKpcotIDY6YQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/2gxnslTr0cRFOhFjKpcotIDY6YQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2gxnslTr0cRFOhFjKpcotIDY6YQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=cDazh0G9J18:Akif2uDG1KA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=cDazh0G9J18:Akif2uDG1KA:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=cDazh0G9J18:Akif2uDG1KA:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=cDazh0G9J18:Akif2uDG1KA:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=cDazh0G9J18:Akif2uDG1KA:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=cDazh0G9J18:Akif2uDG1KA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=cDazh0G9J18:Akif2uDG1KA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=cDazh0G9J18:Akif2uDG1KA:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=cDazh0G9J18:Akif2uDG1KA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=cDazh0G9J18:Akif2uDG1KA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=cDazh0G9J18:Akif2uDG1KA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=cDazh0G9J18:Akif2uDG1KA:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=cDazh0G9J18:Akif2uDG1KA:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=cDazh0G9J18:Akif2uDG1KA:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=cDazh0G9J18:Akif2uDG1KA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=cDazh0G9J18:Akif2uDG1KA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=cDazh0G9J18:Akif2uDG1KA:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=cDazh0G9J18:Akif2uDG1KA:3yuytNF0dJw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=cDazh0G9J18:Akif2uDG1KA:3yuytNF0dJw" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PauloMorgado/Blogs/EN/~4/cDazh0G9J18" height="1" width="1"/&gt;</description><pubDate>Fri, 11 Mar 2011 01:09:39 Z</pubDate><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Paulo Morgado</dc:creator><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1789723</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1789723</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2011/03/11/net-reflector-7-released.aspx#comments</comments><feedburner:origLink>http://msmvps.com/blogs/paulomorgado/archive/2011/03/11/net-reflector-7-released.aspx</feedburner:origLink></item><item><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1789594</guid><link>http://feeds.paulomorgado.net/~r/PauloMorgado/Blogs/EN/~3/E7PRL1rw62I/visual-studio-2010-service-pack-1-and-net-framework-4-0-update.aspx</link><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/VisualStudio/default.aspx">VisualStudio</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/VisualStudio2010/default.aspx">VisualStudio2010</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET4.0/default.aspx">.NET4.0</category><title>Visual Studio 2010 Service Pack 1 And .NET Framework 4.0 Update</title><description>&lt;p align="justify"&gt;As announced by &lt;a title="Jason Zender&amp;#39;s Weblog" href="http://blogs.msdn.com/b/jasonz/" target="_blank"&gt;Jason Zender&lt;/a&gt; in his &lt;a title="Announcing Visual Studio 2010 Service Pack 1" href="http://blogs.msdn.com/b/jasonz/archive/2011/03/08/announcing-visual-studio-2010-service-pack-1.aspx" target="_blank"&gt;blog post&lt;/a&gt;, &lt;a title="Visual Studio" href="http://www.microsoft.com/visualstudio/" target="_blank"&gt;Visual Studio&lt;/a&gt; &lt;a title="Visual Studio 2010 Editions - Microsoft Visual Studio" href="http://www.microsoft.com/visualstudio/en-us/products/2010-editions" target="_blank"&gt;2010&lt;/a&gt; Service Pack 1 is available for download for &lt;a title="MSDN - Microsoft Developers Network" href="http://msdn.microsoft.com/" target="_blank"&gt;MSDN&lt;/a&gt; subscribers since March 8 and is available to the general public since March 10.&lt;img src="http://c.statcounter.com/6351077/0/9a1b981a/1/" alt="StatCounter"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a title="bharry&amp;#39;s WebLog - Everything you want to know about Visual Studio ALM and Farming" href="http://blogs.msdn.com/b/bharry/" target="_blank"&gt;Brian Harry&lt;/a&gt; provides &lt;a title="VS/TFS 2010 SP1 and TFS-Project Server Integration Feature Pack have Released" href="http://blogs.msdn.com/b/bharry/archive/2011/03/08/vs-tfs-2010-sp1-and-tfs-project-server-integration-feature-pack-have-released.aspx" target="_blank"&gt;information related to TFS&lt;/a&gt; and &lt;a title="Somesegar&amp;#39;s WebLog" href="http://blogs.msdn.com/b/somasegar/"&gt;S. &amp;quot;Soma&amp;quot; Somasegar&lt;/a&gt; provides information on the latest &lt;a title="Visual Studio 2010 enhancements" href="http://blogs.msdn.com/b/somasegar/archive/2011/03/07/visual-studio-2010-enhancements.aspx" target="_blank"&gt;Visual Studio 2010 enhancements&lt;/a&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;With this service pack for Visual Studio an update to the &lt;a title="Microsoft .NET Framework" href="http://www.microsoft.com/netframework/" target="_blank"&gt;.NET Framework&lt;/a&gt; 4.0 is also released.&lt;/p&gt;  &lt;p align="justify"&gt;For detailed information about these releases, please refer to the corresponding KB articles:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="left"&gt;&lt;a title="Update for Microsoft .NET Framework 4" href="http://support.microsoft.com/kb/2468871" target="_blank"&gt;Update for Microsoft .NET Framework 4&lt;/a&gt;&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="left"&gt;&lt;a title="Description of Visual Studio 2010 Service Pack 1" href="http://support.microsoft.com/kb/983509" target="_blank"&gt;Description of Visual Studio 2010 Service Pack 1&lt;/a&gt;&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;&lt;strong&gt;Update:&lt;/strong&gt;&lt;/p&gt;  &lt;p align="justify"&gt;When I was upgrading from the Beta to the final release on &lt;a title="Microsoft Windows" href="http://www.microsoft.com/windows/" target="_blank"&gt;&lt;a title="Microsoft Windows 7" href="http://www.microsoft.com/windows/windows-7/" target="_blank"&gt;Windows 7&lt;/a&gt; Enterprise&lt;/a&gt; 64bit, the instalation hanged with &lt;strong&gt;Returning IDCANCEL. INSTALLMESSAGE_WARNING [Warning 1946.Property &amp;#39;System.AppUserModel.ExcludeFromShowInNewInstall&amp;#39; for shortcut &amp;#39;Manage Help Settings - ENU.lnk&amp;#39; could not be set.]&lt;/strong&gt;. Canceling the installation didn’t work and I had to kill the &lt;strong&gt;setup.exe&lt;/strong&gt; process.&lt;/p&gt;  &lt;p align="justify"&gt;When reapplying it again, rollbacks were reported, so I reapplied it again – this time with succes.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1789594" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/FDlGQj7Hbbk1QtfIlZgYfTwKnpM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FDlGQj7Hbbk1QtfIlZgYfTwKnpM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/FDlGQj7Hbbk1QtfIlZgYfTwKnpM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FDlGQj7Hbbk1QtfIlZgYfTwKnpM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=E7PRL1rw62I:kHN2rZhAFFY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=E7PRL1rw62I:kHN2rZhAFFY:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=E7PRL1rw62I:kHN2rZhAFFY:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=E7PRL1rw62I:kHN2rZhAFFY:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=E7PRL1rw62I:kHN2rZhAFFY:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=E7PRL1rw62I:kHN2rZhAFFY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=E7PRL1rw62I:kHN2rZhAFFY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=E7PRL1rw62I:kHN2rZhAFFY:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=E7PRL1rw62I:kHN2rZhAFFY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=E7PRL1rw62I:kHN2rZhAFFY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=E7PRL1rw62I:kHN2rZhAFFY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=E7PRL1rw62I:kHN2rZhAFFY:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=E7PRL1rw62I:kHN2rZhAFFY:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=E7PRL1rw62I:kHN2rZhAFFY:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=E7PRL1rw62I:kHN2rZhAFFY:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=E7PRL1rw62I:kHN2rZhAFFY:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=E7PRL1rw62I:kHN2rZhAFFY:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=E7PRL1rw62I:kHN2rZhAFFY:3yuytNF0dJw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=E7PRL1rw62I:kHN2rZhAFFY:3yuytNF0dJw" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PauloMorgado/Blogs/EN/~4/E7PRL1rw62I" height="1" width="1"/&gt;</description><pubDate>Thu, 10 Mar 2011 02:46:15 Z</pubDate><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Paulo Morgado</dc:creator><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1789594</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1789594</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2011/03/10/visual-studio-2010-service-pack-1-and-net-framework-4-0-update.aspx#comments</comments><feedburner:origLink>http://msmvps.com/blogs/paulomorgado/archive/2011/03/10/visual-studio-2010-service-pack-1-and-net-framework-4-0-update.aspx</feedburner:origLink></item><item><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1786249</guid><link>http://feeds.paulomorgado.net/~r/PauloMorgado/Blogs/EN/~3/3SkRBCRqaOc/creating-property-set-expression-trees-in-a-developer-friendly-way.aspx</link><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET4.0/default.aspx">.NET4.0</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/CodeProject/default.aspx">CodeProject</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/C_2300_4.0/default.aspx">C#4.0</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/ExpressionTrees/default.aspx">ExpressionTrees</category><title>Creating Property Set Expression Trees In A Developer Friendly Way</title><description>&lt;p align="justify"&gt;&lt;a title="LINQ Com C#" href="http://bit.ly/Livro-LINQ-Com-Charp" target="_blank"&gt;&lt;img style="border-right-width:0px;margin:0px 0px 10px 10px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="LINQ With C# (Portuguese)" border="0" alt="LINQ With C# (Portuguese)" align="right" src="http://www.fca.pt/ximages/722_547.gif" width="99" height="140" /&gt;&lt;/a&gt;In a previous &lt;a title="Hydrating Objects With Expression Trees - Part I" href="http://paulomorgado.net/en/blog/archive/2010/08/16/hydrating-objects-with-expression-trees-part-i.aspx" target="_blank"&gt;post&lt;/a&gt; I showed how to create expression trees to set properties on an object.&lt;img src="http://c.statcounter.com/6351077/0/9a1b981a/1/" alt="StatCounter"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;The way I did it was not very developer friendly. It involved explicitly creating the necessary expressions because the compiler won’t generate expression trees with property or field set expressions.&lt;/p&gt;  &lt;p align="justify"&gt;Recently someone contacted me the help develop some kind of command pattern framework that used developer friendly lambdas to generate property set expression trees.&lt;/p&gt;  &lt;p align="justify"&gt;Simply putting, given this entity class:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;public class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Person
&lt;/span&gt;{
    &lt;span style="color:blue;"&gt;public string &lt;/span&gt;Name { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; &lt;span style="color:blue;"&gt;set&lt;/span&gt;; }
}&lt;/pre&gt;

&lt;p align="justify"&gt;The person in question wanted to write code like this:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;var &lt;/span&gt;et = Set((&lt;span style="color:#2b91af;"&gt;Person &lt;/span&gt;p) =&amp;gt; p.Name = &lt;span style="color:#a31515;"&gt;&amp;quot;me&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

&lt;p align="justify"&gt;Where &lt;strong&gt;et&lt;/strong&gt; is the expression tree that represents the property assignment.&lt;/p&gt;

&lt;p align="justify"&gt;So, if we can’t do this, let’s try the next best thing that is splitting retrieving the property information from the retrieving the value to assign o the property:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;var &lt;/span&gt;et = Set((&lt;span style="color:#2b91af;"&gt;Person &lt;/span&gt;p) =&amp;gt; p.Name, () =&amp;gt; &lt;span style="color:#a31515;"&gt;&amp;quot;me&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

&lt;p align="justify"&gt;And this is something that the compiler can handle.&lt;/p&gt;

&lt;p align="justify"&gt;The implementation of &lt;strong&gt;Set&lt;/strong&gt; receives an expression to retrieve the property information from and another expression the retrieve the value to assign to the property:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;public static &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Expression&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Action&lt;/span&gt;&amp;lt;TEntity&amp;gt;&amp;gt; Set&amp;lt;TEntity, TValue&amp;gt;(
    &lt;span style="color:#2b91af;"&gt;Expression&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;TEntity, TValue&amp;gt;&amp;gt; propertyGetExpression,
    &lt;span style="color:#2b91af;"&gt;Expression&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;TValue&amp;gt;&amp;gt; valueExpression)&lt;/pre&gt;

&lt;p align="justify"&gt;The implementation of this method gets the property information form the body of the property get expression (&lt;strong&gt;propertyGetExpression&lt;/strong&gt;) and the value expression (&lt;strong&gt;valueExpression&lt;/strong&gt;) to build an assign expression and builds a lambda expression using the same parameter of the property get expression as its parameter:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;public static &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Expression&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Action&lt;/span&gt;&amp;lt;TEntity&amp;gt;&amp;gt; Set&amp;lt;TEntity, TValue&amp;gt;(
    &lt;span style="color:#2b91af;"&gt;Expression&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;TEntity, TValue&amp;gt;&amp;gt; propertyGetExpression,
    &lt;span style="color:#2b91af;"&gt;Expression&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;TValue&amp;gt;&amp;gt; valueExpression)
{
    &lt;span style="color:blue;"&gt;var &lt;/span&gt;entityParameterExpression = (&lt;span style="color:#2b91af;"&gt;ParameterExpression&lt;/span&gt;)(((&lt;span style="color:#2b91af;"&gt;MemberExpression&lt;/span&gt;)(propertyGetExpression.Body)).Expression);

    &lt;span style="color:blue;"&gt;return &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Expression&lt;/span&gt;.Lambda&amp;lt;&lt;span style="color:#2b91af;"&gt;Action&lt;/span&gt;&amp;lt;TEntity&amp;gt;&amp;gt;(
        &lt;span style="color:#2b91af;"&gt;Expression&lt;/span&gt;.Assign(propertyGetExpression.Body, valueExpression.Body),
        entityParameterExpression);
}&lt;/pre&gt;

&lt;p&gt;And now we can use the expression to translate to another context or just compile and use it:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;var &lt;/span&gt;et = Set((&lt;span style="color:#2b91af;"&gt;Person &lt;/span&gt;p) =&amp;gt; p.Name, () =&amp;gt; name);
&lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(person.Name); &lt;span style="color:green;"&gt;// Prints: p =&amp;gt; (p.Name = “me”)&lt;/span&gt;

&lt;span style="color:blue;"&gt;var &lt;/span&gt;d = et.Compile();

d(person);
&lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(person.Name); &lt;span style="color:green;"&gt;// Prints: me
&lt;/span&gt;&lt;/pre&gt;

&lt;p align="justify"&gt;It can even support closures:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;var &lt;/span&gt;et = Set((&lt;span style="color:#2b91af;"&gt;Person &lt;/span&gt;p) =&amp;gt; p.Name, () =&amp;gt; name);
&lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(person.Name); &lt;span style="color:green;"&gt;// Prints: p =&amp;gt; (p.Name = value(&amp;lt;&amp;gt;c__DisplayClass0).name)&lt;/span&gt;

&lt;span style="color:blue;"&gt;var &lt;/span&gt;d = et.Compile();

name = &lt;span style="color:#a31515;"&gt;&amp;quot;me&amp;quot;&lt;/span&gt;;
d(person);
&lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(person.Name); &lt;span style="color:green;"&gt;// Prints: me

&lt;/span&gt;name = &lt;span style="color:#a31515;"&gt;&amp;quot;you&amp;quot;&lt;/span&gt;;
d(person);
&lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(person.Name); &lt;span style="color:green;"&gt;// Prints: you
&lt;/span&gt;&lt;/pre&gt;

&lt;p align="justify"&gt;Not so useful in the intended scenario (but still possible) is building an expression tree that receives the value to assign to the property as a parameter:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;public static &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Expression&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Action&lt;/span&gt;&amp;lt;TEntity, TValue&amp;gt;&amp;gt; Set&amp;lt;TEntity, TValue&amp;gt;(&lt;span style="color:#2b91af;"&gt;Expression&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;TEntity, TValue&amp;gt;&amp;gt; propertyGetExpression)
{
    &lt;span style="color:blue;"&gt;var &lt;/span&gt;entityParameterExpression = (&lt;span style="color:#2b91af;"&gt;ParameterExpression&lt;/span&gt;)(((&lt;span style="color:#2b91af;"&gt;MemberExpression&lt;/span&gt;)(propertyGetExpression.Body)).Expression);
    &lt;span style="color:blue;"&gt;var &lt;/span&gt;valueParameterExpression = &lt;span style="color:#2b91af;"&gt;Expression&lt;/span&gt;.Parameter(&lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(TValue));

    &lt;span style="color:blue;"&gt;return &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Expression&lt;/span&gt;.Lambda&amp;lt;&lt;span style="color:#2b91af;"&gt;Action&lt;/span&gt;&amp;lt;TEntity, TValue&amp;gt;&amp;gt;(
        &lt;span style="color:#2b91af;"&gt;Expression&lt;/span&gt;.Assign(propertyGetExpression.Body, valueParameterExpression),
        entityParameterExpression,
        valueParameterExpression);
}&lt;/pre&gt;

&lt;p align="justify"&gt;This new expression can be used like this:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;var &lt;/span&gt;et = Set((&lt;span style="color:#2b91af;"&gt;Person &lt;/span&gt;p) =&amp;gt; p.Name);
&lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(person.Name); &lt;span style="color:green;"&gt;// Prints: (p, Param_0) =&amp;gt; (p.Name = Param_0)&lt;/span&gt;

&lt;span style="color:blue;"&gt;var &lt;/span&gt;d = et.Compile();

d(person, &lt;span style="color:#a31515;"&gt;&amp;quot;me&amp;quot;&lt;/span&gt;);
&lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(person.Name); &lt;span style="color:green;"&gt;// Prints: me

&lt;/span&gt;d(person, &lt;span style="color:#a31515;"&gt;&amp;quot;you&amp;quot;&lt;/span&gt;);
&lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(person.Name); &lt;span style="color:green;"&gt;// Prints: you
&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;The only caveat is that we need to be able to write code to read the property in order to write to it.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1786249" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Exqc_O85pLQABnFsDbY6icA4LSo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Exqc_O85pLQABnFsDbY6icA4LSo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Exqc_O85pLQABnFsDbY6icA4LSo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Exqc_O85pLQABnFsDbY6icA4LSo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=3SkRBCRqaOc:4b43cGtWupk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=3SkRBCRqaOc:4b43cGtWupk:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=3SkRBCRqaOc:4b43cGtWupk:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=3SkRBCRqaOc:4b43cGtWupk:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=3SkRBCRqaOc:4b43cGtWupk:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=3SkRBCRqaOc:4b43cGtWupk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=3SkRBCRqaOc:4b43cGtWupk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=3SkRBCRqaOc:4b43cGtWupk:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=3SkRBCRqaOc:4b43cGtWupk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=3SkRBCRqaOc:4b43cGtWupk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=3SkRBCRqaOc:4b43cGtWupk:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=3SkRBCRqaOc:4b43cGtWupk:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=3SkRBCRqaOc:4b43cGtWupk:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=3SkRBCRqaOc:4b43cGtWupk:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=3SkRBCRqaOc:4b43cGtWupk:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=3SkRBCRqaOc:4b43cGtWupk:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=3SkRBCRqaOc:4b43cGtWupk:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=3SkRBCRqaOc:4b43cGtWupk:3yuytNF0dJw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=3SkRBCRqaOc:4b43cGtWupk:3yuytNF0dJw" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PauloMorgado/Blogs/EN/~4/3SkRBCRqaOc" height="1" width="1"/&gt;</description><pubDate>Wed, 12 Jan 2011 02:36:20 Z</pubDate><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Paulo Morgado</dc:creator><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1786249</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1786249</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2011/01/12/creating-property-set-expression-trees-in-a-developer-friendly-way.aspx#comments</comments><feedburner:origLink>http://msmvps.com/blogs/paulomorgado/archive/2011/01/12/creating-property-set-expression-trees-in-a-developer-friendly-way.aspx</feedburner:origLink></item><item><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1785171</guid><link>http://feeds.paulomorgado.net/~r/PauloMorgado/Blogs/EN/~3/C57eBNNhpR8/software-development-typing-playing-music-and-assembling-cars.aspx</link><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SoftwareDevelopment/default.aspx">SoftwareDevelopment</category><title>Software Development, Typing, Playing Music And Assembling Cars</title><description>&lt;p align="justify"&gt;Reading &lt;a title="John D. Cook" href="http://www.johndcook.com/" target="_blank"&gt;John D. Cook&lt;/a&gt;’s &lt;a title="The Endeavour - The blog of John D. Cook" target="_blank"&gt;blog&lt;/a&gt; &lt;a title="How much does typing speed matter?" href="http://www.johndcook.com/blog/2010/12/09/does-typing-speed-matter/" target="_blank"&gt;post&lt;/a&gt; about how much does typing speed matter in software development, the way John compares software development to writing a book and not typing the book text or composing music and not playing music, made me think about the usual comparisons made between software development and other activities.&lt;img src="http://c.statcounter.com/6351077/0/9a1b981a/1/" alt="StatCounter"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Like John, I see software development as a creative activity comparable to writing a book (or any other text) or composing music.&lt;/p&gt;  &lt;p align="justify"&gt;Typing the book text or playing an already composed music might, at most, be compared to programming in its most basic form which is introducing a pre-written (or pre-developed program) into the computer (or system).&lt;/p&gt;  &lt;p align="justify"&gt;And that brings me to assembling cars. The function of a car assembly line is to assemble a pre-developed car using a pre-developed set of steps. It’s comparable to typing or playing music not composing the text or music.&lt;/p&gt;  &lt;p align="justify"&gt;That doesn’t mean that people working on a car assembly line are dumb and incapable of being critical or creative. They are just not supposed to act on their own at the assembly line. They have a strict plan to follow. Any input they have to the assembly process must fed the development of the car or its assembly process.&lt;/p&gt;  &lt;p align="justify"&gt;When I hear &lt;a title="Lean software development" href="http://en.wikipedia.org/wiki/Lean_software_development" target="_blank"&gt;Lean software development&lt;/a&gt; dream sellers comparing software development to assembling cars, I can only think that:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;     &lt;div align="justify"&gt;They don’t know the first thing about car development and assembly&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;They don’t know the first thing about software development&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;All of the above&lt;/div&gt;   &lt;/li&gt; &lt;/ol&gt;  &lt;p align="justify"&gt;It’s not that I don’t think Lean principals can be used in the IT industry, or even software development in particular. It’s this silver bullet that solves all the problems of the universe that people that haven’t the faintest idea what I do want to force down my throat that bothers me.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1785171" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/O2cbpxd5MKL9YvbqanAWJ-o_q7s/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/O2cbpxd5MKL9YvbqanAWJ-o_q7s/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/O2cbpxd5MKL9YvbqanAWJ-o_q7s/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/O2cbpxd5MKL9YvbqanAWJ-o_q7s/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=C57eBNNhpR8:FZLNX0L452A:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=C57eBNNhpR8:FZLNX0L452A:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=C57eBNNhpR8:FZLNX0L452A:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=C57eBNNhpR8:FZLNX0L452A:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=C57eBNNhpR8:FZLNX0L452A:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=C57eBNNhpR8:FZLNX0L452A:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=C57eBNNhpR8:FZLNX0L452A:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=C57eBNNhpR8:FZLNX0L452A:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=C57eBNNhpR8:FZLNX0L452A:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=C57eBNNhpR8:FZLNX0L452A:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=C57eBNNhpR8:FZLNX0L452A:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=C57eBNNhpR8:FZLNX0L452A:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=C57eBNNhpR8:FZLNX0L452A:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=C57eBNNhpR8:FZLNX0L452A:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=C57eBNNhpR8:FZLNX0L452A:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=C57eBNNhpR8:FZLNX0L452A:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=C57eBNNhpR8:FZLNX0L452A:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=C57eBNNhpR8:FZLNX0L452A:3yuytNF0dJw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=C57eBNNhpR8:FZLNX0L452A:3yuytNF0dJw" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PauloMorgado/Blogs/EN/~4/C57eBNNhpR8" height="1" width="1"/&gt;</description><pubDate>Tue, 28 Dec 2010 01:16:32 Z</pubDate><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Paulo Morgado</dc:creator><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1785171</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1785171</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2010/12/28/software-development-typing-playing-music-and-assembling-cars.aspx#comments</comments><feedburner:origLink>http://msmvps.com/blogs/paulomorgado/archive/2010/12/28/software-development-typing-playing-music-and-assembling-cars.aspx</feedburner:origLink></item><item><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1780235</guid><link>http://feeds.paulomorgado.net/~r/PauloMorgado/Blogs/EN/~3/WYR2gS6gSn8/linq-implementing-the-skiplastwhile-operator.aspx</link><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/CodePlex/default.aspx">CodePlex</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET4.0/default.aspx">.NET4.0</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/CodeProject/default.aspx">CodeProject</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/C_2300_4.0/default.aspx">C#4.0</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/C_2300_3.0/default.aspx">C#3.0</category><title>LINQ: Implementing The SkipLastWhile Operator</title><description>&lt;a title="LINQ Com C#" href="http://bit.ly/Livro-LINQ-Com-Charp" target="_blank"&gt;&lt;img style="border-right-width:0px;margin:0px 0px 10px 10px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="LINQ Com C#" border="0" alt="LINQ Com C#" align="right" src="http://www.fca.pt/ximages/722_547.gif" width="99" height="140" /&gt;&lt;/a&gt;   &lt;p align="justify"&gt;Following my last posts (&lt;a title="LINQ: Introducing The Skip Last Operators" href="http://paulomorgado.net/en/blog/archive/2010/10/20/linq-introducing-the-skip-last-operators.aspx" target="_blank"&gt;&amp;gt;&lt;/a&gt;)(&lt;a title="LINQ: Implementing The SkipLast Operator" href="http://paulomorgado.net/en/blog/archive/2010/10/20/linq-implementing-the-skiplast-operator.aspx" target="_blank"&gt;&amp;gt;&lt;/a&gt;), in this post I’ll introduce the implementation of the &lt;strong&gt;SkipLastWhile&lt;/strong&gt; operator.&lt;img src="http://c.statcounter.com/6351077/0/9a1b981a/1/" alt="StatCounter"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;The &lt;strong&gt;SkipLastWhile&lt;/strong&gt; returns all but the last contiguous elements from a a sequence that satisfy the specified criteria and is implemented as the &lt;strong&gt;SkipLastWhile&lt;/strong&gt; &lt;a href="http://msdn.microsoft.com/library/bb383977.aspx"&gt;extension methods&lt;/a&gt;:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;public static &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;TSource&amp;gt; SkipLastWhile&amp;lt;TSource&amp;gt;(&lt;font color="#0000ff"&gt;this&lt;/font&gt; &lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;TSource&amp;gt; source, &lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;TSource, &lt;span style="color:blue;"&gt;bool&lt;/span&gt;&amp;gt; predicate)&lt;/pre&gt;

&lt;pre style="margin-top:1em;" class="code"&gt;&lt;span style="color:blue;"&gt;public static &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;TSource&amp;gt; SkipLastWhile&amp;lt;TSource&amp;gt;(&lt;font color="#0000ff"&gt;this&lt;/font&gt; &lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;TSource&amp;gt; source, &lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;TSource, &lt;span style="color:blue;"&gt;int&lt;/span&gt;, &lt;span style="color:blue;"&gt;bool&lt;/span&gt;&amp;gt; predicate)&lt;/pre&gt;

&lt;p align="justify"&gt;The implementation of these methods is very simple. We start with an empty buffer and buffer every item that satisfies the criteria implemented by a &lt;em&gt;predicate&lt;/em&gt;. Whenever an item doesn’t satisfy the criteria, all buffered items are yield, the buffer is cleared and the the item that doesn’t satisfy the criteria is yield:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;var &lt;/span&gt;buffer = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;List&lt;/span&gt;&amp;lt;TSource&amp;gt;();

&lt;span style="color:blue;"&gt;foreach &lt;/span&gt;(&lt;span style="color:blue;"&gt;var &lt;/span&gt;item &lt;span style="color:blue;"&gt;in &lt;/span&gt;source)
{
    &lt;span style="color:blue;"&gt;if &lt;/span&gt;(predicate(item))
    {
        buffer.Add(item);
    }
    &lt;span style="color:blue;"&gt;else
    &lt;/span&gt;{
        &lt;span style="color:blue;"&gt;if &lt;/span&gt;(buffer.Count &amp;gt; 0)
        {
            &lt;span style="color:blue;"&gt;foreach &lt;/span&gt;(&lt;span style="color:blue;"&gt;var &lt;/span&gt;bufferedItem &lt;span style="color:blue;"&gt;in &lt;/span&gt;buffer)
            {
                &lt;span style="color:blue;"&gt;yield return &lt;/span&gt;bufferedItem;
            }

            buffer.Clear();
        }

        &lt;span style="color:blue;"&gt;yield return &lt;/span&gt;item;
    }
}&lt;/pre&gt;

&lt;p align="justify"&gt;The overload that takes in account the index of the item only differs in the call the &lt;em&gt;predicate&lt;/em&gt; that implements the criteria:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;var &lt;/span&gt;buffer = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;List&lt;/span&gt;&amp;lt;TSource&amp;gt;();
&lt;span style="color:blue;"&gt;var &lt;/span&gt;idx = 0;

&lt;span style="color:blue;"&gt;foreach &lt;/span&gt;(&lt;span style="color:blue;"&gt;var &lt;/span&gt;item &lt;span style="color:blue;"&gt;in &lt;/span&gt;source)
{
    &lt;span style="color:blue;"&gt;if &lt;/span&gt;(&lt;strong&gt;predicate(item, idx++)&lt;/strong&gt;)
    {
        buffer.Add(item);
    }
    &lt;span style="color:blue;"&gt;else
    &lt;/span&gt;{
        &lt;span style="color:blue;"&gt;if &lt;/span&gt;(buffer.Count &amp;gt; 0)
        {
            &lt;span style="color:blue;"&gt;foreach &lt;/span&gt;(&lt;span style="color:blue;"&gt;var &lt;/span&gt;bufferedItem &lt;span style="color:blue;"&gt;in &lt;/span&gt;buffer)
            {
                &lt;span style="color:blue;"&gt;yield return &lt;/span&gt;bufferedItem;
            }

            buffer.Clear();
        }

        &lt;span style="color:blue;"&gt;yield return &lt;/span&gt;item;
    }
}&lt;/pre&gt;


&lt;p align="justify"&gt;You can find the complete implementation of this operator (and more) &lt;a title="CodePlex" href="http://www.codeplex.com/" target="_blank"&gt;CodePlex&lt;/a&gt; project for &lt;a title="Language-Integrated Query (LINQ)" href="http://msdn.microsoft.com/library/bb397926.aspx" target="_blank"&gt;LINQ&lt;/a&gt; utilities and operators: &lt;a title="PauloMorgado.Linq" href="http://pmlinq.codeplex.com/" target="_blank"&gt;PauloMorgado.Linq&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1780235" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/3k_M6dNmsexKMZh9dhbgeEsMD_g/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3k_M6dNmsexKMZh9dhbgeEsMD_g/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/3k_M6dNmsexKMZh9dhbgeEsMD_g/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3k_M6dNmsexKMZh9dhbgeEsMD_g/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=WYR2gS6gSn8:Cxi64RF0faA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=WYR2gS6gSn8:Cxi64RF0faA:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=WYR2gS6gSn8:Cxi64RF0faA:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=WYR2gS6gSn8:Cxi64RF0faA:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=WYR2gS6gSn8:Cxi64RF0faA:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=WYR2gS6gSn8:Cxi64RF0faA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=WYR2gS6gSn8:Cxi64RF0faA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=WYR2gS6gSn8:Cxi64RF0faA:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=WYR2gS6gSn8:Cxi64RF0faA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=WYR2gS6gSn8:Cxi64RF0faA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=WYR2gS6gSn8:Cxi64RF0faA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=WYR2gS6gSn8:Cxi64RF0faA:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=WYR2gS6gSn8:Cxi64RF0faA:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=WYR2gS6gSn8:Cxi64RF0faA:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=WYR2gS6gSn8:Cxi64RF0faA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=WYR2gS6gSn8:Cxi64RF0faA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=WYR2gS6gSn8:Cxi64RF0faA:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=WYR2gS6gSn8:Cxi64RF0faA:3yuytNF0dJw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=WYR2gS6gSn8:Cxi64RF0faA:3yuytNF0dJw" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PauloMorgado/Blogs/EN/~4/WYR2gS6gSn8" height="1" width="1"/&gt;</description><pubDate>Wed, 20 Oct 2010 00:00:00 Z</pubDate><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Paulo Morgado</dc:creator><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1780235</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1780235</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2010/10/20/linq-implementing-the-skiplastwhile-operator.aspx#comments</comments><feedburner:origLink>http://msmvps.com/blogs/paulomorgado/archive/2010/10/20/linq-implementing-the-skiplastwhile-operator.aspx</feedburner:origLink></item><item><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1780229</guid><link>http://feeds.paulomorgado.net/~r/PauloMorgado/Blogs/EN/~3/0KjWUEP3hvA/linq-implementing-the-skiplast-operator.aspx</link><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/CodePlex/default.aspx">CodePlex</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET4.0/default.aspx">.NET4.0</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/CodeProject/default.aspx">CodeProject</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/C_2300_4.0/default.aspx">C#4.0</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/C_2300_3.0/default.aspx">C#3.0</category><title>LINQ: Implementing The SkipLast Operator</title><description>&lt;p align="justify"&gt;&lt;a title="LINQ With C# (Portuguese)" href="http://bit.ly/Livro-LINQ-Com-Charp" target="_blank"&gt;&lt;img style="border-right-width:0px;margin:0px 0px 10px 10px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="LINQ With C# (Portuguese)" border="0" alt="LINQ With C# (Portuguese)" align="right" src="http://www.fca.pt/ximages/722_547.gif" width="99" height="140" /&gt;&lt;/a&gt;&lt;img src="http://c.statcounter.com/6351077/0/9a1b981a/1/" alt="StatCounter"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Following my last &lt;a title="LINQ: Introducing The Skip Last Operators" href="#" target="_blank"&gt;post&lt;/a&gt;, in this post I’ll introduce the implementation of the &lt;strong&gt;SkipLast&lt;/strong&gt; operator.&lt;/p&gt;  &lt;p align="justify"&gt;The &lt;strong&gt;SkipLast&lt;/strong&gt; operator returns all but a specified number of contiguous elements from the end of a sequence and is implemented as the &lt;strong&gt;SkipLast&lt;/strong&gt; &lt;a title="Extension Methods (C# Programming Guide)" href="http://msdn.microsoft.com/library/bb383977.aspx" target="_blank"&gt;extension method&lt;/a&gt;:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;public static &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;TSource&amp;gt; SkipLast&amp;lt;TSource&amp;gt;(&lt;font color="#0000ff"&gt;this&lt;/font&gt; &lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;TSource&amp;gt; source, &lt;span style="color:blue;"&gt;int &lt;/span&gt;count)&lt;/pre&gt;

&lt;p align="justify"&gt;To implement this operator, first we start by buffering, at most, a &lt;em&gt;count&lt;/em&gt; number of items from the &lt;em&gt;source&lt;/em&gt; sequence in an array that acts as a circular buffer:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;var &lt;/span&gt;sourceEnumerator = source.GetEnumerator();
&lt;span style="color:blue;"&gt;var &lt;/span&gt;buffer = &lt;span style="color:blue;"&gt;new &lt;/span&gt;TSource[count];
&lt;span style="color:blue;"&gt;int &lt;/span&gt;idx;

&lt;span style="color:blue;"&gt;for &lt;/span&gt;(idx = 0; (idx &amp;lt; count) &amp;amp;&amp;amp; sourceEnumerator.MoveNext(); idx++)
{
    buffer[idx] = sourceEnumerator.Current;
}&lt;/pre&gt;

&lt;p align="justify"&gt;Next, we iterate over the rest of the items of the &lt;em&gt;source&lt;/em&gt; sequence circularly buffering them and yielding the previously buffered item at the same postition:&lt;/p&gt;

&lt;pre class="code"&gt;idx = 0;

&lt;span style="color:blue;"&gt;while &lt;/span&gt;(sourceEnumerator.MoveNext())
{
    &lt;span style="color:blue;"&gt;var &lt;/span&gt;item = buffer[idx];

    buffer[idx] = sourceEnumerator.Current;

    idx = (idx + 1) % count;

    &lt;span style="color:blue;"&gt;yield return &lt;/span&gt;item;
}&lt;/pre&gt;

&lt;p align="justify"&gt;If the number of items to skip is greater or equal to the number of items in the &lt;em&gt;source&lt;/em&gt; sequence, &lt;strong&gt;sourceEnumerator.MoveNext()&lt;/strong&gt; will return &lt;strong&gt;false&lt;/strong&gt; on the first iteration of the &lt;strong&gt;while&lt;/strong&gt; loop and an empty sequence will be produced.&lt;/p&gt;

&lt;p align="justify"&gt;As with the &lt;strong&gt;TakeLast&lt;/strong&gt; operator, a few optimizations can be made here.&lt;/p&gt;

&lt;p align="justify"&gt;The first is obvious, if the requested number of items is &lt;strong&gt;0&lt;/strong&gt; (zero) or lower, we just return an equivalent sequence:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;if &lt;/span&gt;(count &amp;lt;= 0)
{
    &lt;span style="color:blue;"&gt;return &lt;/span&gt;source.Select(i =&amp;gt; i);
}&lt;/pre&gt;

&lt;p align="justify"&gt;The second is if the &lt;em&gt;source&lt;/em&gt; sequence is known to implement the &lt;a title="IList(Of T) Interface" href="http://msdn.microsoft.com/library/5y536ey6.aspx" target="_blank"&gt;IList&amp;lt;T&amp;gt;&lt;/a&gt; interface. Objects implementing this interface have a &lt;a title="ICollection(Of T).Count Property" href="http://msdn.microsoft.com/en-us/library/5s3kzhec.aspx" target="_blank"&gt;Count&lt;/a&gt; property and indexed access to its &lt;a title="IList(Of T).Item Property" href="http://msdn.microsoft.com/en-us/library/ewthkb10.aspx" target="_blank"&gt;items&lt;/a&gt; which allows us to optimize the production of the final sequence.&lt;/p&gt;

&lt;p align="justify"&gt;If the number of items to skip is equal to or greater than the number of items in the &lt;em&gt;source&lt;/em&gt; sequence, we just return an empty sequence:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;var &lt;/span&gt;list = source &lt;span style="color:blue;"&gt;as &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IList&lt;/span&gt;&amp;lt;TSource&amp;gt;;

&lt;span style="color:blue;"&gt;if &lt;/span&gt;(list != &lt;span style="color:blue;"&gt;null&lt;/span&gt;)
{
    &lt;span style="color:blue;"&gt;if &lt;/span&gt;(count &amp;gt;= list.Count)
    {
        &lt;span style="color:blue;"&gt;return &lt;/span&gt;System.Linq.&lt;span style="color:#2b91af;"&gt;Enumerable&lt;/span&gt;.Empty&amp;lt;TSource&amp;gt;();
    }

    &lt;span style="color:green;"&gt;// ...
&lt;/span&gt;}&lt;/pre&gt;

&lt;p align="justify"&gt;If the number of items in the &lt;em&gt;source&lt;/em&gt; sequence is greater than the number of items to skip, producing the final sequence consists of yielding all the items in the &lt;em&gt;source&lt;/em&gt; sequence except the last &lt;em&gt;count&lt;/em&gt; items:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;int &lt;/span&gt;returnCount = list.Count - count;

&lt;span style="color:blue;"&gt;for &lt;/span&gt;(&lt;span style="color:blue;"&gt;int &lt;/span&gt;idx = 0; idx &amp;lt; returnCount; idx++)
{
    &lt;span style="color:blue;"&gt;yield return &lt;/span&gt;list[idx];
}&lt;/pre&gt;

&lt;p align="justify"&gt;You can find the complete implementation of this operator (and more) &lt;a title="CodePlex" href="http://www.codeplex.com/" target="_blank"&gt;CodePlex&lt;/a&gt; project for &lt;a title="Language-Integrated Query (LINQ)" href="http://msdn.microsoft.com/library/bb397926.aspx" target="_blank"&gt;LINQ&lt;/a&gt; utilities and operators: &lt;a title="PauloMorgado.Linq" href="http://pmlinq.codeplex.com/" target="_blank"&gt;PauloMorgado.Linq&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1780229" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/yz2njfhVOS3Xg5iyw87aI_Td3tg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/yz2njfhVOS3Xg5iyw87aI_Td3tg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/yz2njfhVOS3Xg5iyw87aI_Td3tg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/yz2njfhVOS3Xg5iyw87aI_Td3tg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=0KjWUEP3hvA:hlPAX7dhEj4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=0KjWUEP3hvA:hlPAX7dhEj4:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=0KjWUEP3hvA:hlPAX7dhEj4:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=0KjWUEP3hvA:hlPAX7dhEj4:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=0KjWUEP3hvA:hlPAX7dhEj4:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=0KjWUEP3hvA:hlPAX7dhEj4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=0KjWUEP3hvA:hlPAX7dhEj4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=0KjWUEP3hvA:hlPAX7dhEj4:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=0KjWUEP3hvA:hlPAX7dhEj4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=0KjWUEP3hvA:hlPAX7dhEj4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=0KjWUEP3hvA:hlPAX7dhEj4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=0KjWUEP3hvA:hlPAX7dhEj4:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=0KjWUEP3hvA:hlPAX7dhEj4:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=0KjWUEP3hvA:hlPAX7dhEj4:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=0KjWUEP3hvA:hlPAX7dhEj4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=0KjWUEP3hvA:hlPAX7dhEj4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=0KjWUEP3hvA:hlPAX7dhEj4:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=0KjWUEP3hvA:hlPAX7dhEj4:3yuytNF0dJw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=0KjWUEP3hvA:hlPAX7dhEj4:3yuytNF0dJw" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PauloMorgado/Blogs/EN/~4/0KjWUEP3hvA" height="1" width="1"/&gt;</description><pubDate>Tue, 19 Oct 2010 23:59:00 Z</pubDate><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Paulo Morgado</dc:creator><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1780229</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1780229</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2010/10/20/linq-implementing-the-skiplast-operator.aspx#comments</comments><feedburner:origLink>http://msmvps.com/blogs/paulomorgado/archive/2010/10/20/linq-implementing-the-skiplast-operator.aspx</feedburner:origLink></item><item><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1780227</guid><link>http://feeds.paulomorgado.net/~r/PauloMorgado/Blogs/EN/~3/Rh3iOJerakI/linq-introducing-the-skip-last-operators.aspx</link><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/CodePlex/default.aspx">CodePlex</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET4.0/default.aspx">.NET4.0</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/CodeProject/default.aspx">CodeProject</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/C_2300_4.0/default.aspx">C#4.0</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/C_2300_3.0/default.aspx">C#3.0</category><title>LINQ: Introducing The Skip Last Operators</title><description>&lt;p align="justify"&gt;&lt;a title="LINQ With C# (Portuguese)" href="http://bit.ly/Livro-LINQ-Com-Charp" target="_blank"&gt;&lt;img style="border-right-width:0px;margin:0px 0px 10px 10px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="LINQ With C# (Portuguese)" border="0" alt="LINQ With C# (Portuguese)" align="right" src="http://www.fca.pt/ximages/722_547.gif" width="99" height="140" /&gt;&lt;/a&gt;&lt;img src="http://c.statcounter.com/6351077/0/9a1b981a/1/" alt="StatCounter"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;After having introduced the &lt;strong&gt;TakeLast&lt;/strong&gt; operators (&lt;a title="LINQ: Introducing The Take Last Operators" href="http://paulomorgado.net/en/blog/archive/2010/10/18/linq-introducing-the-take-last-operators.aspx" target="_blank"&gt;&amp;gt;&lt;/a&gt;)(&lt;a title="LINQ: Implementing The TakeLast Operator" href="http://paulomorgado.net/en/blog/archive/2010/10/18/linq-implementing-the-takelast-operator.aspx" target="_blank"&gt;&amp;gt;&lt;/a&gt;)(&lt;a title="LINQ: Implementing The TakeLastWhile Operator" href="http://paulomorgado.net/en/blog/archive/2010/10/18/linq-implementing-the-takelastwhile-operator.aspx" target="_blank"&gt;&amp;gt;&lt;/a&gt;), it makes sense to introduce their duals: the &lt;strong&gt;SkipLast&lt;/strong&gt; operators.&lt;/p&gt;  &lt;table style="border-bottom:#000000 1px solid;border-left:#000000 1px solid;border-top:#000000 1px solid;font-weight:bold;border-right:#000000 1px solid;" border="1" cellspacing="0" cellpadding="2"&gt;&lt;thead style="border-bottom:#000000 1px solid;border-left:#000000 1px solid;border-top:#000000 1px solid;font-weight:bold;border-right:#000000 1px solid;"&gt;     &lt;tr&gt;       &lt;th valign="top"&gt;Name&lt;/th&gt;        &lt;th valign="top"&gt;Description&lt;/th&gt;        &lt;td valign="top"&gt;Example&lt;/td&gt;     &lt;/tr&gt;   &lt;/thead&gt;&lt;tbody style="border-bottom:#000000 1px solid;border-left:#000000 1px solid;border-top:#000000 1px solid;font-weight:normal;border-right:#000000 1px solid;"&gt;     &lt;tr&gt;       &lt;td valign="top"&gt;&lt;a title="LINQ: Implementing The SkipLast Operator" href="http://paulomorgado.net/en/blog/archive/2010/10/20/linq-implementing-the-skiplast-operator.aspx" target="_blank"&gt;SkipLast&amp;lt;TSource&amp;gt;(IEnumerable&amp;lt;TSource&amp;gt;)&lt;/a&gt;&lt;/td&gt;        &lt;td valign="top"&gt;         &lt;p&gt;Returns all but a specified number of contiguous elements from the end of a sequence.&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top"&gt;         &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;int&lt;/span&gt;&lt;span style="color:black;"&gt;[] grades = { &lt;/span&gt;&lt;span style="color:#c81efa;"&gt;59&lt;/span&gt;&lt;span style="color:black;"&gt;, &lt;/span&gt;&lt;span style="color:#c81efa;"&gt;82&lt;/span&gt;&lt;span style="color:black;"&gt;, &lt;/span&gt;&lt;span style="color:#c81efa;"&gt;70&lt;/span&gt;&lt;span style="color:black;"&gt;, &lt;/span&gt;&lt;span style="color:#c81efa;"&gt;56&lt;/span&gt;&lt;span style="color:black;"&gt;, &lt;/span&gt;&lt;span style="color:#c81efa;"&gt;92&lt;/span&gt;&lt;span style="color:black;"&gt;, &lt;/span&gt;&lt;span style="color:#c81efa;"&gt;98&lt;/span&gt;&lt;span style="color:black;"&gt;, &lt;/span&gt;&lt;span style="color:#c81efa;"&gt;85 &lt;/span&gt;&lt;span style="color:black;"&gt;};

&lt;/span&gt;&lt;span style="color:blue;"&gt;var &lt;/span&gt;&lt;span style="color:black;"&gt;lowerGrades = grades
                  .OrderBy(g =&amp;gt; g)
                  .SkipLast(&lt;/span&gt;&lt;span style="color:#c81efa;"&gt;3&lt;/span&gt;&lt;span style="color:black;"&gt;);

Console.WriteLine(&lt;/span&gt;&lt;span style="color:#dc1414;"&gt;&amp;quot;All grades except the top three are:&amp;quot;&lt;/span&gt;&lt;span style="color:black;"&gt;);
&lt;/span&gt;&lt;span style="color:blue;"&gt;foreach &lt;/span&gt;&lt;span style="color:black;"&gt;(&lt;/span&gt;&lt;span style="color:blue;"&gt;int &lt;/span&gt;&lt;span style="color:black;"&gt;grade &lt;/span&gt;&lt;span style="color:blue;"&gt;in &lt;/span&gt;&lt;span style="color:black;"&gt;lowerGrades)
{
    Console.WriteLine(grade);
}

&lt;/span&gt;&lt;span style="color:green;"&gt;/*
This code produces the following output:

All grades except the top three are:
56
59
70
82
*/&lt;/span&gt;&lt;/pre&gt;
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="top"&gt;&lt;a title="LINQ: Implementing The SkipLastWhile Operator" href="http://paulomorgado.net/en/blog/archive/2010/10/20/linq-implementing-the-skiplastwhile-operator.aspx" target="_blank"&gt;SkipLastWhile&amp;lt;TSource&amp;gt;(IEnumerable&amp;lt;TSource&amp;gt;, Func&amp;lt;TSource, Boolean&amp;gt;)&lt;/a&gt;&lt;/td&gt;

      &lt;td valign="top"&gt;
        &lt;p&gt;Returns all the elements from sequence skipping those at the end as long as the specified condition is true.&lt;/p&gt;
      &lt;/td&gt;

      &lt;td valign="top"&gt;
        &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;int&lt;/span&gt;&lt;span style="color:black;"&gt;[] grades = { &lt;/span&gt;&lt;span style="color:#c81efa;"&gt;59&lt;/span&gt;&lt;span style="color:black;"&gt;, &lt;/span&gt;&lt;span style="color:#c81efa;"&gt;82&lt;/span&gt;&lt;span style="color:black;"&gt;, &lt;/span&gt;&lt;span style="color:#c81efa;"&gt;70&lt;/span&gt;&lt;span style="color:black;"&gt;, &lt;/span&gt;&lt;span style="color:#c81efa;"&gt;56&lt;/span&gt;&lt;span style="color:black;"&gt;, &lt;/span&gt;&lt;span style="color:#c81efa;"&gt;92&lt;/span&gt;&lt;span style="color:black;"&gt;, &lt;/span&gt;&lt;span style="color:#c81efa;"&gt;98&lt;/span&gt;&lt;span style="color:black;"&gt;, &lt;/span&gt;&lt;span style="color:#c81efa;"&gt;85 &lt;/span&gt;&lt;span style="color:black;"&gt;};

&lt;/span&gt;&lt;span style="color:blue;"&gt;var &lt;/span&gt;&lt;span style="color:black;"&gt;lowerGrades = grades
                 .OrderBy(grade =&amp;gt; grade)
                 .SkipLastWhile(grade =&amp;gt; grade &amp;gt;= &lt;/span&gt;&lt;span style="color:#c81efa;"&gt;80&lt;/span&gt;&lt;span style="color:black;"&gt;);

Console.WriteLine(&lt;/span&gt;&lt;span style="color:#dc1414;"&gt;&amp;quot;All grades below 80:&amp;quot;&lt;/span&gt;&lt;span style="color:black;"&gt;);
&lt;/span&gt;&lt;span style="color:blue;"&gt;foreach &lt;/span&gt;&lt;span style="color:black;"&gt;(&lt;/span&gt;&lt;span style="color:blue;"&gt;int &lt;/span&gt;&lt;span style="color:black;"&gt;grade &lt;/span&gt;&lt;span style="color:blue;"&gt;in &lt;/span&gt;&lt;span style="color:black;"&gt;lowerGrades)
{
    Console.WriteLine(grade);
}

&lt;/span&gt;&lt;span style="color:green;"&gt;/*
This code produces the following output:

All grades below 80:
56
59
70
*/&lt;/span&gt;&lt;/pre&gt;
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="top"&gt;&lt;a title="LINQ: Implementing The SkipLastWhile Operator" href="http://paulomorgado.net/en/blog/archive/2010/10/20/linq-implementing-the-skiplastwhile-operator.aspx" target="_blank"&gt;SkipLastWhile&amp;lt;TSource&amp;gt;(IEnumerable&amp;lt;TSource&amp;gt;, Func&amp;lt;TSource, Int32, Boolean&amp;gt;)&lt;/a&gt;&lt;/td&gt;

      &lt;td valign="top"&gt;
        &lt;p&gt;Returns all the elements from sequence skipping those at the end as long as the specified condition is true.&lt;/p&gt;
      &lt;/td&gt;

      &lt;td valign="top"&gt;
        &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;int&lt;/span&gt;&lt;span style="color:black;"&gt;[] amounts =
    {
        &lt;/span&gt;&lt;span style="color:#c81efa;"&gt;5000&lt;/span&gt;&lt;span style="color:black;"&gt;,
        &lt;/span&gt;&lt;span style="color:#c81efa;"&gt;2500&lt;/span&gt;&lt;span style="color:black;"&gt;,
        &lt;/span&gt;&lt;span style="color:#c81efa;"&gt;5500&lt;/span&gt;&lt;span style="color:black;"&gt;,
        &lt;/span&gt;&lt;span style="color:#c81efa;"&gt;8000&lt;/span&gt;&lt;span style="color:black;"&gt;,
        &lt;/span&gt;&lt;span style="color:#c81efa;"&gt;6500&lt;/span&gt;&lt;span style="color:black;"&gt;,
        &lt;/span&gt;&lt;span style="color:#c81efa;"&gt;4000&lt;/span&gt;&lt;span style="color:black;"&gt;,
        &lt;/span&gt;&lt;span style="color:#c81efa;"&gt;1500&lt;/span&gt;&lt;span style="color:black;"&gt;,
        &lt;/span&gt;&lt;span style="color:#c81efa;"&gt;9000
    &lt;/span&gt;&lt;span style="color:black;"&gt;};

&lt;/span&gt;&lt;span style="color:blue;"&gt;var &lt;/span&gt;&lt;span style="color:black;"&gt;query = amounts
            .SkipLastWhile((amount, index) =&amp;gt; amount &amp;gt; index * &lt;/span&gt;&lt;span style="color:#c81efa;"&gt;1000&lt;/span&gt;&lt;span style="color:black;"&gt;);

&lt;/span&gt;&lt;span style="color:blue;"&gt;foreach &lt;/span&gt;&lt;span style="color:black;"&gt;(&lt;/span&gt;&lt;span style="color:blue;"&gt;int &lt;/span&gt;&lt;span style="color:black;"&gt;amount &lt;/span&gt;&lt;span style="color:blue;"&gt;in &lt;/span&gt;&lt;span style="color:black;"&gt;query)
{
    Console.WriteLine(amount);
}

&lt;/span&gt;&lt;span style="color:green;"&gt;/*
 This code produces the following output:

9000
*/&lt;/span&gt;&lt;/pre&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;

&lt;p&gt;You can find these (and more) operators in my &lt;a title="CodePlex" href="http://www.codeplex.com/" target="_blank"&gt;CodePlex&lt;/a&gt; project for &lt;a title="Language-Integrated Query (LINQ)" href="http://msdn.microsoft.com/library/bb397926.aspx" target="_blank"&gt;LINQ&lt;/a&gt; utilities and operators: &lt;a title="PauloMorgado.Linq" href="http://pmlinq.codeplex.com/" target="_blank"&gt;PauloMorgado.Linq&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1780227" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/k20zb3PrbON3AJZtCK5eGL6Tdl8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/k20zb3PrbON3AJZtCK5eGL6Tdl8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/k20zb3PrbON3AJZtCK5eGL6Tdl8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/k20zb3PrbON3AJZtCK5eGL6Tdl8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=Rh3iOJerakI:OxVtxcyRV9Q:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=Rh3iOJerakI:OxVtxcyRV9Q:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=Rh3iOJerakI:OxVtxcyRV9Q:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=Rh3iOJerakI:OxVtxcyRV9Q:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=Rh3iOJerakI:OxVtxcyRV9Q:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=Rh3iOJerakI:OxVtxcyRV9Q:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=Rh3iOJerakI:OxVtxcyRV9Q:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=Rh3iOJerakI:OxVtxcyRV9Q:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=Rh3iOJerakI:OxVtxcyRV9Q:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=Rh3iOJerakI:OxVtxcyRV9Q:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=Rh3iOJerakI:OxVtxcyRV9Q:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=Rh3iOJerakI:OxVtxcyRV9Q:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=Rh3iOJerakI:OxVtxcyRV9Q:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=Rh3iOJerakI:OxVtxcyRV9Q:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=Rh3iOJerakI:OxVtxcyRV9Q:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=Rh3iOJerakI:OxVtxcyRV9Q:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=Rh3iOJerakI:OxVtxcyRV9Q:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=Rh3iOJerakI:OxVtxcyRV9Q:3yuytNF0dJw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=Rh3iOJerakI:OxVtxcyRV9Q:3yuytNF0dJw" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PauloMorgado/Blogs/EN/~4/Rh3iOJerakI" height="1" width="1"/&gt;</description><pubDate>Tue, 19 Oct 2010 23:58:00 Z</pubDate><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Paulo Morgado</dc:creator><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1780227</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1780227</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2010/10/20/linq-introducing-the-skip-last-operators.aspx#comments</comments><feedburner:origLink>http://msmvps.com/blogs/paulomorgado/archive/2010/10/20/linq-introducing-the-skip-last-operators.aspx</feedburner:origLink></item><item><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1780159</guid><link>http://feeds.paulomorgado.net/~r/PauloMorgado/Blogs/EN/~3/-5NmViIZGow/linq-implementing-the-takelastwhile-operator.aspx</link><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/CodePlex/default.aspx">CodePlex</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET4.0/default.aspx">.NET4.0</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/CodeProject/default.aspx">CodeProject</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/C_2300_4.0/default.aspx">C#4.0</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/C_2300_3.0/default.aspx">C#3.0</category><title>LINQ: Implementing The TakeLastWhile Operator</title><description>&lt;a title="LINQ With C# (Portuguese)" href="http://bit.ly/Livro-LINQ-Com-Charp" target="_blank"&gt;&lt;img style="border-right-width:0px;margin:0px 0px 10px 10px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="LINQ With C# (Portuguese)" border="0" alt="LINQ With C# (Portuguese)" align="right" src="http://www.fca.pt/ximages/722_547.gif" width="99" height="140" /&gt;&lt;/a&gt;   &lt;p align="justify"&gt;Following my last posts (&lt;a title="LINQ: Introducing The Take Last Operators" href="http://paulomorgado.net/en/blog/archive/2010/10/18/linq-introducing-the-take-last-operators.aspx" target="_blank"&gt;&amp;gt;&lt;/a&gt;)(&lt;a title="LINQ: Implementing The TakeLast Operator" href="http://paulomorgado.net/en/blog/archive/2010/10/18/linq-implementing-the-takelast-operator.aspx" target="_blank"&gt;&amp;gt;&lt;/a&gt;), in this post I’ll introduce the implementation of the &lt;strong&gt;TakeLastWhile&lt;/strong&gt; operator.&lt;img src="http://c.statcounter.com/6351077/0/9a1b981a/1/" alt="StatCounter"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;The &lt;strong&gt;TakeLastWhile&lt;/strong&gt; operator returns last contiguous elements from a sequence that satisfy the specified criteria and is implemented as the &lt;strong&gt;TakeLastWhile&lt;/strong&gt; &lt;a title="Extension Methods (C# Programming Guide)" href="http://msdn.microsoft.com/library/bb383977.aspx" target="_blank"&gt;extension methods&lt;/a&gt;:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;public static &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;TSource&amp;gt; TakeLastWhile&amp;lt;TSource&amp;gt;(&lt;font color="#0000ff"&gt;this&lt;/font&gt; &lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;TSource&amp;gt; source, &lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;TSource, &lt;span style="color:blue;"&gt;bool&lt;/span&gt;&amp;gt; predicate)&lt;/pre&gt;

&lt;pre style="margin-top:1em;" class="code"&gt;&lt;span style="color:blue;"&gt;public static &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;TSource&amp;gt; TakeLastWhile&amp;lt;TSource&amp;gt;(&lt;font color="#0000ff"&gt;this&lt;/font&gt; &lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;TSource&amp;gt; source, &lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;TSource, &lt;span style="color:blue;"&gt;int&lt;/span&gt;, &lt;span style="color:blue;"&gt;bool&lt;/span&gt;&amp;gt; predicate)&lt;/pre&gt;

&lt;p align="justify"&gt;The implementation of the first method is very simple. We start with an empty buffer and buffer every item that satisfies the criteria implemented by a &lt;em&gt;predicate&lt;/em&gt;. Whenever an item doesn’t satisfy the criteria, the buffer is cleared:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;var &lt;/span&gt;buffer = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;List&lt;/span&gt;&amp;lt;TSource&amp;gt;();

&lt;span style="color:blue;"&gt;foreach &lt;/span&gt;(&lt;span style="color:blue;"&gt;var &lt;/span&gt;item &lt;span style="color:blue;"&gt;in &lt;/span&gt;source)
{
    &lt;span style="color:blue;"&gt;if &lt;/span&gt;(predicate(item))
    {
        buffer.Add(item);
    }
    &lt;span style="color:blue;"&gt;else
    &lt;/span&gt;{
        buffer.Clear();
    }
}&lt;/pre&gt;

&lt;p align="justify"&gt;After traversing the &lt;em&gt;source&lt;/em&gt; sequence, we just yield all the items, if any, in the buffer:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;foreach &lt;/span&gt;(&lt;span style="color:blue;"&gt;var &lt;/span&gt;item &lt;span style="color:blue;"&gt;in &lt;/span&gt;buffer)
{
    &lt;span style="color:blue;"&gt;yield return &lt;/span&gt;item;
}&lt;/pre&gt;

&lt;p align="justify"&gt;The overload that takes in account the index of the item only differs in the call the &lt;em&gt;predicate&lt;/em&gt; that implements the criteria:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;var &lt;/span&gt;buffer = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;List&lt;/span&gt;&amp;lt;TSource&amp;gt;();
&lt;span style="color:blue;"&gt;var &lt;/span&gt;idx = 0;

&lt;span style="color:blue;"&gt;foreach &lt;/span&gt;(&lt;span style="color:blue;"&gt;var &lt;/span&gt;item &lt;span style="color:blue;"&gt;in &lt;/span&gt;source)
{
    &lt;span style="color:blue;"&gt;if &lt;/span&gt;(&lt;strong&gt;predicate(item, idx++)&lt;/strong&gt;)
    {
        buffer.Add(item);
    }
    &lt;span style="color:blue;"&gt;else
    &lt;/span&gt;{
        buffer.Clear();
    }
}

&lt;span style="color:blue;"&gt;foreach &lt;/span&gt;(&lt;span style="color:blue;"&gt;var &lt;/span&gt;item &lt;span style="color:blue;"&gt;in &lt;/span&gt;buffer)
{
    &lt;span style="color:blue;"&gt;yield return &lt;/span&gt;item;
}&lt;/pre&gt;

&lt;p align="justify"&gt;You can find the complete implementation of this operator (and more) &lt;a title="CodePlex" href="http://www.codeplex.com/" target="_blank"&gt;CodePlex&lt;/a&gt; project for &lt;a title="Language-Integrated Query (LINQ)" href="http://msdn.microsoft.com/library/bb397926.aspx" target="_blank"&gt;LINQ&lt;/a&gt; utilities and operators: &lt;a title="PauloMorgado.Linq" href="http://pmlinq.codeplex.com/" target="_blank"&gt;PauloMorgado.Linq&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1780159" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/MoQ3t6oj5hALOLX4fZJmuFMkZgc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/MoQ3t6oj5hALOLX4fZJmuFMkZgc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/MoQ3t6oj5hALOLX4fZJmuFMkZgc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/MoQ3t6oj5hALOLX4fZJmuFMkZgc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=-5NmViIZGow:CKqtYVh8qlA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=-5NmViIZGow:CKqtYVh8qlA:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=-5NmViIZGow:CKqtYVh8qlA:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=-5NmViIZGow:CKqtYVh8qlA:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=-5NmViIZGow:CKqtYVh8qlA:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=-5NmViIZGow:CKqtYVh8qlA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=-5NmViIZGow:CKqtYVh8qlA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=-5NmViIZGow:CKqtYVh8qlA:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=-5NmViIZGow:CKqtYVh8qlA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=-5NmViIZGow:CKqtYVh8qlA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=-5NmViIZGow:CKqtYVh8qlA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=-5NmViIZGow:CKqtYVh8qlA:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=-5NmViIZGow:CKqtYVh8qlA:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=-5NmViIZGow:CKqtYVh8qlA:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=-5NmViIZGow:CKqtYVh8qlA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=-5NmViIZGow:CKqtYVh8qlA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=-5NmViIZGow:CKqtYVh8qlA:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=-5NmViIZGow:CKqtYVh8qlA:3yuytNF0dJw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=-5NmViIZGow:CKqtYVh8qlA:3yuytNF0dJw" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PauloMorgado/Blogs/EN/~4/-5NmViIZGow" height="1" width="1"/&gt;</description><pubDate>Sun, 17 Oct 2010 23:26:51 Z</pubDate><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Paulo Morgado</dc:creator><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1780159</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1780159</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2010/10/18/linq-implementing-the-takelastwhile-operator.aspx#comments</comments><feedburner:origLink>http://msmvps.com/blogs/paulomorgado/archive/2010/10/18/linq-implementing-the-takelastwhile-operator.aspx</feedburner:origLink></item><item><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1780158</guid><link>http://feeds.paulomorgado.net/~r/PauloMorgado/Blogs/EN/~3/BXgTrxI-Aiw/linq-implementing-the-takelast-operator.aspx</link><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/CodePlex/default.aspx">CodePlex</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET4.0/default.aspx">.NET4.0</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/CodeProject/default.aspx">CodeProject</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/C_2300_4.0/default.aspx">C#4.0</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/C_2300_3.0/default.aspx">C#3.0</category><title>LINQ: Implementing The TakeLast Operator</title><description>&lt;p align="justify"&gt;&lt;a title="LINQ With C# (Portuguese)" href="http://bit.ly/Livro-LINQ-Com-Charp" target="_blank"&gt;&lt;img style="border-right-width:0px;margin:0px 0px 10px 10px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="LINQ With C# (Portuguese)" border="0" alt="LINQ With C# (Portuguese)" align="right" src="http://www.fca.pt/ximages/722_547.gif" width="99" height="140" /&gt;&lt;/a&gt;&lt;img src="http://c.statcounter.com/6351077/0/9a1b981a/1/" alt="StatCounter"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Following my last &lt;a title="LINQ: Introducing The Take Last Operators" href="http://paulomorgado.net/en/blog/archive/2010/10/18/linq-introducing-the-take-last-operators.aspx" target="_blank"&gt;post&lt;/a&gt;, in this post I’ll introduce the implementation of the &lt;strong&gt;TakeLast&lt;/strong&gt; operator.&lt;/p&gt;  &lt;p align="justify"&gt;The &lt;strong&gt;TakeLast&lt;/strong&gt; operator returns a specified number of contiguous elements from the end of a sequence and is implemented as the &lt;strong&gt;TakeLast&lt;/strong&gt; &lt;a title="Extension Methods (C# Programming Guide)" href="http://msdn.microsoft.com/library/bb383977.aspx" target="_blank"&gt;extension method&lt;/a&gt;:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;public static &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;TSource&amp;gt; TakeLast&amp;lt;TSource&amp;gt;(&lt;span style="color:blue;"&gt;this &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;TSource&amp;gt; source, &lt;span style="color:blue;"&gt;int &lt;/span&gt;count)&lt;/pre&gt;

&lt;p align="justify"&gt;To implement this operator, first we start by buffering, at most, a &lt;em&gt;count&lt;/em&gt; number of items from the &lt;em&gt;source&lt;/em&gt; sequence in an array that acts as a circular buffer:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;var &lt;/span&gt;sourceEnumerator = source.GetEnumerator();
&lt;span style="color:blue;"&gt;var &lt;/span&gt;buffer = &lt;span style="color:blue;"&gt;new &lt;/span&gt;TSource[count];
&lt;span style="color:blue;"&gt;var &lt;/span&gt;numOfItems = 0;
&lt;span style="color:blue;"&gt;int &lt;/span&gt;idx;

&lt;span style="color:blue;"&gt;for &lt;/span&gt;(idx = 0; (idx &amp;lt; count) &amp;amp;&amp;amp; sourceEnumerator.MoveNext(); idx++, numOfItems++)
{
    buffer[idx] = sourceEnumerator.Current;
}&lt;/pre&gt;

&lt;p align="justify"&gt;If the number of buffered items (&lt;em&gt;numOfItems&lt;/em&gt;) is less than the requested number of items (&lt;em&gt;count&lt;/em&gt;), we just yield all the buffered items:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;if &lt;/span&gt;(numOfItems &amp;lt; count)
{
    &lt;span style="color:blue;"&gt;for &lt;/span&gt;(idx = 0; idx &amp;lt; numOfItems; idx++)
    {
        &lt;span style="color:blue;"&gt;yield return &lt;/span&gt;buffer[idx];
    }

    &lt;span style="color:blue;"&gt;yield break&lt;/span&gt;;
}&lt;/pre&gt;

&lt;p align="justify"&gt;Next, we iterate over the rest of the items circularly buffering them:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;for &lt;/span&gt;(idx = 0; sourceEnumerator.MoveNext(); idx = (idx + 1) % count)
{
    buffer[idx] = sourceEnumerator.Current;
}&lt;/pre&gt;

&lt;p align="justify"&gt;And finally, we just iterate over the buffered items and yield them:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;for &lt;/span&gt;(; numOfItems &amp;gt; 0; idx = (idx + 1) % count, numOfItems--)
{
    &lt;span style="color:blue;"&gt;yield return &lt;/span&gt;buffer[idx];
}&lt;/pre&gt;

&lt;p align="justify"&gt;There are two optimizations you can make here.&lt;/p&gt;

&lt;p align="justify"&gt;The first is obvious, if the requested number of items is &lt;strong&gt;0&lt;/strong&gt; (zero), we just return an empty sequence:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;if &lt;/span&gt;(count &amp;lt;= 0)
{
    &lt;span style="color:blue;"&gt;return &lt;/span&gt;System.Linq.&lt;span style="color:#2b91af;"&gt;Enumerable&lt;/span&gt;.Empty&amp;lt;TSource&amp;gt;();
}&lt;/pre&gt;

&lt;p align="justify"&gt;The second is if the &lt;em&gt;source&lt;/em&gt; sequence is known to implement the &lt;a title="IList(Of T) Interface" href="http://msdn.microsoft.com/library/5y536ey6.aspx" target="_blank"&gt;IList&amp;lt;T&amp;gt;&lt;/a&gt; interface. Objects implementing this interface have a &lt;a title="ICollection(Of T).Count Property" href="http://msdn.microsoft.com/en-us/library/5s3kzhec.aspx" target="_blank"&gt;Count&lt;/a&gt; property and indexed access to its &lt;a title="IList(Of T).Item Property" href="http://msdn.microsoft.com/en-us/library/ewthkb10.aspx" target="_blank"&gt;items&lt;/a&gt; which allows us to optimize the production of the final sequence.&lt;/p&gt;

&lt;p align="justify"&gt;Producing the final sequence consists of yielding the required number of items from the end of the list (or all of them if the list contains less items than required):&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;int &lt;/span&gt;listCount = list.Count;

&lt;span style="color:blue;"&gt;for &lt;/span&gt;(&lt;span style="color:blue;"&gt;int &lt;/span&gt;idx = listCount - ((count &amp;lt; listCount) ? count : listCount); idx &amp;lt; listCount; idx++)
{
    &lt;span style="color:blue;"&gt;yield return &lt;/span&gt;list[idx];
}&lt;/pre&gt;

&lt;p align="justify"&gt;You can find the complete implementation of this operator (and more) &lt;a title="CodePlex" href="http://www.codeplex.com/" target="_blank"&gt;CodePlex&lt;/a&gt; project for &lt;a title="Language-Integrated Query (LINQ)" href="http://msdn.microsoft.com/library/bb397926.aspx" target="_blank"&gt;LINQ&lt;/a&gt; utilities and operators: &lt;a title="PauloMorgado.Linq" href="http://pmlinq.codeplex.com/" target="_blank"&gt;PauloMorgado.Linq&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1780158" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/5Wji9t_3M2YqDF3SguR0A2toMWs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5Wji9t_3M2YqDF3SguR0A2toMWs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/5Wji9t_3M2YqDF3SguR0A2toMWs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5Wji9t_3M2YqDF3SguR0A2toMWs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=BXgTrxI-Aiw:omzjq5vXNUw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=BXgTrxI-Aiw:omzjq5vXNUw:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=BXgTrxI-Aiw:omzjq5vXNUw:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=BXgTrxI-Aiw:omzjq5vXNUw:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=BXgTrxI-Aiw:omzjq5vXNUw:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=BXgTrxI-Aiw:omzjq5vXNUw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=BXgTrxI-Aiw:omzjq5vXNUw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=BXgTrxI-Aiw:omzjq5vXNUw:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=BXgTrxI-Aiw:omzjq5vXNUw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=BXgTrxI-Aiw:omzjq5vXNUw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=BXgTrxI-Aiw:omzjq5vXNUw:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=BXgTrxI-Aiw:omzjq5vXNUw:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=BXgTrxI-Aiw:omzjq5vXNUw:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=BXgTrxI-Aiw:omzjq5vXNUw:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=BXgTrxI-Aiw:omzjq5vXNUw:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=BXgTrxI-Aiw:omzjq5vXNUw:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=BXgTrxI-Aiw:omzjq5vXNUw:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=BXgTrxI-Aiw:omzjq5vXNUw:3yuytNF0dJw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=BXgTrxI-Aiw:omzjq5vXNUw:3yuytNF0dJw" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PauloMorgado/Blogs/EN/~4/BXgTrxI-Aiw" height="1" width="1"/&gt;</description><pubDate>Sun, 17 Oct 2010 23:26:44 Z</pubDate><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Paulo Morgado</dc:creator><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1780158</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1780158</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2010/10/18/linq-implementing-the-takelast-operator.aspx#comments</comments><feedburner:origLink>http://msmvps.com/blogs/paulomorgado/archive/2010/10/18/linq-implementing-the-takelast-operator.aspx</feedburner:origLink></item><item><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1780157</guid><link>http://feeds.paulomorgado.net/~r/PauloMorgado/Blogs/EN/~3/cbrkSNhnVkE/linq-introducing-the-take-last-operators.aspx</link><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/CodePlex/default.aspx">CodePlex</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET4.0/default.aspx">.NET4.0</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/CodeProject/default.aspx">CodeProject</category><title>LINQ: Introducing The Take Last Operators</title><description>&lt;p align="justify"&gt;&lt;a title="LINQ With C# (Portuguese)" href="http://bit.ly/Livro-LINQ-Com-Charp" target="_blank"&gt;&lt;img style="border-right-width:0px;margin:0px 0px 10px 10px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="LINQ With C# (Portuguese)" border="0" alt="LINQ With C# (Portuguese)" align="right" src="http://www.fca.pt/ximages/722_547.gif" width="99" height="140" /&gt;&lt;/a&gt;&lt;img src="http://c.statcounter.com/6351077/0/9a1b981a/1/" alt="StatCounter"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Some time ago I needed to retrieve the last items of a sequence that satisfied some criteria and, looking at the operators available in the &lt;a title="Enumerable Class" href="http://msdn.microsoft.com/library/system.linq.enumerable.aspx" target="_blank"&gt;&lt;strong&gt;Enumerable&lt;/strong&gt;&lt;/a&gt; class, I noticed that there wasn’t such operator.&lt;/p&gt;  &lt;p align="justify"&gt;The only way to achieve this was to reverse the sequence, take the items that satisfied the criteria and reverse the resulting sequence. Something like this:&lt;/p&gt;  &lt;pre class="code"&gt;sequence.Reverse().TakeWhile(criteria).Reverse();&lt;/pre&gt;

&lt;p align="justify"&gt;Looks quite simple, right? First we call the &lt;a title="Enumerable.Reverse Method" href="http://msdn.microsoft.com/library/bb358497.aspx" target="_blank"&gt;&lt;strong&gt;Reverse&lt;/strong&gt;&lt;/a&gt; method to produce a new sequence with the same items as the original sequence but in the reverse order, then we call the &lt;a title="Enumerable.TakeWhile Method" href="http://msdn.microsoft.com/library/system.linq.enumerable.takewhile.aspx" target="_blank"&gt;&lt;strong&gt;TakeWhile&lt;/strong&gt;&lt;/a&gt; method to take the first items that satisfy the criteria and then call the &lt;strong&gt;Reverse&lt;/strong&gt; method again to restore the original order of the items.&lt;/p&gt;

&lt;p align="justify"&gt;The problem with this approach is that the &lt;strong&gt;Reverse&lt;/strong&gt; method buffers the entire sequence before iterating through its items in the reverse order - and the above code uses it twice. This means iterating over all items in the original sequence and buffer them all, iterating over first items of the resulting sequence that satisfy the criteria and buffer them all and, finally, iterate over that result to produce the final sequence.&lt;/p&gt;

&lt;p align="justify"&gt;If you’re counting, you’ve come to the conclusion that all items in the original sequence will be iterated over once and the ones in the resulting sequence will be iterated again three times. If the original sequence is large, this can take lots of memory and time.&lt;/p&gt;

&lt;p align="justify"&gt;There’s another issue if you’re using the variant the uses the index of the item in the original sequence in the evaluation of the selection criteria (&lt;a title="Enumerable.TakeWhile(Of TSource) Method (IEnumerable(Of TSource), Func(Of TSource, Int32, Boolean))" href="http://msdn.microsoft.com/library/bb548775.aspx" target="_blank"&gt;&amp;gt;&lt;/a&gt;). When we reverse the order of the items, the indexes will be reversed and the predicate must take that in account, which might not be possible if you don’t know the number of items in the original sequence.&lt;/p&gt;

&lt;p align="justify"&gt;There must be a better way, and that’s why I implemented the &lt;strong&gt;Take Last Operators&lt;/strong&gt;:&lt;/p&gt;

&lt;table style="border-bottom:#000000 1px solid;border-left:#000000 1px solid;border-top:#000000 1px solid;font-weight:bold;border-right:#000000 1px solid;" border="1" cellspacing="0" cellpadding="2"&gt;&lt;thead style="border-bottom:#000000 1px solid;border-left:#000000 1px solid;border-top:#000000 1px solid;font-weight:bold;border-right:#000000 1px solid;"&gt;
    &lt;tr&gt;
      &lt;th valign="top"&gt;Name&lt;/th&gt;

      &lt;th valign="top"&gt;Description&lt;/th&gt;

      &lt;td valign="top"&gt;Example&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;&lt;tbody style="border-bottom:#000000 1px solid;border-left:#000000 1px solid;border-top:#000000 1px solid;font-weight:normal;border-right:#000000 1px solid;"&gt;
    &lt;tr&gt;
      &lt;td valign="top"&gt;&lt;a title="LINQ: Implementing The TakeLast Operator" href="http://paulomorgado.net/en/blog/archive/2010/10/18/linq-implementing-the-takelast-operator.aspx" target="_blank"&gt;TakeLast&amp;lt;TSource&amp;gt;(IEnumerable&amp;lt;TSource&amp;gt;)&lt;/a&gt;&lt;/td&gt;

      &lt;td valign="top"&gt;
        &lt;p align="justify"&gt;Returns a specified number of contiguous elements from the end of a sequence.&lt;/p&gt;
      &lt;/td&gt;

      &lt;td valign="top"&gt;
        &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;int&lt;/span&gt;&lt;span style="color:black;"&gt;[] grades = { &lt;/span&gt;&lt;span style="color:#c81efa;"&gt;59&lt;/span&gt;&lt;span style="color:black;"&gt;, &lt;/span&gt;&lt;span style="color:#c81efa;"&gt;82&lt;/span&gt;&lt;span style="color:black;"&gt;, &lt;/span&gt;&lt;span style="color:#c81efa;"&gt;70&lt;/span&gt;&lt;span style="color:black;"&gt;, &lt;/span&gt;&lt;span style="color:#c81efa;"&gt;56&lt;/span&gt;&lt;span style="color:black;"&gt;, &lt;/span&gt;&lt;span style="color:#c81efa;"&gt;92&lt;/span&gt;&lt;span style="color:black;"&gt;, &lt;/span&gt;&lt;span style="color:#c81efa;"&gt;98&lt;/span&gt;&lt;span style="color:black;"&gt;, &lt;/span&gt;&lt;span style="color:#c81efa;"&gt;85 &lt;/span&gt;&lt;span style="color:black;"&gt;};

&lt;/span&gt;&lt;span style="color:blue;"&gt;var &lt;/span&gt;&lt;span style="color:black;"&gt;topThreeGrades = grades
                     .OrderBy(grade =&amp;gt; grade)
                     .TakeLast(&lt;/span&gt;&lt;span style="color:#c81efa;"&gt;3&lt;/span&gt;&lt;span style="color:black;"&gt;);

Console.WriteLine(&lt;/span&gt;&lt;span style="color:#dc1414;"&gt;&amp;quot;The top three grades are:&amp;quot;&lt;/span&gt;&lt;span style="color:black;"&gt;);
&lt;/span&gt;&lt;span style="color:blue;"&gt;foreach &lt;/span&gt;&lt;span style="color:black;"&gt;(&lt;/span&gt;&lt;span style="color:blue;"&gt;int &lt;/span&gt;&lt;span style="color:black;"&gt;grade &lt;/span&gt;&lt;span style="color:blue;"&gt;in &lt;/span&gt;&lt;span style="color:black;"&gt;topThreeGrades)
{
    Console.WriteLine(grade);
}
&lt;/span&gt;&lt;span style="color:green;"&gt;/*
This code produces the following output:

The top three grades are:
98
92
85
*/&lt;/span&gt;&lt;/pre&gt;
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="top"&gt;&lt;a title="LINQ: Implementing The TakeLastWhile Operator" href="http://paulomorgado.net/en/blog/archive/2010/10/18/linq-implementing-the-takelastwhile-operator.aspx" target="_blank"&gt;TakeLastWhile&amp;lt;TSource&amp;gt;(IEnumerable&amp;lt;TSource&amp;gt;, Func&amp;lt;TSource, Boolean&amp;gt;)&lt;/a&gt;&lt;/td&gt;

      &lt;td valign="top"&gt;
        &lt;p align="justify"&gt;Returns the elements from the end of a sequence as long as the specified condition is true.&lt;/p&gt;
      &lt;/td&gt;

      &lt;td valign="top"&gt;
        &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&lt;span style="color:black;"&gt;[] fruits =
    {
        &lt;/span&gt;&lt;span style="color:#dc1414;"&gt;&amp;quot;apple&amp;quot;&lt;/span&gt;&lt;span style="color:black;"&gt;,
        &lt;/span&gt;&lt;span style="color:#dc1414;"&gt;&amp;quot;passionfruit&amp;quot;&lt;/span&gt;&lt;span style="color:black;"&gt;,
        &lt;/span&gt;&lt;span style="color:#dc1414;"&gt;&amp;quot;banana&amp;quot;&lt;/span&gt;&lt;span style="color:black;"&gt;,
        &lt;/span&gt;&lt;span style="color:#dc1414;"&gt;&amp;quot;mango&amp;quot;&lt;/span&gt;&lt;span style="color:black;"&gt;,
        &lt;/span&gt;&lt;span style="color:#dc1414;"&gt;&amp;quot;orange&amp;quot;&lt;/span&gt;&lt;span style="color:black;"&gt;,
        &lt;/span&gt;&lt;span style="color:#dc1414;"&gt;&amp;quot;blueberry&amp;quot;&lt;/span&gt;&lt;span style="color:black;"&gt;,
        &lt;/span&gt;&lt;span style="color:#dc1414;"&gt;&amp;quot;grape&amp;quot;&lt;/span&gt;&lt;span style="color:black;"&gt;,
        &lt;/span&gt;&lt;span style="color:#dc1414;"&gt;&amp;quot;strawberry&amp;quot;
    &lt;/span&gt;&lt;span style="color:black;"&gt;};

&lt;/span&gt;&lt;span style="color:blue;"&gt;var &lt;/span&gt;&lt;span style="color:black;"&gt;query = fruits
            .TakeLastWhile(fruit =&amp;gt; &lt;font color="#0000ff"&gt;string&lt;/font&gt;.Compare(&lt;/span&gt;&lt;span style="color:#dc1414;"&gt;&amp;quot;orange&amp;quot;&lt;/span&gt;&lt;span style="color:black;"&gt;, fruit, &lt;/span&gt;&lt;span style="color:blue;"&gt;true&lt;/span&gt;&lt;span style="color:black;"&gt;) != &lt;/span&gt;&lt;span style="color:#c81efa;"&gt;0&lt;/span&gt;&lt;span style="color:black;"&gt;);

&lt;/span&gt;&lt;span style="color:blue;"&gt;foreach &lt;/span&gt;&lt;span style="color:black;"&gt;(&lt;/span&gt;&lt;span style="color:blue;"&gt;string &lt;/span&gt;&lt;span style="color:black;"&gt;fruit &lt;/span&gt;&lt;span style="color:blue;"&gt;in &lt;/span&gt;&lt;span style="color:black;"&gt;query)
{
    Console.WriteLine(fruit);
}

&lt;/span&gt;&lt;span style="color:green;"&gt;/*
This code produces the following output:
blueberry
grape
strawberry
*/&lt;/span&gt;&lt;/pre&gt;
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="top"&gt;&lt;a title="LINQ: Implementing The TakeLastWhile Operator" href="http://paulomorgado.net/en/blog/archive/2010/10/18/linq-implementing-the-takelastwhile-operator.aspx" target="_blank"&gt;TakeLastWhile&amp;lt;TSource&amp;gt;(IEnumerable&amp;lt;TSource&amp;gt;, Func&amp;lt;TSource, Int32, Boolean&amp;gt;)&lt;/a&gt;&lt;/td&gt;

      &lt;td valign="top"&gt;
        &lt;p align="justify"&gt;Returns the elements from the end of a sequence as long as the specified condition is true.&lt;/p&gt;
      &lt;/td&gt;

      &lt;td valign="top"&gt;
        &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&lt;span style="color:black;"&gt;[] fruits =
    {
        &lt;/span&gt;&lt;span style="color:#dc1414;"&gt;&amp;quot;apple&amp;quot;&lt;/span&gt;&lt;span style="color:black;"&gt;,
        &lt;/span&gt;&lt;span style="color:#dc1414;"&gt;&amp;quot;passionfruit&amp;quot;&lt;/span&gt;&lt;span style="color:black;"&gt;,
        &lt;/span&gt;&lt;span style="color:#dc1414;"&gt;&amp;quot;banana&amp;quot;&lt;/span&gt;&lt;span style="color:black;"&gt;,
        &lt;/span&gt;&lt;span style="color:#dc1414;"&gt;&amp;quot;mango&amp;quot;&lt;/span&gt;&lt;span style="color:black;"&gt;,
        &lt;/span&gt;&lt;span style="color:#dc1414;"&gt;&amp;quot;orange&amp;quot;&lt;/span&gt;&lt;span style="color:black;"&gt;,
        &lt;/span&gt;&lt;span style="color:#dc1414;"&gt;&amp;quot;blueberry&amp;quot;&lt;/span&gt;&lt;span style="color:black;"&gt;,
        &lt;/span&gt;&lt;span style="color:#dc1414;"&gt;&amp;quot;grape&amp;quot;&lt;/span&gt;&lt;span style="color:black;"&gt;,
        &lt;/span&gt;&lt;span style="color:#dc1414;"&gt;&amp;quot;strawberry&amp;quot;
    &lt;/span&gt;&lt;span style="color:black;"&gt;};

&lt;/span&gt;&lt;span style="color:blue;"&gt;var &lt;/span&gt;&lt;span style="color:black;"&gt;query = fruits
            .TakeLastWhile((fruit, index) =&amp;gt; fruit.Length &amp;gt;= &lt;/span&gt;&lt;span style="color:black;"&gt;index);

&lt;/span&gt;&lt;span style="color:blue;"&gt;foreach &lt;/span&gt;&lt;span style="color:black;"&gt;(&lt;/span&gt;&lt;span style="color:blue;"&gt;string &lt;/span&gt;&lt;span style="color:black;"&gt;fruit &lt;/span&gt;&lt;span style="color:blue;"&gt;in &lt;/span&gt;&lt;span style="color:black;"&gt;query)
{
    Console.WriteLine(fruit);
}

&lt;/span&gt;&lt;span style="color:green;"&gt;/*
This code produces the following output:

strawberry
*/&lt;/span&gt;&lt;/pre&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;

&lt;p&gt;You can find these (and more) operators in my &lt;a title="CodePlex" href="http://www.codeplex.com/" target="_blank"&gt;CodePlex&lt;/a&gt; project for &lt;a title="Language-Integrated Query (LINQ)" href="http://msdn.microsoft.com/library/bb397926.aspx" target="_blank"&gt;LINQ&lt;/a&gt; utilities and operators: &lt;a title="PauloMorgado.Linq" href="http://pmlinq.codeplex.com/" target="_blank"&gt;PauloMorgado.Linq&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1780157" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/xTHyUuxc39xjTtUwvinBIgOgZDY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xTHyUuxc39xjTtUwvinBIgOgZDY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/xTHyUuxc39xjTtUwvinBIgOgZDY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xTHyUuxc39xjTtUwvinBIgOgZDY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=cbrkSNhnVkE:5ykz6s25yiA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=cbrkSNhnVkE:5ykz6s25yiA:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=cbrkSNhnVkE:5ykz6s25yiA:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=cbrkSNhnVkE:5ykz6s25yiA:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=cbrkSNhnVkE:5ykz6s25yiA:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=cbrkSNhnVkE:5ykz6s25yiA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=cbrkSNhnVkE:5ykz6s25yiA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=cbrkSNhnVkE:5ykz6s25yiA:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=cbrkSNhnVkE:5ykz6s25yiA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=cbrkSNhnVkE:5ykz6s25yiA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=cbrkSNhnVkE:5ykz6s25yiA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=cbrkSNhnVkE:5ykz6s25yiA:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=cbrkSNhnVkE:5ykz6s25yiA:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=cbrkSNhnVkE:5ykz6s25yiA:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=cbrkSNhnVkE:5ykz6s25yiA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=cbrkSNhnVkE:5ykz6s25yiA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=cbrkSNhnVkE:5ykz6s25yiA:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/EN?a=cbrkSNhnVkE:5ykz6s25yiA:3yuytNF0dJw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/EN?i=cbrkSNhnVkE:5ykz6s25yiA:3yuytNF0dJw" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PauloMorgado/Blogs/EN/~4/cbrkSNhnVkE" height="1" width="1"/&gt;</description><pubDate>Sun, 17 Oct 2010 23:26:40 Z</pubDate><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Paulo Morgado</dc:creator><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1780157</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1780157</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2010/10/18/linq-introducing-the-take-last-operators.aspx#comments</comments><feedburner:origLink>http://msmvps.com/blogs/paulomorgado/archive/2010/10/18/linq-introducing-the-take-last-operators.aspx</feedburner:origLink></item></channel></rss>

