<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>pushbomb &#187; C# 3.0 Enhancements</title>
	<atom:link href="http://team.pushbomb.com/category/technology/c-30-enhancements/feed/" rel="self" type="application/rss+xml" />
	<link>http://team.pushbomb.com</link>
	<description>tv programmed by the collective</description>
	<lastBuildDate>Tue, 05 Jan 2010 22:49:48 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='team.pushbomb.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/a08732ed34e6814d5a5513fe8cde5696?s=96&#038;d=http://s2.wp.com/i/buttonw-com.png</url>
		<title>pushbomb &#187; C# 3.0 Enhancements</title>
		<link>http://team.pushbomb.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://team.pushbomb.com/osd.xml" title="pushbomb" />
	<atom:link rel='hub' href='http://team.pushbomb.com/?pushpress=hub'/>
		<item>
		<title>Silverlight 3 Media The Complete Story with Advanced Sample</title>
		<link>http://team.pushbomb.com/2009/07/24/silverlight_3_digital_media_complete_information_media_platform/</link>
		<comments>http://team.pushbomb.com/2009/07/24/silverlight_3_digital_media_complete_information_media_platform/#comments</comments>
		<pubDate>Sat, 25 Jul 2009 00:04:00 +0000</pubDate>
		<dc:creator>Damon Wilder Carr</dc:creator>
				<category><![CDATA[Adobe Video Formats]]></category>
		<category><![CDATA[Art and Animation]]></category>
		<category><![CDATA[C# 3.0 Enhancements]]></category>
		<category><![CDATA[Digital Media]]></category>
		<category><![CDATA[HD Video]]></category>
		<category><![CDATA[Industry News]]></category>
		<category><![CDATA[Live Smooth Streaming]]></category>
		<category><![CDATA[PlugIns & Extensibility (MEF)]]></category>
		<category><![CDATA[SilverLight]]></category>
		<category><![CDATA[Smooth Streaming]]></category>
		<category><![CDATA[Software Design]]></category>
		<category><![CDATA[Software Futures]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Tips and Tricks]]></category>
		<category><![CDATA[silverlight 3]]></category>
		<category><![CDATA[acceleration]]></category>
		<category><![CDATA[acquisition]]></category>
		<category><![CDATA[adaptive]]></category>
		<category><![CDATA[adobe]]></category>
		<category><![CDATA[advantage]]></category>
		<category><![CDATA[agencies]]></category>
		<category><![CDATA[Analytics]]></category>
		<category><![CDATA[animation]]></category>
		<category><![CDATA[audiences]]></category>
		<category><![CDATA[Audio]]></category>
		<category><![CDATA[authentication]]></category>
		<category><![CDATA[authorization]]></category>
		<category><![CDATA[bandwidth]]></category>
		<category><![CDATA[Blend]]></category>
		<category><![CDATA[bridge]]></category>
		<category><![CDATA[broadcasters]]></category>
		<category><![CDATA[browser]]></category>
		<category><![CDATA[Bureau]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[codecs]]></category>
		<category><![CDATA[Compatible]]></category>
		<category><![CDATA[component]]></category>
		<category><![CDATA[components]]></category>
		<category><![CDATA[computer]]></category>
		<category><![CDATA[congestion]]></category>
		<category><![CDATA[conversion]]></category>
		<category><![CDATA[cost]]></category>
		<category><![CDATA[Datacenter]]></category>
		<category><![CDATA[demo]]></category>
		<category><![CDATA[Developers]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[Digital]]></category>
		<category><![CDATA[distribution]]></category>
		<category><![CDATA[ecosystem]]></category>
		<category><![CDATA[Encoder]]></category>
		<category><![CDATA[encryption]]></category>
		<category><![CDATA[Expression]]></category>
		<category><![CDATA[extensions]]></category>
		<category><![CDATA[features]]></category>
		<category><![CDATA[Individualization]]></category>
		<category><![CDATA[innovation]]></category>
		<category><![CDATA[Integration]]></category>
		<category><![CDATA[Learn]]></category>
		<category><![CDATA[leverage]]></category>
		<category><![CDATA[libraries]]></category>
		<category><![CDATA[Live]]></category>
		<category><![CDATA[Management]]></category>
		<category><![CDATA[Manager]]></category>
		<category><![CDATA[measurement]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Migration]]></category>
		<category><![CDATA[Monetize]]></category>
		<category><![CDATA[Mono]]></category>
		<category><![CDATA[Motion]]></category>
		<category><![CDATA[Motor]]></category>
		<category><![CDATA[Movie]]></category>
		<category><![CDATA[Multicast]]></category>
		<category><![CDATA[navigation]]></category>
		<category><![CDATA[needs]]></category>
		<category><![CDATA[norm]]></category>
		<category><![CDATA[Novell]]></category>
		<category><![CDATA[Online]]></category>
		<category><![CDATA[options]]></category>
		<category><![CDATA[organizations]]></category>
		<category><![CDATA[Overview]]></category>
		<category><![CDATA[owners]]></category>
		<category><![CDATA[Pack]]></category>
		<category><![CDATA[partners]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[photo]]></category>
		<category><![CDATA[Picture]]></category>
		<category><![CDATA[pipeline]]></category>
		<category><![CDATA[platforms]]></category>
		<category><![CDATA[Play]]></category>
		<category><![CDATA[playback]]></category>
		<category><![CDATA[player]]></category>
		<category><![CDATA[players]]></category>
		<category><![CDATA[Playlists]]></category>
		<category><![CDATA[PlayReady]]></category>
		<category><![CDATA[processor]]></category>
		<category><![CDATA[Providers]]></category>
		<category><![CDATA[QUMU]]></category>
		<category><![CDATA[RTMP]]></category>
		<category><![CDATA[scenarios]]></category>
		<category><![CDATA[Services]]></category>
		<category><![CDATA[Smooth]]></category>
		<category><![CDATA[SMPTE]]></category>
		<category><![CDATA[Standard]]></category>
		<category><![CDATA[Studio]]></category>
		<category><![CDATA[subscriptions]]></category>
		<category><![CDATA[Support]]></category>
		<category><![CDATA[supports]]></category>
		<category><![CDATA[talent]]></category>
		<category><![CDATA[technique]]></category>
		<category><![CDATA[techniques]]></category>
		<category><![CDATA[technologies]]></category>
		<category><![CDATA[Television]]></category>
		<category><![CDATA[template]]></category>
		<category><![CDATA[templates]]></category>
		<category><![CDATA[tools]]></category>
		<category><![CDATA[Toyota]]></category>
		<category><![CDATA[Trailer]]></category>
		<category><![CDATA[Video]]></category>
		<category><![CDATA[Visual]]></category>
		<category><![CDATA[XAML]]></category>

		<guid isPermaLink="false">http://dcarr.wordpress.com/2009/07/25/silverlight_3_digital_media_complete_information_media_platform/</guid>
		<description><![CDATA[Silverlight 3 is an amazing release but perhaps mostly for digital media. Here is the full explanation of what is new as well as our commentary on what we are using in our new Silverlight 3 Media Platform. The demo which shows off most of below (and much more including deep zoom) check out the Movie Trailer sample of our platform. This platform can be used by anyone as a site template for media, a personal app, and is fully customizable either as Expression Encoder 3 templates (no support for 2) or controls with template parts/skin exposed customizations just like Microsoft controls.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=1472&subd=dcarr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>Silverlight 3 is an amazing release but perhaps mostly for digital media. Here is the full explanation of what is new as well as our commentary on what we are using in our new Silverlight 3 Media Platform.</p>
<p>The demo which shows off most of below (and much more including deep zoom) check out the Movie Trailer sample of our platform. This platform can be used by anyone as a site template for media, a personal app, and is fully customizable either as Expression Encoder 3 templates (no support for 2) or controls with template parts/skin exposed customizations just like Microsoft controls.</p>
<p><strong><code><div id="x-video-0" class="video-player">
<embed id="video0" src="http://v.wordpress.com/wp-content/plugins/video/flvplayer.swf?ver=1.18&#038;guid=B04BewKm&#038;width=510&#038;height=382&#038;locksize=no&#038;qc_publisherId=p-18-mFEk4J448M" type="application/x-shockwave-flash" width="510" height="382" seamlesstabbing="true" allowfullscreen="true" allowscriptaccess="always" overstretch="true"" title="tangent.ux Silverlight 3 Media Platform"></embed>
</div></code></strong></p>
<p align="right">
<p align="right"><a href="http://www.tangentux.com/">http://www.tangentux.com/</a></p>
<ul>
<li>
<h6>True HD video</h6>
</li>
<li>
<h6>Smooth Streaming</h6>
</li>
<li>
<h6>Go out of browser</h6>
</li>
<li>
<h6>Mac, Windows, and Linux</h6>
</li>
<li>
<h6>Millions of skilled developers to help you</h6>
</li>
<li>
<h6>Seamless Designer-Developer workflow</h6>
</li>
<li>
<h6>Monetize your assets</h6>
</li>
<li>
<h6>Silverlight DRM, Powered by PlayReady</h6>
</li>
<li>
<h6>Compatible with Windows Media DRM 10</h6>
</li>
<li>
<h6>Third Party DRM Providers</h6>
</li>
<li>
<h6>Advertising</h6>
</li>
<li>
<h6>Lower delivery costs</h6>
</li>
<li>
<h6>Internet Information Services (IIS) 7.0 Media Services</h6>
</li>
<li>
<h6>Windows Media Services 2008</h6>
</li>
<li>
<h6>Multicast Support for Silverlight</h6>
</li>
</ul>
<p><a href="http://www.tangentux.com/"></a></p>
<h4>True HD video</h4>
<p>Customers can enjoy 720/1080p true HD-quality video using H.264 (MP4/F4V) or WMV/VC-1. Use your existing Windows Media library or add support for third-party codecs.</p>
<p>Silverlight 3 now supports H.264 natively for playback of MP4 or F4V files. Silverlight also supports Windows Media Video (WMV) 9, which is Microsoft&#8217;s implementation of the Society of Motion Picture and Television Engineers (SMPTE) VC-1 codec standard. In addition to WMA and WMA Pro audio codecs, Silverlight supports MP3 audio and with Silverlight 3 supports MP4 standard AAC audio.</p>
<p>With Silverlight 3 it’s easy to add in support for managed codecs. Developers can deliver non-native Silverlight codecs via an application, and using the new Raw AV pipeline audio or video is then rendered in Silverlight.</p>
<p>Leveraging graphics processor unit (GPU) hardware acceleration, Silverlight experiences can now be delivered in true full-screen HD (720p+). The GPU can be used for windowed or full-screen video scaling enabling smoother playback.</p>
<p>Silverlight&#8217;s support for VC-1 and legacy Windows Media Video formats means that existing WMV content libraries are Silverlight-ready. Video encoded for Silverlight can be simultaneously delivered to other Windows Media compatible players on a variety of platforms and devices.</p>
<h4><a name="smooth"></a>Smooth Streaming</h4>
<p>Extend viewing times using Smooth Streaming. Adjust the quality in real-time based upon the consumer’s changing bandwidth and CPU conditions. Get minimal buffering and quick start-up time using HTTP-based adaptive streaming.</p>
<p>Smooth Streaming is a new extension for Internet Information Services (IIS) 7.0 Media Services, enabling adaptive streaming of media to Silverlight clients via HTTP.</p>
<p>Smooth Streaming dynamically detects and seamlessly switches, in real time, the video quality of a media file that a Silverlight player receives based on local bandwidth and CPU conditions. Consumers with high bandwidth connections can experience HD quality streaming while others with lower bandwidth speeds receive the appropriate stream for their connectivity, allowing consumers across the board to enjoy a compelling, uninterrupted streaming experience which leads to extended audience engagement.</p>
<p>Media companies can boost advertising and subscription revenues by using true HD (720p+) video with uninterrupted delivery to extend viewing times. By using Smooth Streaming, leverage the massive scale of existing HTTP infrastructure. Proprietary streaming networks have much fewer resources than HTTP and network congestion can limit access to popular content.</p>
<p>Live Smooth Streaming (in-beta) also enables PVR-style access and navigation to live video streams. Join events in progress and quickly seek to the beginning, rewind the highlights and enjoy the Silverlight experience in your own way.</p>
<h4><a name="goout"></a>Go out of browser</h4>
<p>Play video whether you are connected via the Web or not. Save content locally for disconnected scenarios and update when you connect.</p>
<h4><a name="macwindow"></a>Mac, Windows, and Linux</h4>
<p>When you create applications for Silverlight you’re actually creating one application that will run equally on Internet Explorer, Firefox and Safari on Windows, Mac and Linux. Silverlight on different platforms and browsers has exactly the same functionality, ensuring the same experience for all your users. Microsoft is working with Novell to offer Silverlight support for the Linux platform. The Mono Project is an open-source initiative hosted at <a href="http://www.mono-project.com/Moonlight">http://www.mono-project.com/Moonlight</a>. This is available for all major Linux distributions. Moonlight 2.0 supports C# and other Dynamic Languages, and includes controls, layout and media.</p>
<h4><a name="millions"></a>Millions of skilled developers to help you</h4>
<p>Tap into the talent pool of six million .NET developers to find the expertise you need. A vibrant ecosystem means it’s easy to find partners and pre-built components.</p>
<h4><a name="seamless"></a>Seamless Designer-Developer workflow</h4>
<p>Accelerate time to market as designers collaborate with developers using the integration between Expression Studio’s creative tools and the Visual Studio family of development tools.</p>
<p>Talk to anyone building interactive applications, and they will tell you about the promise and the frustration of user experience design. Concepts that look great in photo editing tools rarely lend themselves well to actual implementation, while tools that mash together designer and developer disciplines often fall short. In organizations lucky enough to have dedicated designers, they are often forced to spend more time on programming than on actual design. While the integration of developer and designer disciplines is increasing, it is hardly the norm. This is why Microsoft® Expression® Studio was created.</p>
<p>Whether developing applications for the desktop or the Web, the Expression products will allow designers to fully engage with developers to finally bridge the gap in the designer/developer workflow. This will bring together the best minds in design and development to create applications and sites with a focus on great User Experience (UX).</p>
<p>Expression Blend shares project format, XAML, and .NET development with Visual Studio for Designer-Developer workflow; and has added support for Silverlight. This means that the designer can work on the same project as the developer, and thus requires no re-writing of code or use of exporters or clunky add-ins. It also means that developer practices can be applied to the UI mark-up, such as diff’ing and source control.</p>
<h4><a name="monetize"></a>Monetize your assets</h4>
<p>Silverlight offers a choice of content protection techniques for subscriptions: End-user authentication, SSL, Web playlists, Silverlight DRM, and Windows Media DRM.</p>
<p>With the explosive growth in streaming online video and rich internet experiences, it’s critical to ensure your content and your business models are secure. The new peaks in online video audiences not only create a great opportunity to explore new revenue opportunities, but to also expose the challenges in managing and protecting valuable media assets. A variety of content protection schemes, including Digital Rights Management (DRM); end-user authentication and authorization; Web Playlists; and SSL ensure that content owners can fully monetize and protect their media assets.</p>
<h4><a name="drm"></a>Silverlight DRM, Powered by PlayReady</h4>
<p>Silverlight DRM, Powered by PlayReady is a content encryption technology designed and optimized to enable key Silverlight online content distribution scenarios including live streaming, on-demand streaming, progressive download, and adaptive streaming (e.g., IIS7 Smooth Streaming). Unlike simple stream or link encryption technologies (e.g., Adobe’s RTMP/e), Silverlight DRM, encrypts the video and audio in a secure wrapper ensuring content, including advertising, stays protected from server to Silverlight plug-in until it is decompressed during playback.</p>
<p>Silverlight DRM is a small, cross-platform version of the PlayReady client used exclusively by the Silverlight Web browser plug-in. Analogous to other online content services, a Silverlight service that offers protected content uses the PlayReady Server SDK (or alternatively, the WM Rights Manager 10.1 SDK) to first package (encrypt) the Windows Media Audio (WMA) and Windows Media Video (WMV) content. When a consumer then wants to play that content a license is requested and obtained from a license acquisition server that uses the PlayReady Server SDK.</p>
<p>The Silverlight plug-in includes an individualized PlayReady client acquired from an online service, hosted by Microsoft. Individualization binds the run-time client to the computer on which the client was initially installed. Every end-user is given an individualized Playready component and different certified license keys. This significantly reduces the danger of global breaks. If a specific version of a PlayReady client becomes compromised, it can be barred from acquiring licenses for new digital media files unless the latest version of the PlayReady client is downloaded that is robust against the circumvention.</p>
<h4><a name="compatible-drm"></a>Compatible with Windows Media DRM 10</h4>
<p>Silverlight DRM allows content owners to deliver their protected content using either legacy WMDRM10 or new PlayReady encryption. This enables content owners to deliver existing libraries of WMDRM10 content to Silverlight without having to re-encrypt anything and means that the same protected content can be played back in both Silverlight and Windows Media based-clients.</p>
<h4><a name="third-party-drm"></a>Third Party DRM Providers</h4>
<p>With the extensibility and openness of Silverlight, third-parties are able to build content protection solutions, extending customer choice and opening up infrastructure options.</p>
<p>SKY player in Silverlight using Silverlight DRM, Powered by PlayReady</p>
<h4><a name="instream"></a>Advertising</h4>
<p>Silverlight, approved by the Interactive Advertising Bureau (IAB), supports all leading advertising scenarios, including linear pre-rolls, post-rolls, interstitials as well as non-linear tickers, bugs and transparent overlays.</p>
<p>As the market for online advertising continues to grow, the technology powering rich media-based ads needs to be up for the challenge. Complex business needs and creative capabilities demand more than simple animation and basic tagging – which is where Silverlight comes in. Silverlight enables lightning-fast development through familiar markup and controls based on XML that, combined with integrated productivity tools such as Expression Studio and Visual Studio, helps designers and developers work better together and push the limits of interactive innovation.</p>
<p>When designers and developers work together to bring advertising ideas to life, campaigns can be more nimble, more powerful and more effective. Silverlight enables agencies and advertisers to create, launch, measure, and quickly respond to online advertising campaigns through powerful controls and fully integrated tools.</p>
<p>Benefits of Silverlight for Rich Media and In-stream Advertising</p>
<ul>
<li><strong>User Engagement </strong><br />
Silverlight powers the most compelling media experiences on the Web for rich media and in-stream advertising, offering the most effective engagement and conversion opportunities for advertisers</li>
<li><strong>Discoverability </strong><br />
Silverlight is the most discoverable rich media ad platform with superior SEO capabilities</li>
<li><strong>Analytics </strong><br />
Silverlight supports robust and complex online advertising reporting and analytics to enable effective campaign response and measurement</li>
</ul>
<p>Online campaigns created with Silverlight can be more engaging, discoverable, and accountable than with other technologies</p>
<h4>Lower delivery costs</h4>
<p>Leverage existing HTTP infrastructure and improve delivery over proprietary streaming servers. Use multicast for Intranet-based executive broadcasts and online training.</p>
<p>Windows Server helps content providers realize new levels of reliability and scalability, all with lower-cost content delivery. Windows Server represents a significant competitive edge when delivering streaming media and/or applications cross-platform and cross-device, and is already in use by most major broadcasters around the world. Windows Server now powers HTTP-based adaptive streaming via Smooth Streaming.</p>
<h4><a name="iis"></a>Internet Information Services (IIS) 7.0 Media Services</h4>
<p>IIS Media Services is the new name (previously IIS Media Pack) for the media-relevant extensions for IIS. With IIS Media Services, Microsoft is offering an integrated media delivery platform for customers interested in delivering media over HTTP-based adaptive streaming, a new hybrid technique for content delivery. IIS Media Services provides an easy to deploy and manage set of capabilities for companies interested in taking advantage of the inherent scale and availability advantages that come with using standards-based HTTP as a media delivery protocol.</p>
<p>IIS Media Services provides the fundamental features of a proprietary streaming solution: bit rate throttling, secure playlists and logging capabilities that are required for cost effectively delivering, measuring and monetizing media content. On top of these basic media delivery features, IIS Media Services offers enhanced media delivery capabilities such as on-demand and live adaptive streaming (Smooth Streaming) which makes true HD (720p+) media experiences practical as well as real-time logging and analytics capabilities for measuring and maximizing return on your media investment.</p>
<h4><a name="wms"></a>Windows Media Services 2008</h4>
<p>Windows Media Services, like all of Windows Server 2008, is significantly more secure, reliable, and robust — and it is already considered by many customers to be the best in the market for live and n-demand streaming delivery using “traditional” streaming. The latest improvements provide twice the scalability over Windows Media Services 9.0.</p>
<p>In addition to its proven scalability and reliability, Windows Media Services now supports a Server Core installation, enabling reduced footprints for fixed-function streaming server scenarios, offering embedded appliance-like performance. Additionally, a cache/proxy plug-in is built in, making it easier to configure WMS for edge network enterprise and Internet topologies. Many features of Windows Media Services that were previously available only on Windows Server Enterprise and Datacenter are now available on Windows Server Standard, and all Standard features are now also available on Windows Web Server 2008. This makes the power of Windows Media Services 2008 available to a broader set of users at a lower cost.</p>
<h4><a name="multicast"></a>Multicast Support for Silverlight</h4>
<p>Windows Media Services, together with Silverlight and a third-party open-source plug-in from QUMU, can support multicast-enabled scenarios for executive broadcasts and training scenarios behind the firewall.</p>
<br />Posted in Adobe Video Formats, Art and Animation, C# 3.0 Enhancements, Digital Media, HD Video, Industry News, Live Smooth Streaming, PlugIns &amp; Extensibility (MEF), SilverLight, silverlight 3, Smooth Streaming, Software Design, Software Futures, Technology, Tips and Tricks Tagged: acceleration, acquisition, adaptive, adobe, advantage, agencies, Analytics, animation, audiences, Audio, authentication, authorization, bandwidth, Blend, bridge, broadcasters, browser, Bureau, code, codecs, Compatible, component, components, computer, congestion, conversion, cost, Datacenter, demo, Developers, development, Digital, distribution, ecosystem, Encoder, encryption, Expression, extensions, features, Individualization, innovation, Integration, Learn, leverage, libraries, Live, Management, Manager, measurement, Microsoft, Migration, Monetize, Mono, Motion, Motor, Movie, Multicast, navigation, needs, norm, Novell, Online, options, organizations, Overview, owners, Pack, partners, performance, photo, Picture, pipeline, platforms, Play, playback, player, players, Playlists, PlayReady, processor, Providers, QUMU, RTMP, scenarios, Services, Smooth, SMPTE, Standard, Studio, subscriptions, Support, supports, talent, technique, techniques, technologies, Technology, Television, template, templates, tools, Toyota, Trailer, Video, Visual, XAML <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dcarr.wordpress.com/1472/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dcarr.wordpress.com/1472/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dcarr.wordpress.com/1472/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dcarr.wordpress.com/1472/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dcarr.wordpress.com/1472/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dcarr.wordpress.com/1472/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dcarr.wordpress.com/1472/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dcarr.wordpress.com/1472/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dcarr.wordpress.com/1472/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dcarr.wordpress.com/1472/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=1472&subd=dcarr&ref=&feed=1" /><div><a href="http://team.pushbomb.com/2009/07/24/silverlight_3_digital_media_complete_information_media_platform/"><img alt="tangent.ux Silverlight 3 Media Platform" src="http://cdn.videos.wordpress.com/B04BewKm/silverlightmedia_std.original.jpg" width="160" height="120" /></a></div>]]></content:encoded>
			<wfw:commentRss>http://team.pushbomb.com/2009/07/24/silverlight_3_digital_media_complete_information_media_platform/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	<enclosure url="http://cdn.videos.wordpress.com/B04BewKm/silverlightmedia_std.mp4" length="9577472" type="video/mp4" />

		<media:content url="http://1.gravatar.com/avatar/7b572cbcda5a17fe984e7dd1ddc9c3d6?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">pushbomb</media:title>
		</media:content>

		<media:group>
			<media:content url="http://cdn.videos.wordpress.com/B04BewKm/silverlightmedia_std.mp4" fileSize="9577472" type="video/mp4" medium="video" isDefault="true" duration="94" width="400" height="300" />

			<media:content url="http://cdn.videos.wordpress.com/B04BewKm/silverlightmedia_fmt1.ogv" fileSize="9577472" type="video/ogg" medium="video" isDefault="false" duration="94" width="400" height="300" />

			<media:rating scheme="urn:mpaa">g</media:rating>
			<media:title type="plain">tangent.ux Silverlight 3 Media Platform</media:title>
			<media:description type="plain">Watch the power of deep zoom when combined with the most demanding video. Normally you&#039;d be waiting and waiting. Finally now this is delivered at the speed of thought via the cloud (we support Amazon , Google, Azure, etc.)</media:description>
			<media:thumbnail url="http://cdn.videos.wordpress.com/B04BewKm/silverlightmedia_std.original.jpg" width="256" height="192" />
			<media:player url="http://v.wordpress.com/B04BewKm" width="400" height="300" />
		</media:group>
	</item>
		<item>
		<title>JetBrains Resharper 4.5 is out</title>
		<link>http://team.pushbomb.com/2009/04/16/resharper_4_5_rocks_for_dot_net_c_sharp_silverlight_devs/</link>
		<comments>http://team.pushbomb.com/2009/04/16/resharper_4_5_rocks_for_dot_net_c_sharp_silverlight_devs/#comments</comments>
		<pubDate>Fri, 17 Apr 2009 02:12:43 +0000</pubDate>
		<dc:creator>Damon Wilder Carr</dc:creator>
				<category><![CDATA[C# 3.0 Enhancements]]></category>
		<category><![CDATA[C# 3.0 for Internal DSL]]></category>
		<category><![CDATA[Cannot live Without]]></category>
		<category><![CDATA[Functional Programming]]></category>
		<category><![CDATA[Industry News]]></category>
		<category><![CDATA[Linq]]></category>
		<category><![CDATA[Siverlight]]></category>
		<category><![CDATA[Software Design]]></category>
		<category><![CDATA[Software Futures]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Tips and Tricks]]></category>
		<category><![CDATA[Visual Studio 2010]]></category>
		<category><![CDATA[Windows Presentation Foundation]]></category>
		<category><![CDATA[concepts implemented]]></category>
		<category><![CDATA[resharper]]></category>
		<category><![CDATA[software as strategic]]></category>
		<category><![CDATA[.NET 3.5. software craftsman]]></category>
		<category><![CDATA[best addin]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Must-Have]]></category>
		<category><![CDATA[Refactoring]]></category>
		<category><![CDATA[Resharper]]></category>
		<category><![CDATA[SilverLight]]></category>
		<category><![CDATA[Visual Studio 2008]]></category>

		<guid isPermaLink="false">http://dcarr.wordpress.com/2009/04/16/resharper_4_5_rocks_for_dot_net_c_sharp_silverlight_devs/</guid>
		<description><![CDATA[9 our of 10 studies prove: Resharper make your your hair grow back, your dog come home (yes even if he died), your wife will love you again and your kids will listen to you.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=1339&subd=dcarr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p align="center">&#160;</p>
<p align="center"><a href="http://www.domaindotnet.com/resharper/whatsnew45.html" target="_blank">Click Here</a> to Watch What’s New </p>
<h5>9 our of 10 studies prove: Resharper make your your hair grow back, your dog come home (yes even if he died), your wife will love you again and your kids will listen to you.</h5>
<p>OK perhaps it is not a country music song played backwards. </p>
<blockquote><p>BUT your nuts to even think about wasting all that time not using it. For someone who knows it is people not tools that always win, this is my only exception in 20 years that I will stand behind.</p>
</blockquote>
<p>&#160;</p>
<p>Why stare at a keyboard for hours wondering how to navigate a nasty tangled refactoring you know you must do when you can do the right thing AND make the 5:30 train.</p>
<p>Me? I hit the shift-ctrl-space repeatedly and am shocked when nothing happens. Then I install it and life is good again.</p>
<h4>ReSharper 4.5 Released</h4>
<p>April 8, 2009</p>
<h6>In This Issue</h6>
<p><a href="http://www.jetbrains.com/news/dotnet/news.html#rs45Intro">Introduction</a>     <br /><a href="http://www.jetbrains.com/news/dotnet/news.html#rs45-1">Performance and Memory Usage Improvements</a>     <br /><a href="http://www.jetbrains.com/news/dotnet/news.html#rs45-2">Solution-Wide Code Inspections</a></p>
<p><a href="http://www.jetbrains.com/news/dotnet/news.html#rs45-3">VB9 Support</a>     <br /><a href="http://www.jetbrains.com/news/dotnet/news.html#rs45-4">Extended Naming Style Configuration</a>     <br /><a href="http://www.jetbrains.com/news/dotnet/news.html#rs45-5">Other Enhancements</a></p>
<h5>Introduction</h5>
<p><b>ReSharper 4.5</b> is finally out, so your next productivity upgrade is just a mouse click away!</p>
<p>As announced, the new version features major improvements in performance and memory usage. After all, what is a productivity tool for if not for being agile, robust and responsive?</p>
<p>In addition to focusing on performance enhancements, we also added a number of intelligence features and improvements.</p>
<p>We&#8217;ve prepared a short <a href="http://www.jetbrains.com/resharper/documentation/presentation/rs45/whatsnew-rs45.html">Flash movie</a> to introduce the new features in ReSharper 4.5. Get the hang of things in just a few minutes! </p>
<p>For users of older versions we have a ReSharper 3.0 vs. ReSharper 4.5 <a href="http://www.jetbrains.com/resharper/features/resharper3_vs_resharper45.html">Comparison matrix</a>. <a href="http://dcarr.files.wordpress.com/2009/04/image.png"><img style="display:inline;border-width:0;margin:2px 0;" title="image" border="0" alt="image" align="right" src="http://dcarr.files.wordpress.com/2009/04/image-thumb.png?w=243&#038;h=244" width="243" height="244" /></a></p>
<p>However, if you believe a thousand words say more than a picture does, or even a movie, go ahead and read the descriptions below :)</p>
<p>&#160;</p>
<p>&#160;</p>
<p>&#160;</p>
<p>&#160;</p>
<p>&#160;</p>
<p>&#160;</p>
<p align="right"><strong>Alex Morozov      <br /></strong>NET product marketing manager&#160; <br />JetBrains</p>
<h5>Performance and Memory Usage Improvements</h5>
<p>We have managed to make ReSharper load and work faster and more smoothly in general, particularly on big (and we mean BIG) solutions:</p>
<ul>
<li>Wall-time measurements of solution loading show 20 to 40 percent acceleration until the solution is ready for code editing. </li>
<li>Web site loading time has also been reduced by a third. </li>
<li>For instance, a certain mixed-language solution consisting of about 15 thousand classes now takes only 70 seconds to load, and this includes making every ReSharper feature available. </li>
</ul>
<p>The list of significantly accelerated operations includes:</p>
<ul>
<li>renaming symbols </li>
<li>finding commonly used symbols </li>
<li>creating symbols from usage </li>
<li>analyzing large XAML files. </li>
</ul>
<p>We&#8217;ve also cut down the volume of memory resources required to analyze jumbo autogenerated code files, which should especially benefit those who work with ASP.NET and LINQ to SQL. </p>
<h5>Solution-Wide Code Inspections</h5>
<p>To enable you to detect unused non-private members on the fly, we have enlisted the help of our ever-improving solution-wide analysis. We have introduced a set of specialized code inspections that only work when you let ReSharper analyze your whole solution. They help you discover:</p>
<ul>
<li>Unused non-private declarations </li>
<li>Unused return values of non-private methods </li>
<li>Unaccessed non-private fields </li>
<li>Unused parameters in non-private members </li>
<li>Abstract or virtual events that are never invoked </li>
<li>Unassigned fields </li>
<li>Members and types that can be made internal instead of public </li>
</ul>
<p>Look for these inspections in your code and on the Marker Bar, highlighted as warnings or suggestions. In addition, new code annotations are available that you can use to mark certain unused non-private types and members to prevent ReSharper from fussing about them.</p>
<h5>VB9 Support – We can forgive this transgression (Damon)</h5>
<p> Visual Basic .NET developers can now benefit from VB9 language support that includes implicitly typed local variables, object initializers, anonymous types, extension methods, lambda expressions, partial methods, and embedded XML. VB9 support is all around you, courtesy of new context actions, code completion, refactorings, and Parameter Info, among other supporting features.<br />
<h5>Extended Naming Style Configuration</h5>
<p>Now you can define custom naming style settings for different languages and symbols including:</p>
<ul>
<li>types </li>
<li>namespaces </li>
<li>interfaces </li>
<li>parameters </li>
<li>method properties and events </li>
<li>static and instance fields, etc. </li>
</ul>
<p>For every kind of symbol, you can configure one of five casing options, prefixes and suffixes, variations for different access rights, abbreviations to preserve, or enable naming inspections. As a result, you can precisely align the way ReSharper completes and generates code with your specific coding guidelines.</p>
<h5>Other Enhancements</h5>
<ul>
<li><b>Go to Implementation</b> &#8211; This new navigation feature lets you jump from usage of a base type or member to any of its end implementations, bypassing intermediate steps in the inheritance chain. </li>
<li><b>New and Improved Refactorings</b> &#8211; ReSharper 4.5 has added Inline Field to its family of Inline refactorings. Rename refactoring now provides name completion, and some of the other refactorings were thoroughly refactored themselves, to make them perform faster. </li>
<li><b>Native MSTest Support</b> &#8211; Initially available through VstsUnit Plugin and then Gallio, MSTest support has finally made its way to being provided natively in ReSharper, on par with nUnit. </li>
<li><b>Wider Cross-Language Capabilities</b> &#8211; Quick-fixes and context actions work better in many cross-language scenarios: for example, you can extend a control written in VB.NET+XAML by choosing &quot;create from usage&quot; right from a C# usage. Add increased coverage for XAML and ASP.NET, and you get a substantial package of improvements. </li>
<li><b>Smoother Language and Framework Support</b> &#8211; Following the tradition of ReSharper 4.1, we have improved compatibility with F#, Compact Framework, Silverlight 2, and other languages and tools. </li>
</ul>
<p>Grab your all-new productivity &#8211; download ReSharper 4.5 now at <a href="http://www.jetbrains.com/resharper/download/index.html">http://www.jetbrains.com/resharper/download</a>. </p>
<p>ReSharper 4.5 is provided as a free upgrade from ReSharper 4.0. If you own an older version, please contact us to check your upgrade availability at <a href="mailto:sales@jetbrains.com">sales@jetbrains.com</a>. </p>
<p>&#160;</p>
<h4>JetBrains Team</h4>
<ul>
<li>
<p><a href="http://www.jetbrains.com/company/people/Anchipolevsky_Sergey.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Sergey_Anchipolevsky_small.gif" />Sergey           <br />Anchipolevsky</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Alshannikov_Igor.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Alshannikov_Igor_small.gif" />Igor           <br />Alshannikov</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Anisimov_Alexander.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Anisimov_Alexander_small.gif" />Alexander           <br />Anisimov</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Avdeev_Dmitry.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Avdeev_Dmitry_small.gif" />Dmitry           <br />Avdeev</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Baranov_Sergey.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Sergey_Baranov_small.gif" />Sergey           <br />Baranov</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Belyaev_Yury.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Yury_Belyaev_small.gif" />Yury           <br />Belyaev</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Belyaeva_Natalia.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Natalia_Belyaeva_small.gif" />Natalia           <br />Belyaeva</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Bukreeva_Elena.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Bukreeva_Elena_small.gif" />Elena           <br />Bukreeva</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Bulenkov_Konstantin.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Bulenkov_Konstantin_small.gif" />Bulenkov           <br />Konstantin</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Charif_Jana.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Jana_Charif_small.gif" />Jana           <br />Charif</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Chashnikov_Nikolay.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Nikolay_Chashnikov_small.gif" />Nikolay           <br />Chashnikov</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Alexander_Chernikov.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/soon.gif" />Alexander           <br />Chernikov</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Chernyatchik_Roman.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Roman_Chernyatchik_small.gif" />Roman           <br />Chernyatchik</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Coox_Sergey.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Coox_Sergey_small.gif" />Sergey           <br />Coox</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Dmitriev_Sergey.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Sergey_Dmitriev_small.gif" />Sergey           <br />Dmitriev</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Dumov_Ilia.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Ilia_Dumov_small.gif" />Ilia           <br />Dumov</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Falk_Kirill.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Kirill_Falk_small.gif" />Kirill           <br />Falk</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Gerasimov_Michael.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Michael_Gerasimov_small.gif" />Michael           <br />Gerasimov</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Golovachev_Sergey.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Sergey_Golovachev_small.gif" />Sergey           <br />Golovachev</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Gopachenko_Alexey.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Alexey_Gopachenko_small.gif" />Alexey           <br />Gopachenko</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Gromov_Peter.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Gromov_Peter_small.gif" />Peter           <br />Gromov</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Michaela_Hroncova.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Michaela_Hroncova_small.gif" />Michaela           <br />Hroncová</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Jemerov_Dmitry.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Dmitry_Jemerov_small.gif" />Dmitry           <br />Jemerov</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Khalusova_Maria.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Khalusova_Maria_small.gif" />Maria           <br />Khalusova</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Kipiatkov_Valentin.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Valentin_Kipiatkov_small.gif" />Valentin           <br />Kipiatkov</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Konopko_Cyril.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Konopko_Kirill_small.gif" />Cyril           <br />Konopko</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Kozlova_Anna.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/soon.gif" />Anna           <br />Kozlova</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Kropotov_Mikhail.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Mikhail_Kropotov_small.gif" />Mikhail           <br />Kropotov</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Kudelevsky_Eugene.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Kudelevsky_Eugene_small.gif" />Eugene           <br />Kudelevsky</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Kudravtsev_Alexey.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Alexey_Kudravtsev_small.gif" />Alexey           <br />Kudravtsev</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Lobacheva_Olga.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Lobacheva_Olga_small.gif" />Olga           <br />Lobacheva</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Lukianov_Vyacheslav.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Vyacheslav_Lukianov_small.gif" />Vyacheslav           <br />Lukianov</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Makeev_Anton.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Anton_Makeev_small.gif" />Anton           <br />Makeev</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Malishev_Egor.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Malishev_Egor_small.gif" />Egor           <br />Malyshev</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Marakulina_Maria.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Maria_Marakulina_small.gif" />Maria           <br />Marakulina</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Maximov_Kirill.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Kirill_Maximov_small.gif" />Kirill           <br />Maximov</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Maximova_Sasha.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Sasha_Maximova_small.gif" />Sasha           <br />Maximova</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Megorskaya_Irina.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/soon.gif" />Irina           <br />Megorskaya</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Morawiecova_Lucie.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Morawiecova_Lucie_small.gif" />Lucie           <br />Morawiecova</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Morozov_Alexander.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Morozov_Alexander_small.gif" />Alexander           <br />Morozov</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Mossienko_Maxim.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Mossienko_Maxim_small.gif" />Maxim           <br />Mossienko</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Musienko_Ekaterina.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Musienko_Ekaterina_small.gif" />Ekaterina           <br />Musienko</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Oreshnikova_Ann.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Ann_Oreshnikova_small.gif" />Ann           <br />Oreshnikova</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Pasynkov_Eugene.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Eugene_Pasynkov_small.gif" />Eugene           <br />Pasynkov</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Pech_Vaclav.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Vaclav_Pech_small.gif" />Vaclav           <br />Pech</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Pegov_Alexey.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Alexey_Pegov_small.gif" />Alexey           <br />Pegov</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Petrenko_Eugene.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Petrenko_Eugene_small.gif" />Eugene           <br />Petrenko</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Petrovskaya_Irina.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Irina_Petrovskaya_small.gif" />Irina           <br />Petrovskaya</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Pilin_Mikhail.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Mikhail_Pilin_small.gif" />Mikhail           <br />Pilin</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Repina_Julia.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Julia_Repina_small.gif" />Julia           <br />Repina</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Revyakina_Elizaveta.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Elizaveta_Revyakina_small.gif" />Elizaveta           <br />Revyakina</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Ryzhenkov_Ilya.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Ryzhenkov_Ilya_small.gif" />Ilya           <br />Ryzhenkov</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Serebryansky_Andrew.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Serebryansky_Andrew_small.gif" />Andrew           <br />Serebryansky</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Sergey_Ilya.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Sergey_Ilya_small.gif" />Ilya           <br />Sergey</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Shafirov_Maxim.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Maxim_Shafirov_small.gif" />Maxim           <br />Shafirov</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Slavina_Tatiana.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Tatiana_Slavina_small.gif" />Tatiana           <br />Slavina</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Smirnova_Olesya.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Olesya_Smirnova_small.gif" />Olesya           <br />Smirnova</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Solomatov_Konstantin.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Konstantin_Solomatov_small.gif" />Konstantin           <br />Solomatov</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Stepanov_Oleg.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Oleg_Stepanov_small.gif" />Oleg           <br />Stepanov</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Sher_Pavel.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Sher_Pavel_small.gif" />Pavel           <br />Sher</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Shliakhovetskaja_Ekaterina.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Shliakhovetskaja_Ekaterina_small.gif" />Ekaterina           <br />Shliakhovetskaja</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Shpynov_Oleg.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Shpynov_Oleg_small.gif" />Oleg           <br />Shpynov</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Shrago_Gregory.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Shrago_Gregory_small.gif" />Gregory           <br />Shrago</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Toporov_Eugene.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Eugene_Toporov_small.gif" />Eugene           <br />Toporov</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Udov_George.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Udov_George_small.gif" />George           <br />Udov</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Vasiliev_Sergey.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Sergey_Vasiliev_small.gif" />Sergey           <br />Vasiliev</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Yaremych_Natalie.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Natalie_Yaremych_small.gif" />Natalie           <br />Yaremych</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Yarko_Yegor.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Yarko_Yegor_small.gif" />Yegor           <br />Yarko</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Zambalayev_Timur.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Zambalayev_Timur_small.gif" />Timur           <br />Zambalayev</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Zhukov_Sergey.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Sergey_Zhukov_small.gif" />Sergey           <br />Zhukov</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Zhuravlev_Eugene.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Eugene_Zhuravlev_small.gif" />Eugene           <br />Zhuravlev</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Alexander_Zverev.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Alexander_Zverev_small.gif" />Alexander           <br />Zverev</a></p>
</li>
</ul>
<div class="wlWriterHeaderFooter" style="text-align:right;margin:0;padding:4px 0;"><a href="http://digg.com/submit?url=http%3a%2f%2fdcarr.wordpress.com%2f2009%2f04%2f16%2fresharper_4_5_rocks_for_dot_net_c_sharp_silverlight_devs%2f&amp;title=JetBrains+Resharper+4.5+is+out"><img src="http://digg.com/img/badges/100x20-digg-button.png" width="100" height="20" alt="Digg This" title="Digg This" border="0" style="border:0;" /></a></div>
<br />Posted in C# 3.0 Enhancements, C# 3.0 for Internal DSL, Cannot live Without, concepts implemented, Functional Programming, Industry News, Linq, resharper, Siverlight, software as strategic, Software Design, Software Futures, Technology, Tips and Tricks, Visual Studio 2010, Windows Presentation Foundation Tagged: .NET 3.5. software craftsman, best addin, C#, Must-Have, Refactoring, Resharper, SilverLight, Visual Studio 2008 <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dcarr.wordpress.com/1339/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dcarr.wordpress.com/1339/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dcarr.wordpress.com/1339/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dcarr.wordpress.com/1339/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dcarr.wordpress.com/1339/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dcarr.wordpress.com/1339/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dcarr.wordpress.com/1339/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dcarr.wordpress.com/1339/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dcarr.wordpress.com/1339/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dcarr.wordpress.com/1339/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=1339&subd=dcarr&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://team.pushbomb.com/2009/04/16/resharper_4_5_rocks_for_dot_net_c_sharp_silverlight_devs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7b572cbcda5a17fe984e7dd1ddc9c3d6?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">pushbomb</media:title>
		</media:content>

		<media:content url="http://dcarr.files.wordpress.com/2009/04/image-thumb.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Sergey_Anchipolevsky_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Alshannikov_Igor_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Anisimov_Alexander_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Avdeev_Dmitry_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Sergey_Baranov_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Yury_Belyaev_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Natalia_Belyaeva_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Bukreeva_Elena_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Bulenkov_Konstantin_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Jana_Charif_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Nikolay_Chashnikov_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/soon.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Roman_Chernyatchik_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Coox_Sergey_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Sergey_Dmitriev_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Ilia_Dumov_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Kirill_Falk_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Michael_Gerasimov_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Sergey_Golovachev_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Alexey_Gopachenko_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Gromov_Peter_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Michaela_Hroncova_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Dmitry_Jemerov_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Khalusova_Maria_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Valentin_Kipiatkov_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Konopko_Kirill_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/soon.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Mikhail_Kropotov_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Kudelevsky_Eugene_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Alexey_Kudravtsev_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Lobacheva_Olga_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Vyacheslav_Lukianov_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Anton_Makeev_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Malishev_Egor_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Maria_Marakulina_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Kirill_Maximov_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Sasha_Maximova_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/soon.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Morawiecova_Lucie_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Morozov_Alexander_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Mossienko_Maxim_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Musienko_Ekaterina_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Ann_Oreshnikova_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Eugene_Pasynkov_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Vaclav_Pech_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Alexey_Pegov_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Petrenko_Eugene_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Irina_Petrovskaya_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Mikhail_Pilin_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Julia_Repina_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Elizaveta_Revyakina_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Ryzhenkov_Ilya_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Serebryansky_Andrew_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Sergey_Ilya_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Maxim_Shafirov_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Tatiana_Slavina_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Olesya_Smirnova_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Konstantin_Solomatov_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Oleg_Stepanov_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Sher_Pavel_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Shliakhovetskaja_Ekaterina_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Shpynov_Oleg_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Shrago_Gregory_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Eugene_Toporov_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Udov_George_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Sergey_Vasiliev_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Natalie_Yaremych_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Yarko_Yegor_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Zambalayev_Timur_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Sergey_Zhukov_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Eugene_Zhuravlev_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Alexander_Zverev_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://digg.com/img/badges/100x20-digg-button.png" medium="image">
			<media:title type="html">Digg This</media:title>
		</media:content>
	</item>
		<item>
		<title>Martin Fowler and the .NET Developer Mandate for Oslo</title>
		<link>http://team.pushbomb.com/2009/02/21/oslo_dot_net_developer_domain_specific_language_mandate/</link>
		<comments>http://team.pushbomb.com/2009/02/21/oslo_dot_net_developer_domain_specific_language_mandate/#comments</comments>
		<pubDate>Sat, 21 Feb 2009 22:34:24 +0000</pubDate>
		<dc:creator>Damon Wilder Carr</dc:creator>
				<category><![CDATA[C# 3.0 Enhancements]]></category>
		<category><![CDATA[C# 3.0 for Internal DSL]]></category>
		<category><![CDATA[Domain Specific Languages]]></category>
		<category><![CDATA[Oslo]]></category>
		<category><![CDATA[Visual Studio 2010]]></category>
		<category><![CDATA[software as strategic]]></category>

		<guid isPermaLink="false">http://dcarr.wordpress.com/2009/02/21/oslo_dot_net_developer_domain_specific_language_mandate/</guid>
		<description><![CDATA[All roads for the software developer lead to another acronym. DSLs are for real (indeed you already use a few).<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=1302&subd=dcarr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fblog.domaindotnet.com%2f2009%2f02%2f21%2foslo_dot_net_developer_domain_specific_language_mandate%2f"><img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fblog.domaindotnet.com%2f2009%2f02%2f21%2foslo_dot_net_developer_domain_specific_language_mandate%2f" border="0" alt="kick it on DotNetKicks.com" /></a></p>
<p>As long time advocates of domain-driven practice it should be no surprise that we prefer ‘<a href="http://en.wikipedia.org/wiki/Domain_Specific_Language" target="_blank">Domain Specific Language</a>’ approaches.</p>
<p>Of course now it seems obvious to everyone that these are the future. Sure there were many bumps in the road, but it is not even an interesting debate about ‘if’.</p>
<p>This article is so good from Martin Fowler we had to repost:</p>
<h6>TIP: .NET Developer? Start learning the Oslo set of technologies, especially&#8217; all things ‘M’. We pay tribute to ‘M’ in our demo Silverlight cube on Silverlight.net showcase.</h6>
<p><a href="http://www.martinfowler.com"><img style="display:inline;margin:0;" src="http://www.martinfowler.com/mflogo.gif" alt="martinfowler.com logo" align="right" /></a></p>
<p><a href="DslMigration.html">DslMigration</a><br />
<a href="dsl.html">dsl</a><br />
<strong>4 February 2009</strong><br />
<a href="http://technorati.com/search/http://martinfowler.com/bliki/DslMigration.html">Reactions</a></p>
<p>One danger that DSL advocates need to guard against is the notion that first you design a DSL, then people use it. Like any other deice of software, a successful DSL will evolve. This means that scripts written in an earlier version of a DSL may fail when run with a later version.</p>
<p>Like many properties of DSL, good and bad, this is really very much the same as happens with a library. If you take a library from a someone and they upgrade the library, you may end up stuck. In essence DSLs don&#8217;t really do anything to change that. Your DSL definition is essentially a <a href="PublishedInterface.html">PublishedInterface</a> and you have to deal with the consequences just the same.</p>
<p>This problem can be more prominent with external DSLs. Many changes to an internal DSL can be handled through refactoring tools (for those languages that have them). But refactoring tools won&#8217;t help with an external DSL. In practice this problem is less of an issue than it might be. An internal DSL with scripts that are outside the control of the DSL implementers won&#8217;t be picked up with refactoring. So the only difference between internal and external lies with DSL scripts within the same code base.</p>
<p>One technique for handling evolution of DSLs is to provide tools that automatically migrate a DSL from one version to another. These can be run either during an upgrade, or automatically should you try to run an old version script against a new version.</p>
<p>There are two broad ways to handle migration. The first is an <strong>incremental migration</strong> strategy. This is essentially the same notion that&#8217;s used by people doing <a href="http://martinfowler.com/articles/evodb.html">evolutionary database design</a>. For every change you do to your DSL definition, create a migration program that automatically migrates DSL scripts from the old version to the new version.</p>
<p>An important part of incremental migration is that you keep the changes as small as you can. Imagine you are upgrading from version 1 to 2, and have ten changes you want to make to your DSL definition. In this case, don&#8217;t create just one migration script to migrate from version 1 to 2, instead create at least 10 scripts. Change the DSL definition one feature at a time, and write a migration script for each change. You may find it useful to break it down even more and add a feature with more than one step (and thus more than one migration). They way I&#8217;ve described it may sound like more work than a single script, but the point is that migrations are much easier to write if they are small, and it&#8217;s easy to chain multiple migrations together. As a result you&#8217;ll be much faster writing ten scripts than one.</p>
<p>The other approach is <strong>model-based migration</strong>. This is a tactic you can use if you are using a <a href="http://martinfowler.com/dslwip/SemanticModel.html">Semantic Model</a> (which is something I almost always recommend). With this approach you support multiple parsers for your language, one for each released version. (So you only do this for version 1 and 2, not for the intermediate steps.) Each parser populates the semantic model. When you use a semantic model, the parser&#8217;s behavior is pretty simple, so it&#8217;s not too much trouble to have several of them around. You then run the appropriate parser for the version of script you are working with. This handles multiple versions, but doesn&#8217;t migrate the scripts. To do the migration you write a generator from the semantic model that generates a DSL script representation. This way you can run the parser for a version 1 script, populate the semantic model, and then emit a version 2 script from the generator.</p>
<p>One problem with the model-based approach is that it&#8217;s easy to lose stuff that doesn&#8217;t matter to the semantics, but is something that the script writers want to keep. Comments are the obvious example. This is exacerbated if there&#8217;s too much smarts in the parser, but then the need to migrate this way may help encourage the parsers to stay dumb &#8211; which is Good Thing.</p>
<p>If the change to the DSL is big enough, you may not be able to transform a version 1 script into a version 2 semantic model. In which case you may need to keep a version 1 model (or intermediate model) around and give it the ability to emit a version 2 script.</p>
<p>I don&#8217;t have a strong preference between these two alternatives.</p>
<p>Migration scripts can be run by script programmers themselves when needed, or automatically by the DSL system. In order to run automatically it&#8217;s very useful to have the script record which version of the DSL it is so the parser can detect it easily and trigger the resulting migrations.</p>
<li><a href="http://msdn.com/oslo">Microsoft&#8217;s Codename Oslo</a></li>
<li><a href="http://msdn.microsoft.com/en-us/library/bb126235.aspx">Microsoft Visual Studio 2008: Domain-Specific Language Tools</a></li>
<li><a href="http://lambda-the-ultimate.org/taxonomy/term/24">Domain-specific language links from Lambda the Ultimate</a></li>
<li><a href="http://www.faqs.org/docs/artu/minilanguageschapter.html">Eric S. Raymond on minilanguages</a> (from <a href="http://en.wikipedia.org/wiki/The_Art_of_Unix_Programming">The Art of Unix Programming</a>)</li>
<li><a href="http://martinfowler.com/bliki/DomainSpecificLanguage.html">Martin Fowler on domain-specific languages</a> and <a href="http://www.martinfowler.com/articles/languageWorkbench.html">Language Workbenches</a>. Also in <a href="http://www.infoq.com/presentations/domain-specific-languages">a video presentation</a></li>
<li><a href="http://homepages.cwi.nl/~arie/papers/dslbib/">Domain-Specific Languages: An Annotated Bibliography</a></li>
<li><a href="http://www.venge.net/graydon/talks/mkc/html/index.html">One Day Compilers: Building a small domain-specific language using OCaml</a></li>
<li><a href="http://www.usenix.org/publications/library/proceedings/dsl97">Usenix Association: Conference on Domain-Specific Languages (DSL &#8216;97)</a> and <a href="http://www.usenix.org/publications/library/proceedings/dsl99">2nd Conference on Domain-Specific Languages (DSL &#8216;99)</a></li>
<li><a href="http://www.softwaresecretweapons.com/jspwiki/Wiki.jsp?page=BuildVarietyOfConsumerProductsAtLowCostUsingGenerativeProgramming">Feature Models for Generative Programming and DSL</a></li>
<li><a href="http://fragmental.tw/research-on-dsls/domain-specific-languages-dsls/internal-dsls/">Internal Domain-Specific Languages</a></li>
<li>Article <a href="http://www.theserverside.com/tt/articles/article.tss?l=PragmaticGen">External DSLs with Eclipse technology</a></li>
<li>Article <a href="http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.50.4685">Building Domain-Specific Languages over a Language Framework</a></li>
<li>Article <a href="http://www.acceleo.org/pages/using-acceleo-with-gmf/">Using Acceleo with GMF : Generating presentations from a MindMap DSL modeler</a></li>
<li>Article <a href="http://www.methodsandtools.com/archive/archive.php?id=71">UML vs. Domain-Specific Languages</a></li>
<li>Book <a href="http://www.pragmaticprogrammer.com/titles/tpantlr/index.html">The Definitive ANTLR Reference Building Domain-Specific Languages</a></li>
<div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:d697368d-f832-4c3e-af8d-ebe2432bbb1d" class="wlWriterEditableSmartContent" style="display:inline;float:none;margin:0;padding:0;">Technorati Tags: <a rel="tag" href="http://technorati.com/tags/oslo">oslo</a>,<a rel="tag" href="http://technorati.com/tags/DSL">DSL</a>,<a rel="tag" href="http://technorati.com/tags/Fowler">Fowler</a>,<a rel="tag" href="http://technorati.com/tags/C%23">C#</a>,<a rel="tag" href="http://technorati.com/tags/M">M</a></div>
<h3><a href="http://msdn.microsoft.com/en-us/library/dd129873.aspx" target="_blank">Microsoft &#8220;Oslo&#8221; Frequently Asked Questions</a></h3>
<br />Posted in C# 3.0 Enhancements, C# 3.0 for Internal DSL, Domain Specific Languages, Oslo, software as strategic, Visual Studio 2010  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dcarr.wordpress.com/1302/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dcarr.wordpress.com/1302/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dcarr.wordpress.com/1302/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dcarr.wordpress.com/1302/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dcarr.wordpress.com/1302/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dcarr.wordpress.com/1302/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dcarr.wordpress.com/1302/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dcarr.wordpress.com/1302/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dcarr.wordpress.com/1302/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dcarr.wordpress.com/1302/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=1302&subd=dcarr&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://team.pushbomb.com/2009/02/21/oslo_dot_net_developer_domain_specific_language_mandate/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7b572cbcda5a17fe984e7dd1ddc9c3d6?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">pushbomb</media:title>
		</media:content>

		<media:content url="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fblog.domaindotnet.com%2f2009%2f02%2f21%2foslo_dot_net_developer_domain_specific_language_mandate%2f" medium="image">
			<media:title type="html">kick it on DotNetKicks.com</media:title>
		</media:content>

		<media:content url="http://www.martinfowler.com/mflogo.gif" medium="image">
			<media:title type="html">martinfowler.com logo</media:title>
		</media:content>
	</item>
		<item>
		<title>Silverlight 3D for SharePoint MOSS 2007 &#8211; Try it Here Now</title>
		<link>http://team.pushbomb.com/2008/11/19/released-silverlight-3d-for-sharepoint-moss-2007-try-it-here-now/</link>
		<comments>http://team.pushbomb.com/2008/11/19/released-silverlight-3d-for-sharepoint-moss-2007-try-it-here-now/#comments</comments>
		<pubDate>Thu, 20 Nov 2008 04:29:48 +0000</pubDate>
		<dc:creator>Damon Wilder Carr</dc:creator>
				<category><![CDATA[C# 3.0 Enhancements]]></category>
		<category><![CDATA[Siverlight]]></category>
		<category><![CDATA[Software Design]]></category>
		<category><![CDATA[Software Futures]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[sharepoint]]></category>
		<category><![CDATA[software as strategic]]></category>
		<category><![CDATA[3D]]></category>
		<category><![CDATA[animation]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[deepzoom]]></category>
		<category><![CDATA[invention]]></category>
		<category><![CDATA[Linq]]></category>
		<category><![CDATA[SilverLight]]></category>
		<category><![CDATA[SOA]]></category>
		<category><![CDATA[taxonomy]]></category>
		<category><![CDATA[WCF]]></category>

		<guid isPermaLink="false">http://dcarr.wordpress.com/2008/11/19/released-silverlight-3d-for-sharepoint-moss-2007-try-it-here-now/</guid>
		<description><![CDATA[This effort started as an idea on a napkin (how cliché!) into what I hope will see decent use. Long story short, this is an effort to bring RIA to the SharePoint world. But not just RIA style usability, I believe we pushed the envelope even further by incorporating not only DeepZoom for ‘zoom in to the pixel’ resolution, but the 3D extensions not present by default (you have the essentials but only the amazingly talented people behind the Hard Rock Memorabilia site (vertigo) have shown this style of combined zoom/3d that we have seen in any largely deployed sample.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=1161&subd=dcarr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p> <br />
 Long story short, this is an effort to bring <a href="http://en.wikipedia.org/wiki/Rich_Internet_application" target="_blank">RIA </a>to the <a href="http://en.wikipedia.org/wiki/Sharepoint_" target="_blank">SharePoint </a>world.</p>
<p> </p>
<p>But not just RIA style <a href="http://en.wikipedia.org/wiki/Usability" target="_blank">usability</a>, I believe we pushed the envelope even further by incorporating not only <a href="http://en.wikipedia.org/wiki/DeepZoom" target="_blank">DeepZoom (SeaDragon) </a>for ‘zoom in to the pixel’ resolution, but the 3D extensions not present by default</p>
<p align="right">(you have the essentials but only the amazingly talented people behind the <a href="http://memorabilia.hardrock.com/" target="_blank">Hard Rock Memorabilia</a> site (vertigo) <a href="http://www.vertigo.com/DeepZoom.aspx" target="_blank">have shown this style of combined zoom/3d</a> that we have seen in any largely deployed sample).</p>
<p align="right"> </p>
<p align="center"><strong><br />
</strong></p>
<p style="text-align:center;"><a href="http://www.domaindotnet.com/ClientBin/DeepZoom3D.html"><img class="aligncenter" style="border-bottom:black 1px solid;border-left:black 1px solid;display:block;border-top:black 1px solid;border-right:black 1px solid;" title="SharepointZoom3d" src="http://dcarr.files.wordpress.com/2008/11/sharepointzoom3d3.png?w=240&#038;h=232" border="0" alt="SharepointZoom3d" width="240" height="232" /></a></p>
<p>Click the image here to launch the <a href="http://en.wikipedia.org/wiki/Silverlight" target="_blank">Silverlight</a> 2.0 cross-platform goodness.</p>
<h4><strong>NOTE: A prize goes to the first person to email us at: </strong><a href="mailto:innovate@domaindotnet.com"><strong>innovate@domaindotnet.com</strong></a><strong> the exact number of seconds it would take to complete the ‘applying attributes’ to the .gif file (you need to see the demo to understand).</strong></h4>
<div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:1b3d19bf-9da9-439e-8cba-ffcf6c6f54f9" class="wlWriterSmartContent" style="display:inline;float:none;margin:0;padding:0;">Technorati Tags: <a rel="tag" href="http://technorati.com/tags/sharepoint">sharepoint</a>,<a rel="tag" href="http://technorati.com/tags/silverlight">silverlight</a>,<a rel="tag" href="http://technorati.com/tags/deepzoom">deepzoom</a>,<a rel="tag" href="http://technorati.com/tags/SOA">SOA</a>,<a rel="tag" href="http://technorati.com/tags/wcf">wcf</a>,<a rel="tag" href="http://technorati.com/tags/3D">3D</a>,<a rel="tag" href="http://technorati.com/tags/animation">animation</a>,<a rel="tag" href="http://technorati.com/tags/taxonomy">taxonomy</a>,<a rel="tag" href="http://technorati.com/tags/C%23">C#</a>,<a rel="tag" href="http://technorati.com/tags/Linq">Linq</a>,<a rel="tag" href="http://technorati.com/tags/WCF">WCF</a>,<a rel="tag" href="http://technorati.com/tags/invention">invention</a></div>
<p><a title="Silverlight 3D DeepZoom Navigator" href="http://www.domaindotnet.com/ClientBin/DeepZoom3D.html" target="_blank"></a></p>
<div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:361263a2-257c-4554-b5e0-93c46a88fd08" class="wlWriterSmartContent" style="display:inline;float:none;margin:0;padding:0;">del.icio.us Tags: <a rel="tag" href="http://del.icio.us/popular/sharepoint">sharepoint</a>,<a rel="tag" href="http://del.icio.us/popular/silverlight">silverlight</a>,<a rel="tag" href="http://del.icio.us/popular/deepzoom">deepzoom</a>,<a rel="tag" href="http://del.icio.us/popular/SOA">SOA</a>,<a rel="tag" href="http://del.icio.us/popular/wcf">wcf</a>,<a rel="tag" href="http://del.icio.us/popular/3D">3D</a>,<a rel="tag" href="http://del.icio.us/popular/animation">animation</a>,<a rel="tag" href="http://del.icio.us/popular/taxonomy">taxonomy</a>,<a rel="tag" href="http://del.icio.us/popular/C%23">C#</a>,<a rel="tag" href="http://del.icio.us/popular/Linq">Linq</a>,<a rel="tag" href="http://del.icio.us/popular/WCF">WCF</a>,<a rel="tag" href="http://del.icio.us/popular/invention">invention</a></div>
<h3>Related Posts</h3>
<div class="wlw_related_posts">from tag <a href="http://del.icio.us/damoncarr/deepzoom">deepzoom</a></div>
<ul>
<li><a href="http://www.vertigo.com/deepzoom.aspx">Vertigo: DeepZoom</a></li>
</ul>
<p>from tag <a href="http://del.icio.us/damoncarr/wcf">wcf</a></p>
<ul>
<li><a href="http://www.ayende.com/Blog/archive/2007/06/12/WCF-Windsor-Integration.aspx">WCF Windsor Integration</a></li>
</ul>
<p>from tag <a href="http://del.icio.us/damoncarr/WCF">WCF</a></p>
<ul>
<li><a href="http://damon.agilefactor.com/2007/09/software-as-service-pattern-language.html">Software as a Service &#8211; A Pattern Language Approach</a></li>
</ul>
<p>from tag <a href="http://del.icio.us/damoncarr/silverlight">silverlight</a></p>
<ul>
<li><a href="http://blogs.vertigo.com/personal/willa/Blog/archive/2008/10/14/silverlight-2-birthday-widget-part-ii.aspx">Will’s Blog &#8211; Silverlight 2 Birthday Widget, Part II</a></li>
<li><a href="http://silverlight.net/GetStarted/sl2rc0.aspx">The Official Microsoft Silverlight Site</a></li>
</ul>
<p>from tag <a href="http://del.icio.us/damoncarr/SOA">SOA</a></p>
<ul>
<li><a href="http://www.slideshare.net/domaindotnetteam/advanced-concepts-in-software-as-a-service-service-oriented-architecture-presentation/">Advanced Concepts in Software as a Service / Service Oriented Architecture</a></li>
<li><a href="http://damon.agilefactor.com/2007/10/collision-of-software-project.html">The Collision of Software Project Management and Agile</a></li>
</ul>
<p>from tag <a href="http://del.icio.us/damoncarr/sharepoint">sharepoint</a></p>
<ul>
<li><a href="http://msdn2.microsoft.com/en-us/office/bb251754.aspx">Business Data Catalog</a></li>
<li><a href="http://sharepointrss.com/">SharePoint RSS Alpha</a></li>
<li><a href="http://www.microsoft.com/technet/windowsserver/sharepoint/wssapps/templates/default.mspx">Templates for SharePoint</a></li>
<li><a href="http://msdn2.microsoft.com/en-us/library/ms948927.aspx">Creating a Web Part with Custom Properties</a></li>
<li><a href="http://www.sharepoint-tips.com/2007/05/sharepoint-designer-article-2-creating.html">SharePoint Creating XSLT DataView</a></li>
<li><a href="http://www.codeplex.com/smartpart">SmartPart for SharePoint &#8211; Home</a></li>
<li><a href="http://msdn2.microsoft.com/en-us/library/bb264593.aspx">Windows SharePoint Services 3.0</a></li>
</ul>
<p>from tag <a href="http://del.icio.us/damoncarr/Linq">Linq</a></p>
<ul>
<li><a href="//speeddial/content/speeddial.xul">Speed Dial</a></li>
<li><a href="http://cifactorybuild.stelligent.com/CI%20Factory/default.aspx?_action_ViewBuildReport=true&amp;server=CI+Factory&amp;project=CI+Factory&amp;build=log20070923221806Lbuild.0.9.0.18.xml">CruiseControl.NET</a></li>
<li><a href="http://pragprog.com/">The Pragmatic Bookshelf</a></li>
<li><a href="http://www.streetmap.co.uk/newsearch.srf?mapp=newmap&amp;searchp=newsearch&amp;type=PostCode&amp;name=%s">map</a></li>
<li><a href="https://www.innerworkings.com/promotions/a5a8879b-fb5b-4f66-8182-a14fd63a3d73/msdn-code-gallery-silverlight-2-samples/register">Register &#8211; InnerWorkings</a></li>
</ul>
<br />Posted in C# 3.0 Enhancements, sharepoint, Siverlight, software as strategic, Software Design, Software Futures, Technology Tagged: 3D, animation, C#, deepzoom, invention, Linq, sharepoint, SilverLight, SOA, taxonomy, WCF <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dcarr.wordpress.com/1161/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dcarr.wordpress.com/1161/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dcarr.wordpress.com/1161/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dcarr.wordpress.com/1161/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dcarr.wordpress.com/1161/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dcarr.wordpress.com/1161/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dcarr.wordpress.com/1161/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dcarr.wordpress.com/1161/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dcarr.wordpress.com/1161/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dcarr.wordpress.com/1161/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=1161&subd=dcarr&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://team.pushbomb.com/2008/11/19/released-silverlight-3d-for-sharepoint-moss-2007-try-it-here-now/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7b572cbcda5a17fe984e7dd1ddc9c3d6?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">pushbomb</media:title>
		</media:content>

		<media:content url="http://dcarr.files.wordpress.com/2008/11/sharepointzoom3d3.png" medium="image">
			<media:title type="html">SharepointZoom3d</media:title>
		</media:content>
	</item>
		<item>
		<title>SharePoint MOSS 2007 &#8216;DeepZoom 3D&#8217; is Here&#8230;.Click Below&#8230;</title>
		<link>http://team.pushbomb.com/2008/11/19/sharepoint-moss-3d-is-almost-ready-this-was-taken-this-morning/</link>
		<comments>http://team.pushbomb.com/2008/11/19/sharepoint-moss-3d-is-almost-ready-this-was-taken-this-morning/#comments</comments>
		<pubDate>Wed, 19 Nov 2008 15:25:56 +0000</pubDate>
		<dc:creator>Damon Wilder Carr</dc:creator>
				<category><![CDATA[C# 3.0 Enhancements]]></category>
		<category><![CDATA[Framework Design]]></category>
		<category><![CDATA[Industry News]]></category>
		<category><![CDATA[Siverlight]]></category>
		<category><![CDATA[Software Design]]></category>
		<category><![CDATA[Software Futures]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Windows Presentation Foundation]]></category>
		<category><![CDATA[agile practices]]></category>
		<category><![CDATA[concepts implemented]]></category>
		<category><![CDATA[sharepoint]]></category>
		<category><![CDATA[software as strategic]]></category>
		<category><![CDATA[.NET 3.5]]></category>
		<category><![CDATA[3D]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[domain.dot.net]]></category>
		<category><![CDATA[MOSS]]></category>
		<category><![CDATA[Opacity]]></category>
		<category><![CDATA[Perspective]]></category>
		<category><![CDATA[taxonomy]]></category>
		<category><![CDATA[Visualization]]></category>

		<guid isPermaLink="false">http://dcarr.wordpress.com/?p=1111</guid>
		<description><![CDATA[The breakthough for discovering your information in the Sharepoint world is almost here. This image is absolutely real and 100% cross-platform in the browser via Silverlight. None of us have ever seen anything like this. How about you?<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=1111&subd=dcarr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p style="text-align:center;"> </p>
<p style="text-align:center;"> <span>can </span></p>
<p style="text-align:center;"><span>you</span></p>
<p style="text-align:center;"><span>find</span></p>
<p style="text-align:center;"><span>the</span></p>
<p style="text-align:center;"><span>ghosts?</span></p>
<div id="attachment_1112" class="wp-caption aligncenter" style="width: 250px"><a href="http://www.domaindotnet.com/ClientBin/DeepZoom3D.html"><img class="size-full wp-image-1112 " style="display:inline;border:black 2px solid;margin:0 55px 0 0;" title="sharepoint3d" src="http://dcarr.files.wordpress.com/2008/11/sharepoint3d.png?w=240&#038;h=188" alt="a PowerPoint document in our breakthrough navigation and discovery technology" width="240" height="188" align="left" /></a><p class="wp-caption-text">click me and be prepared</p></div>
<p> </p>
<p style="text-align:center;">Send a screen shot if you find them to : <a href="mailto:innovate@domaindotnet.com">innovate@domaindotnet.com</a> and the best image will recieve some swag! Non-trivial swag as well! </p>
<p style="text-align:center;"> </p>
<p style="text-align:center;"><a title="Full perspective in 3D" href="http://blog.domaindotnet.com/2008/11/07/sharepoint-moss-3d-is-almost-ready-this-was-taken-this-morning/sharepoint3d/"></a></p>
<div class="vcard"><span class="fn n"><span class="given-name">Damon</span> <span class="additional-name">Wilder</span> <span class="given-family">Carr</span> </span></div>
<div class="org">domain.dot.net</div>
<div class="org">team labs</div>
<div><a class="email" href="mailto:damon@domaindotnet.com">damon@domaindotnet.com</a></div>
<div class="adr">
<div class="tel"><a class="htc" href="646.853.3504"></a><a class="htc" href="646.853.3504"></a><a class="htc" href="646.853.3504"><a class="htc" href="646.853.3504">646.853.3504</a></a></div>
<div><a class="url" href="http://www.domaindotnet.com">http://www.domaindotnet.com</a></div>
</div>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<h3>Related Posts</h3>
<div class="wlw_related_posts">from tag <a href="http://del.icio.us/damoncarr/sharepoint">SharePoint</a></div>
<ul>
<li><a href="http://msdn2.microsoft.com/en-us/office/bb251754.aspx">Business Data Catalog</a></li>
<li><a href="http://sharepointrss.com/">SharePoint RSS Alpha</a></li>
<li><a href="http://www.microsoft.com/technet/windowsserver/sharepoint/wssapps/templates/default.mspx">Templates for SharePoint</a></li>
<li><a href="http://msdn2.microsoft.com/en-us/library/ms948927.aspx">Creating a Web Part with Custom Properties</a></li>
<li><a href="http://www.sharepoint-tips.com/2007/05/sharepoint-designer-article-2-creating.html">SharePoint Creating XSLT DataView</a></li>
<li><a href="http://www.codeplex.com/smartpart">SmartPart for SharePoint &#8211; Home</a></li>
<li><a href="http://msdn2.microsoft.com/en-us/library/bb264593.aspx">Windows SharePoint Services 3.0</a></li>
</ul>
<p>from tag <a href="http://del.icio.us/damoncarr/C#">C#</a></p>
<ul>
<li><a href="terms=video&amp;folder=103006&amp;folder=103007&amp;folder=103008&amp;folder=103009&amp;folder=103010&amp;folder=103011&amp;folder=103012&amp;sort=14&amp;queryType=1">Video Favorites</a></li>
<li><a href="http://www.codeplex.com/SharpArchitecture">S#arp Architecture: ASP.NET MVC with NHibernate &#8211; Home</a></li>
<li><a href="http://skillsmatter.com/go/open-source-dot-net">Skills Matter OPEN SOURCE .NET</a></li>
<li><a href="http://www.castleproject.org/">Home :: Castle Project</a></li>
<li><a href="http://blog.domaindotnet.com/2008/08/24/nhibernate-20-gold-released-must-wait-for-linq-to-nhibernate/">NHibernate 2.0 gold Released – Must Wait for ‘Linq to NHibernate’ « ubiquitous fluency</a></li>
</ul>
<p><a href="http://del.icio.us/damoncarr/C#">(more..)</a></p>
<br />Posted in agile practices, C# 3.0 Enhancements, concepts implemented, Framework Design, Industry News, sharepoint, Siverlight, software as strategic, Software Design, Software Futures, Technology, Windows Presentation Foundation Tagged: .NET 3.5, 3D, C#, domain.dot.net, MOSS, Opacity, Perspective, sharepoint, taxonomy, Visualization <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dcarr.wordpress.com/1111/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dcarr.wordpress.com/1111/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dcarr.wordpress.com/1111/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dcarr.wordpress.com/1111/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dcarr.wordpress.com/1111/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dcarr.wordpress.com/1111/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dcarr.wordpress.com/1111/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dcarr.wordpress.com/1111/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dcarr.wordpress.com/1111/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dcarr.wordpress.com/1111/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=1111&subd=dcarr&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://team.pushbomb.com/2008/11/19/sharepoint-moss-3d-is-almost-ready-this-was-taken-this-morning/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7b572cbcda5a17fe984e7dd1ddc9c3d6?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">pushbomb</media:title>
		</media:content>

		<media:content url="http://dcarr.files.wordpress.com/2008/11/sharepoint3d.png" medium="image">
			<media:title type="html">sharepoint3d</media:title>
		</media:content>
	</item>
		<item>
		<title>Linq to Gac : Use Linq to Power Query your Gac via this C# Bridge to Fusion</title>
		<link>http://team.pushbomb.com/2008/09/20/fusion_c_sharp_wrapper_for_linq_to_gac_access/</link>
		<comments>http://team.pushbomb.com/2008/09/20/fusion_c_sharp_wrapper_for_linq_to_gac_access/#comments</comments>
		<pubDate>Sun, 21 Sep 2008 00:43:45 +0000</pubDate>
		<dc:creator>Damon Wilder Carr</dc:creator>
				<category><![CDATA[C# 3.0 Enhancements]]></category>
		<category><![CDATA[C# 3.0 for Internal DSL]]></category>
		<category><![CDATA[Framework Design]]></category>
		<category><![CDATA[Generics]]></category>
		<category><![CDATA[Proof Driven Development]]></category>
		<category><![CDATA[Software Design]]></category>
		<category><![CDATA[Software Futures]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[concepts implemented]]></category>
		<category><![CDATA[CSharp]]></category>
		<category><![CDATA[DomainDriven]]></category>
		<category><![CDATA[Fusion]]></category>
		<category><![CDATA[GAC]]></category>
		<category><![CDATA[Global Assembly Cache]]></category>
		<category><![CDATA[IEnumerable]]></category>
		<category><![CDATA[IEnumerator]]></category>
		<category><![CDATA[Internals]]></category>
		<category><![CDATA[Lambada]]></category>
		<category><![CDATA[Linq]]></category>
		<category><![CDATA[Linq to Gac]]></category>
		<category><![CDATA[Linq to Objects]]></category>
		<category><![CDATA[Machine]]></category>
		<category><![CDATA[Registry]]></category>

		<guid isPermaLink="false">http://dcarr.wordpress.com/2008/09/20/fusion_c_sharp_wrapper_for_linq_to_gac_access/</guid>
		<description><![CDATA[Now we attach the Gac Here we provide a full Linq to Objects IEnumerable wrapper over the Fusion API to allow you to have all the power of Linq queries over your entire GAC (as well as most other parts of you computer you can now join on!). This is a post to get you the GAC info now, as many have asked for it (and it might be the most widely used of this work). Things do get fun however when you start joining your GAC with your files with you registry....<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=928&subd=dcarr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fblog.domaindotnet.com%2f2008%2f09%2f20%2ffusion_c_sharp_wrapper_for_linq_to_gac_access%2f"><img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fblog.domaindotnet.com%2f2008%2f09%2f20%2ffusion_c_sharp_wrapper_for_linq_to_gac_access%2f" border="0" alt="kick it on DotNetKicks.com" /></a></p>
<p><a href="http://digg.com/submit?url=http%3a%2f%2fdcarr.wordpress.com%2f2008%2f09%2f20%2ffusion_c_sharp_wrapper_for_linq_to_gac_access%2f&amp;title=%e2%80%98Linq+to+Gac%e2%80%99+%3a+Use+Linq+to+Power+Query+your+Gac+via+this+C%23+Bridge+to+Fusion"><img style="border-width:0;" title="Digg This" src="http://digg.com/img/badges/100x20-digg-button.png" border="0" alt="Digg This" width="100" /></a></p>
<h4>This post gets you <a href="http://en.wikipedia.org/wiki/Language_Integrated_Query" target="_blank">Linq</a> access to the GAC with no fuss.</h4>
<p>Fusion is wrapped for you so no need to understand the unmanaged stuff unless you want to. Your up and running with GAC as a new Linq to Objects source in minutes.</p>
<h2>The Big Picture of the Project (You can skip to the next section if you just want the GAC code)</h2>
<p>Note: The reason both the Gac and MyEnvironment IEnumerable&lt;T&gt; references below are different? See the reference on the bottom right of the picture into the entry point to all of it (ThisBox)?</p>
<h2>Introduction to the Fusion  IEnumerable Wrapper</h2>
<p>A simple case. I want to know how my GAC is broken into ‘Major Vendors’. We assume this is roughly the first part of the name. (i.e. Microsoft.System = Microsoft).</p>
<p>Oh yeah. Exclude the assemblies that only occur once. We are looking for the larger view here.</p>
<p>Here is an easy solution:</p>
<pre class="code"><span style="font-size:x-small;"><span style="background:black none repeat scroll 0 0;color:white;">        [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Fact</span></span><span style="font-size:x-small;"><span style="background:black none repeat scroll 0 0;color:white;">]
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public void </span></span><span style="font-size:x-small;"><span style="background:black none repeat scroll 0 0;color:white;">should_show_gac_by_vendor()
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">var </span><span style="background:black none repeat scroll 0 0;color:white;">result = </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">from </span><span style="background:black none repeat scroll 0 0;color:white;">matchedAssembly </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">in </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">ThisBox</span><span style="background:black none repeat scroll 0 0;color:white;">.By&lt;</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">AssemblyDetail</span></span><span style="font-size:x-small;"><span style="background:black none repeat scroll 0 0;color:white;">&gt;()
                         </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">group </span><span style="background:black none repeat scroll 0 0;color:white;">matchedAssembly </span></span><span style="background:black none repeat scroll 0 0;color:#ecc03e;"><span style="font-size:x-small;">by
                             </span></span><span style="font-size:x-small;"><span style="background:black none repeat scroll 0 0;color:white;">matchedAssembly.MajorName
                             </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">into </span></span><span style="font-size:x-small;"><span style="background:black none repeat scroll 0 0;color:white;">grouping
                             </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">where </span></span><span style="font-size:x-small;"><span style="background:black none repeat scroll 0 0;color:white;">grouping.Count() &gt; 1
                             </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">orderby </span><span style="background:black none repeat scroll 0 0;color:white;">grouping.Count() </span></span><span style="background:black none repeat scroll 0 0;color:#ecc03e;"><span style="font-size:x-small;">descending
                             select </span></span><span style="font-size:x-small;"><span style="background:black none repeat scroll 0 0;color:white;">grouping;

            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">var </span></span><span style="font-size:x-small;"><span style="background:black none repeat scroll 0 0;color:white;">TotalSum = result.Sum(ad =&gt; ad.Count());

            </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Console</span><span style="background:black none repeat scroll 0 0;color:white;">.WriteLine(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">"** ASSEMBLIES BY NAME WITH &gt; 1 REGISTERED  = {0} ***"</span></span><span style="font-size:x-small;"><span style="background:black none repeat scroll 0 0;color:white;">, TotalSum);

            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">foreach </span><span style="background:black none repeat scroll 0 0;color:white;">(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">var </span><span style="background:black none repeat scroll 0 0;color:white;">firstGroup </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">in </span></span><span style="font-size:x-small;"><span style="background:black none repeat scroll 0 0;color:white;">result)
            {
                </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">var </span></span><span style="font-size:x-small;"><span style="background:black none repeat scroll 0 0;color:white;">groupCount = firstGroup.Count();
                </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Console</span><span style="background:black none repeat scroll 0 0;color:white;">.WriteLine(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">"Group '{0}' Assemblies={1} Percent={2} Public Keys Used={3}"</span></span><span style="background:black none repeat scroll 0 0;color:white;"><span style="font-size:x-small;">,
                                    firstGroup.Key,
                                    groupCount,
                                    groupCount.ToPctString(TotalSum),
                                    firstGroup.Select(ad =&gt; ad.PublicKey).Distinct().Count()
                                    );
            }
        }</span></span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<h2>** ASSEMBLIES BY NAME WITH &gt; 1 REGISTERED  = 664 ***</h2>
<p>Group &#8216;Microsoft&#8217; Assemblies=466 Percent=70.18% Public Keys Used=5<br />
Group &#8216;DevExpress&#8217; Assemblies=73 Percent=10.99% Public Keys Used=2<br />
Group &#8216;System&#8217; Assemblies=71 Percent=10.69% Public Keys Used=4<br />
Group &#8216;Policy&#8217; Assemblies=14 Percent=2.11% Public Keys Used=2<br />
Group &#8216;FSharp&#8217; Assemblies=11 Percent=1.66% Public Keys Used=1<br />
Group &#8216;VLinq&#8217; Assemblies=10 Percent=1.51% Public Keys Used=1<br />
Group &#8216;policy&#8217; Assemblies=6 Percent=0.9% Public Keys Used=2<br />
Group &#8216;PresentationFramework&#8217; Assemblies=5 Percent=0.75% Public Keys Used=1<br />
Group &#8216;mscorcfg&#8217; Assemblies=2 Percent=0.3% Public Keys Used=1<br />
Group &#8216;WebDev&#8217; Assemblies=2 Percent=0.3% Public Keys Used=1<br />
Group &#8216;VSTADTEProvider&#8217; Assemblies=2 Percent=0.3% Public Keys Used=1<br />
Group &#8216;VsWebSite&#8217; Assemblies=2 Percent=0.3% Public Keys Used=1</p>
<p><span style="font-size:x-small;"><span style="font-size:x-small;">Try that with GacUtil (grin)..</span></span></p>
<h2>C# GAC IEnumerable&lt;Assembly&gt; implementation</h2>
<p>Ah yes the GAC Fusion wrapper code.  Thanks to <a href="http://dotnetjunkies.com/WebLog/debasish/" target="_blank">Debasish Bose</a> for his help here.</p>
<h1>C# Fusion Gac Enumerable : <a href="http://blog.domaindotnet.com/">Domain.Dot.Net</a> Team</h1>
<p><a href="http://dcarr.files.wordpress.com/2008/09/classdiagram21.png"><img style="display:inline;border-width:0;" title="ClassDiagram2" src="http://dcarr.files.wordpress.com/2008/09/classdiagram2-thumb1.png?w=684" border="0" alt="ClassDiagram2" width="684" /></a></p>
<pre class="code"><span style="background:black none repeat scroll 0 0;color:white;">    </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;summary&gt;
    /// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">Just to have some room to breath
    </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;/summary&gt;
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public class </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">AssemblyDetail </span><span style="background:black none repeat scroll 0 0;color:white;">: </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">AssemblyDetailBase
    </span><span style="background:black none repeat scroll 0 0;color:white;">{
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public </span><span style="background:black none repeat scroll 0 0;color:white;">AssemblyDetail(</span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyName </span><span style="background:black none repeat scroll 0 0;color:white;">currentAssembly) : </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">base</span><span style="background:black none repeat scroll 0 0;color:white;">(currentAssembly) {}

        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public override </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">String </span><span style="background:black none repeat scroll 0 0;color:white;">FullName
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get
            </span><span style="background:black none repeat scroll 0 0;color:white;">{
                </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:white;">_fullName;
            }
        }
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public override string </span><span style="background:black none repeat scroll 0 0;color:white;">Version
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get
            </span><span style="background:black none repeat scroll 0 0;color:white;">{
                </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:white;">_versionString;
            }
        }
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public override int </span><span style="background:black none repeat scroll 0 0;color:white;">Major
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get
            </span><span style="background:black none repeat scroll 0 0;color:white;">{
                </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:white;">VersionComponent(0);
            }
        }
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public override int </span><span style="background:black none repeat scroll 0 0;color:white;">Minor
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get
            </span><span style="background:black none repeat scroll 0 0;color:white;">{
                </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:white;">VersionComponent(1);
            }
        }
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public override int </span><span style="background:black none repeat scroll 0 0;color:white;">Revision
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get
            </span><span style="background:black none repeat scroll 0 0;color:white;">{
                </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:white;">VersionComponent(2);
            }
        }
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public override int </span><span style="background:black none repeat scroll 0 0;color:white;">Build
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get
            </span><span style="background:black none repeat scroll 0 0;color:white;">{
                </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:white;">VersionComponent(3);
            }
        }

        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public override string </span><span style="background:black none repeat scroll 0 0;color:white;">PublicKey
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get
            </span><span style="background:black none repeat scroll 0 0;color:white;">{
                </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:white;">_pkey;
            }
        }
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public override string </span><span style="background:black none repeat scroll 0 0;color:white;">MajorName
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get
            </span><span style="background:black none repeat scroll 0 0;color:white;">{
                </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:white;">_majorName;
            }
        }
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">String </span><span style="background:black none repeat scroll 0 0;color:white;">Name
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get
            </span><span style="background:black none repeat scroll 0 0;color:white;">{
                </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:white;">_fullName;
            }
        }

        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">VersionComponent(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">position)
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:white;">_version.Length &lt;= position + 1
                           ? </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Convert</span><span style="background:black none repeat scroll 0 0;color:white;">.ToInt32(_version[position]) : 0;
        }
    }</span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<pre class="code"><span style="background:black none repeat scroll 0 0;color:white;">    #region

    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">using </span><span style="background:black none repeat scroll 0 0;color:white;">System;
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">using </span><span style="background:black none repeat scroll 0 0;color:white;">System.Runtime.InteropServices;

    #endregion

    </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;summary&gt;
    /// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">Alpha - Comment and Add Regressions
    </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;/summary&gt;
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public abstract class </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">AssemblyDetailBase
    </span><span style="background:black none repeat scroll 0 0;color:white;">{
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">protected string </span><span style="background:black none repeat scroll 0 0;color:white;">_fullName;
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">protected string </span><span style="background:black none repeat scroll 0 0;color:white;">_majorName;
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">string</span><span style="background:black none repeat scroll 0 0;color:white;">[] _nameSplit;
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">protected string </span><span style="background:black none repeat scroll 0 0;color:white;">_pkey;
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">string </span><span style="background:black none repeat scroll 0 0;color:white;">_rawname;
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">protected string</span><span style="background:black none repeat scroll 0 0;color:white;">[] _version;
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">protected string </span><span style="background:black none repeat scroll 0 0;color:white;">_versionString;

        </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;summary&gt;
        /// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">Initializes a new instance of the </span><span style="background:black none repeat scroll 0 0;color:gray;">&lt;see cref=</span><span style="background:black none repeat scroll 0 0;color:#9feca5;">"AssemblyDetailBase"</span><span style="background:black none repeat scroll 0 0;color:gray;">/&gt; </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">class.
        </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;/summary&gt;
        /// &lt;param name=</span><span style="background:black none repeat scroll 0 0;color:#9feca5;">"Current"</span><span style="background:black none repeat scroll 0 0;color:gray;">&gt;</span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">The current.</span><span style="background:black none repeat scroll 0 0;color:gray;">&lt;/param&gt;
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">protected </span><span style="background:black none repeat scroll 0 0;color:white;">AssemblyDetailBase(</span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyName </span><span style="background:black none repeat scroll 0 0;color:white;">Current)
        {
            ExtractParsedDetail(Current);
        }

        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public abstract string </span><span style="background:black none repeat scroll 0 0;color:white;">FullName
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get</span><span style="background:black none repeat scroll 0 0;color:white;">;
        }
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public abstract string </span><span style="background:black none repeat scroll 0 0;color:white;">Version
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get</span><span style="background:black none repeat scroll 0 0;color:white;">;
        }
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public abstract int </span><span style="background:black none repeat scroll 0 0;color:white;">Major
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get</span><span style="background:black none repeat scroll 0 0;color:white;">;
        }
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public abstract int </span><span style="background:black none repeat scroll 0 0;color:white;">Minor
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get</span><span style="background:black none repeat scroll 0 0;color:white;">;
        }
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public abstract int </span><span style="background:black none repeat scroll 0 0;color:white;">Revision
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get</span><span style="background:black none repeat scroll 0 0;color:white;">;
        }
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public abstract int </span><span style="background:black none repeat scroll 0 0;color:white;">Build
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get</span><span style="background:black none repeat scroll 0 0;color:white;">;
        }
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public abstract string </span><span style="background:black none repeat scroll 0 0;color:white;">PublicKey
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get</span><span style="background:black none repeat scroll 0 0;color:white;">;
        }
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public abstract string </span><span style="background:black none repeat scroll 0 0;color:white;">MajorName
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get</span><span style="background:black none repeat scroll 0 0;color:white;">;
        }

        </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;summary&gt;
        /// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">I do not want to persist the IAssemblyName
        </span><span style="background:black none repeat scroll 0 0;color:gray;">/// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">as it might introduce a COM reference when
        </span><span style="background:black none repeat scroll 0 0;color:gray;">/// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">we just can extract what we need and let it
        </span><span style="background:black none repeat scroll 0 0;color:gray;">/// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">pass away into whatever...
        </span><span style="background:black none repeat scroll 0 0;color:gray;">///
        /// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">Extracts the parsed detail.
        </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;/summary&gt;
        /// &lt;param name=</span><span style="background:black none repeat scroll 0 0;color:#9feca5;">"Current"</span><span style="background:black none repeat scroll 0 0;color:gray;">&gt;</span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">The current.</span><span style="background:black none repeat scroll 0 0;color:gray;">&lt;/param&gt;
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">void </span><span style="background:black none repeat scroll 0 0;color:white;">ExtractParsedDetail(</span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyName </span><span style="background:black none repeat scroll 0 0;color:white;">Current)
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">const int </span><span style="background:black none repeat scroll 0 0;color:white;">stongKeyPosition = 3;
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">const int </span><span style="background:black none repeat scroll 0 0;color:white;">versionPosition = 1;

            </span><span style="background:black none repeat scroll 0 0;color:#bcf5c9;">// Main Work Happens Here
            </span><span style="background:black none repeat scroll 0 0;color:white;">_fullName = GetDisplayName(Current);

            </span><span style="background:black none repeat scroll 0 0;color:#bcf5c9;">// Simply parse the ", " that seperates the full
            // name
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">var </span><span style="background:black none repeat scroll 0 0;color:white;">_parsedDetails = _fullName.Split(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">new</span><span style="background:black none repeat scroll 0 0;color:white;">[]
                                                 {
                                                         </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">", "
                                                 </span><span style="background:black none repeat scroll 0 0;color:white;">}, </span><span style="background:black none repeat scroll 0 0;color:#b8a223;">StringSplitOptions</span><span style="background:black none repeat scroll 0 0;color:white;">.RemoveEmptyEntries);

            ExtractVersionInfo(versionPosition, _parsedDetails);
            ExtractAddition(stongKeyPosition, _parsedDetails);
        }

        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">void </span><span style="background:black none repeat scroll 0 0;color:white;">ExtractAddition(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">stongKeyPosition, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">string</span><span style="background:black none repeat scroll 0 0;color:white;">[] parsedDetails)
        {
            _pkey = parsedDetails[stongKeyPosition];
            _rawname = parsedDetails[0].Trim();
            _nameSplit = _rawname.Split(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">'.'</span><span style="background:black none repeat scroll 0 0;color:white;">);
            _majorName = _nameSplit[0].Trim();
        }

        </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;summary&gt;
        /// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">Gets the display name from the unmanaged pointer
        </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;/summary&gt;
        /// &lt;param name=</span><span style="background:black none repeat scroll 0 0;color:#9feca5;">"aName"</span><span style="background:black none repeat scroll 0 0;color:gray;">&gt;</span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">A name.</span><span style="background:black none repeat scroll 0 0;color:gray;">&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">static string </span><span style="background:black none repeat scroll 0 0;color:white;">GetDisplayName(</span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyName </span><span style="background:black none repeat scroll 0 0;color:white;">aName)
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">var </span><span style="background:black none repeat scroll 0 0;color:white;">displayFlags = </span><span style="background:black none repeat scroll 0 0;color:#b8a223;">AssemblyNameDisplayFlags</span><span style="background:black none repeat scroll 0 0;color:white;">.ALL;

            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">uint </span><span style="background:black none repeat scroll 0 0;color:white;">uiLen = 0;

            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">string </span><span style="background:black none repeat scroll 0 0;color:white;">_displayAssemblyName = </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">null</span><span style="background:black none repeat scroll 0 0;color:white;">;

            </span><span style="background:black none repeat scroll 0 0;color:#bcf5c9;">// Get the length
            </span><span style="background:black none repeat scroll 0 0;color:white;">aName.GetDisplayName(</span><span style="background:black none repeat scroll 0 0;color:#76a38a;">IntPtr</span><span style="background:black none repeat scroll 0 0;color:white;">.Zero, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">ref </span><span style="background:black none repeat scroll 0 0;color:white;">uiLen, (</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">uint</span><span style="background:black none repeat scroll 0 0;color:white;">) displayFlags);

            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">if </span><span style="background:black none repeat scroll 0 0;color:white;">(uiLen &gt; 0)
            {
                </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">var </span><span style="background:black none repeat scroll 0 0;color:white;">byteBuffer = </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">new byte</span><span style="background:black none repeat scroll 0 0;color:white;">[(uiLen + 1)*2];
                </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">unsafe </span><span style="background:black none repeat scroll 0 0;color:#bcf5c9;">//turn on sunsafe in project properties
                </span><span style="background:black none repeat scroll 0 0;color:white;">{
                    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">fixed </span><span style="background:black none repeat scroll 0 0;color:white;">(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">byte</span><span style="background:black none repeat scroll 0 0;color:white;">* numRef1 = byteBuffer)
                    {
                        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">var </span><span style="background:black none repeat scroll 0 0;color:white;">ptr1 = </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">new </span><span style="background:black none repeat scroll 0 0;color:#76a38a;">IntPtr</span><span style="background:black none repeat scroll 0 0;color:white;">(numRef1);
                        aName.GetDisplayName(ptr1, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">ref </span><span style="background:black none repeat scroll 0 0;color:white;">uiLen, (</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">uint</span><span style="background:black none repeat scroll 0 0;color:white;">) displayFlags);
                        _displayAssemblyName = </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Marshal</span><span style="background:black none repeat scroll 0 0;color:white;">.PtrToStringUni(ptr1);
                    }
                }
            }

            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:white;">_displayAssemblyName;
        }

        </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;summary&gt;
        /// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">Extracts the version info.
        </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;/summary&gt;
        /// &lt;param name=</span><span style="background:black none repeat scroll 0 0;color:#9feca5;">"versionPosition"</span><span style="background:black none repeat scroll 0 0;color:gray;">&gt;</span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">The version position.</span><span style="background:black none repeat scroll 0 0;color:gray;">&lt;/param&gt;
        /// &lt;param name=</span><span style="background:black none repeat scroll 0 0;color:#9feca5;">"parsedDetails"</span><span style="background:black none repeat scroll 0 0;color:gray;">&gt;</span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">The parsed details.</span><span style="background:black none repeat scroll 0 0;color:gray;">&lt;/param&gt;
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">void </span><span style="background:black none repeat scroll 0 0;color:white;">ExtractVersionInfo(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">versionPosition, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">string</span><span style="background:black none repeat scroll 0 0;color:white;">[] parsedDetails)
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">var </span><span style="background:black none repeat scroll 0 0;color:white;">versionLiteral = parsedDetails[versionPosition];
            _versionString = ToCoreVersion(versionPosition, versionLiteral);
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">if </span><span style="background:black none repeat scroll 0 0;color:white;">(_versionString != </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">String</span><span style="background:black none repeat scroll 0 0;color:white;">.Empty)
                _version = _versionString.Split(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">'.'</span><span style="background:black none repeat scroll 0 0;color:white;">);
        }

        </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;summary&gt;
        /// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">Gets the nice clean x.x.x.x string
        </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;/summary&gt;
        /// &lt;param name=</span><span style="background:black none repeat scroll 0 0;color:#9feca5;">"versionPosition"</span><span style="background:black none repeat scroll 0 0;color:gray;">&gt;</span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">The version position.</span><span style="background:black none repeat scroll 0 0;color:gray;">&lt;/param&gt;
        /// &lt;param name=</span><span style="background:black none repeat scroll 0 0;color:#9feca5;">"versionLiteral"</span><span style="background:black none repeat scroll 0 0;color:gray;">&gt;</span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">The version literal.</span><span style="background:black none repeat scroll 0 0;color:gray;">&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">static string </span><span style="background:black none repeat scroll 0 0;color:white;">ToCoreVersion(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">versionPosition, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">string </span><span style="background:black none repeat scroll 0 0;color:white;">versionLiteral)
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">var </span><span style="background:black none repeat scroll 0 0;color:white;">returnVal = </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">String</span><span style="background:black none repeat scroll 0 0;color:white;">.Empty;

            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">if </span><span style="background:black none repeat scroll 0 0;color:white;">(!</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">String</span><span style="background:black none repeat scroll 0 0;color:white;">.IsNullOrEmpty(versionLiteral))
            {
                </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">var </span><span style="background:black none repeat scroll 0 0;color:white;">_indexOf = versionLiteral.IndexOf(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">"="</span><span style="background:black none repeat scroll 0 0;color:white;">);

                </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">if </span><span style="background:black none repeat scroll 0 0;color:white;">(_indexOf != -1)
                    returnVal = versionLiteral.Substring(_indexOf + versionPosition);
            }

            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:white;">returnVal;
        }
    }</span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<pre class="code"><span style="background:black none repeat scroll 0 0;color:white;">#region

</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">using </span><span style="background:black none repeat scroll 0 0;color:white;">System.Runtime.InteropServices;

#endregion

</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">class </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">GAC
</span><span style="background:black none repeat scroll 0 0;color:white;">{
    GAC() {}

    [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">DllImport</span><span style="background:black none repeat scroll 0 0;color:white;">(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">"Fusion.dll"</span><span style="background:black none repeat scroll 0 0;color:white;">, CharSet = </span><span style="background:black none repeat scroll 0 0;color:#b8a223;">CharSet</span><span style="background:black none repeat scroll 0 0;color:white;">.Auto)]
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public static extern int </span><span style="background:black none repeat scroll 0 0;color:white;">CreateAssemblyEnum(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">out </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyEnum </span><span style="background:black none repeat scroll 0 0;color:white;">ppEnum,
                                                </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IApplicationContext </span><span style="background:black none repeat scroll 0 0;color:white;">pAppCtx,
                                                </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyName </span><span style="background:black none repeat scroll 0 0;color:white;">pName, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">uint </span><span style="background:black none repeat scroll 0 0;color:white;">dwFlags,
                                                </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">pvReserved);
}</span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<pre class="code"><span style="background:black none repeat scroll 0 0;color:white;">#region

</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">using </span><span style="background:black none repeat scroll 0 0;color:white;">System.Runtime.InteropServices;
</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">using </span><span style="background:black none repeat scroll 0 0;color:white;">System.Security;

#endregion

[</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">SuppressUnmanagedCodeSecurity</span><span style="background:black none repeat scroll 0 0;color:white;">, </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">ComImport</span><span style="background:black none repeat scroll 0 0;color:white;">, </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Guid</span><span style="background:black none repeat scroll 0 0;color:white;">(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">"7C23FF90-33AF-11D3-95DA-00A024A85B51"</span><span style="background:black none repeat scroll 0 0;color:white;">),
 </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">InterfaceType</span><span style="background:black none repeat scroll 0 0;color:white;">(1)]
</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public interface </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IApplicationContext
</span><span style="background:black none repeat scroll 0 0;color:white;">{
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">void </span><span style="background:black none repeat scroll 0 0;color:white;">SetContextNameObject(</span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyName </span><span style="background:black none repeat scroll 0 0;color:white;">pName);

    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">void </span><span style="background:black none repeat scroll 0 0;color:white;">GetContextNameObject([</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Out</span><span style="background:black none repeat scroll 0 0;color:white;">] </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">out </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyName </span><span style="background:black none repeat scroll 0 0;color:white;">ppName);

    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">void </span><span style="background:black none repeat scroll 0 0;color:white;">Set([</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">MarshalAs</span><span style="background:black none repeat scroll 0 0;color:white;">(</span><span style="background:black none repeat scroll 0 0;color:#b8a223;">UnmanagedType</span><span style="background:black none repeat scroll 0 0;color:white;">.LPWStr)] </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">string </span><span style="background:black none repeat scroll 0 0;color:white;">szName, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">pvValue, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">uint </span><span style="background:black none repeat scroll 0 0;color:white;">cbValue,
             </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">uint </span><span style="background:black none repeat scroll 0 0;color:white;">dwFlags);

    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">void </span><span style="background:black none repeat scroll 0 0;color:white;">Get([</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">MarshalAs</span><span style="background:black none repeat scroll 0 0;color:white;">(</span><span style="background:black none repeat scroll 0 0;color:#b8a223;">UnmanagedType</span><span style="background:black none repeat scroll 0 0;color:white;">.LPWStr)] </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">string </span><span style="background:black none repeat scroll 0 0;color:white;">szName, [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Out</span><span style="background:black none repeat scroll 0 0;color:white;">] </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">out int </span><span style="background:black none repeat scroll 0 0;color:white;">pvValue,
             </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">ref uint </span><span style="background:black none repeat scroll 0 0;color:white;">pcbValue, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">uint </span><span style="background:black none repeat scroll 0 0;color:white;">dwFlags);

    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">void </span><span style="background:black none repeat scroll 0 0;color:white;">GetDynamicDirectory([</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Out</span><span style="background:black none repeat scroll 0 0;color:white;">] </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">out int </span><span style="background:black none repeat scroll 0 0;color:white;">wzDynamicDir, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">ref uint </span><span style="background:black none repeat scroll 0 0;color:white;">pdwSize);
}</span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<pre class="code"><span style="background:black none repeat scroll 0 0;color:white;">#region

</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">using </span><span style="background:black none repeat scroll 0 0;color:white;">System;
</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">using </span><span style="background:black none repeat scroll 0 0;color:white;">System.Runtime.InteropServices;
</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">using </span><span style="background:black none repeat scroll 0 0;color:white;">System.Security;
</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">using </span><span style="background:black none repeat scroll 0 0;color:white;">System.Text;

#endregion

</span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;summary&gt;
/// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">IAssemblyName from Fusion
</span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;/summary&gt;
</span><span style="background:black none repeat scroll 0 0;color:white;">[</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">SuppressUnmanagedCodeSecurity</span><span style="background:black none repeat scroll 0 0;color:white;">, </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">ComImport</span><span style="background:black none repeat scroll 0 0;color:white;">, </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Guid</span><span style="background:black none repeat scroll 0 0;color:white;">(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">"CD193BC0-B4BC-11D2-9833-00C04FC31D2E"</span><span style="background:black none repeat scroll 0 0;color:white;">),
 </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">InterfaceType</span><span style="background:black none repeat scroll 0 0;color:white;">(1)]
</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public interface </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyName
</span><span style="background:black none repeat scroll 0 0;color:white;">{
    [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">PreserveSig</span><span style="background:black none repeat scroll 0 0;color:white;">]
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">SetProperty(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">uint </span><span style="background:black none repeat scroll 0 0;color:white;">PropertyId, </span><span style="background:black none repeat scroll 0 0;color:#76a38a;">IntPtr </span><span style="background:black none repeat scroll 0 0;color:white;">pvProperty, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">uint </span><span style="background:black none repeat scroll 0 0;color:white;">cbProperty);

    [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">PreserveSig</span><span style="background:black none repeat scroll 0 0;color:white;">]
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">GetProperty(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">uint </span><span style="background:black none repeat scroll 0 0;color:white;">PropertyId, </span><span style="background:black none repeat scroll 0 0;color:#76a38a;">IntPtr </span><span style="background:black none repeat scroll 0 0;color:white;">pvProperty, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">ref uint </span><span style="background:black none repeat scroll 0 0;color:white;">pcbProperty);

    [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">PreserveSig</span><span style="background:black none repeat scroll 0 0;color:white;">]
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">Finalize();

    [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">PreserveSig</span><span style="background:black none repeat scroll 0 0;color:white;">]
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">GetDisplayName(</span><span style="background:black none repeat scroll 0 0;color:#76a38a;">IntPtr </span><span style="background:black none repeat scroll 0 0;color:white;">szDisplayName, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">ref uint </span><span style="background:black none repeat scroll 0 0;color:white;">pccDisplayName, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">uint </span><span style="background:black none repeat scroll 0 0;color:white;">dwDisplayFlags);

    [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">PreserveSig</span><span style="background:black none repeat scroll 0 0;color:white;">]
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">BindToObject(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">object </span><span style="background:black none repeat scroll 0 0;color:white;">refIID, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">object </span><span style="background:black none repeat scroll 0 0;color:white;">pAsmBindSink,
                     </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IApplicationContext </span><span style="background:black none repeat scroll 0 0;color:white;">pApplicationContext,
                     [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">MarshalAs</span><span style="background:black none repeat scroll 0 0;color:white;">(</span><span style="background:black none repeat scroll 0 0;color:#b8a223;">UnmanagedType</span><span style="background:black none repeat scroll 0 0;color:white;">.LPWStr)] </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">string </span><span style="background:black none repeat scroll 0 0;color:white;">szCodeBase, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">long </span><span style="background:black none repeat scroll 0 0;color:white;">llFlags,
                     </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">pvReserved, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">uint </span><span style="background:black none repeat scroll 0 0;color:white;">cbReserved, [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Out</span><span style="background:black none repeat scroll 0 0;color:white;">] </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">out int </span><span style="background:black none repeat scroll 0 0;color:white;">ppv);

    [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">PreserveSig</span><span style="background:black none repeat scroll 0 0;color:white;">]
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">GetName(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">ref uint </span><span style="background:black none repeat scroll 0 0;color:white;">lpcwBuffer,
                [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Out</span><span style="background:black none repeat scroll 0 0;color:white;">, </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">MarshalAs</span><span style="background:black none repeat scroll 0 0;color:white;">(</span><span style="background:black none repeat scroll 0 0;color:#b8a223;">UnmanagedType</span><span style="background:black none repeat scroll 0 0;color:white;">.LPWStr)] </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">StringBuilder </span><span style="background:black none repeat scroll 0 0;color:white;">pwzName);

    [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">PreserveSig</span><span style="background:black none repeat scroll 0 0;color:white;">]
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">GetVersion([</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Out</span><span style="background:black none repeat scroll 0 0;color:white;">] </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">out uint </span><span style="background:black none repeat scroll 0 0;color:white;">pdwVersionHi, [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Out</span><span style="background:black none repeat scroll 0 0;color:white;">] </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">out uint </span><span style="background:black none repeat scroll 0 0;color:white;">pdwVersionLow);

    [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">PreserveSig</span><span style="background:black none repeat scroll 0 0;color:white;">]
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">IsEqual(</span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyName </span><span style="background:black none repeat scroll 0 0;color:white;">pName, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">uint </span><span style="background:black none repeat scroll 0 0;color:white;">dwCmpFlags);

    [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">PreserveSig</span><span style="background:black none repeat scroll 0 0;color:white;">]
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">Clone([</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Out</span><span style="background:black none repeat scroll 0 0;color:white;">] </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">out </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyName </span><span style="background:black none repeat scroll 0 0;color:white;">pName);
}</span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p><a href="http://11011.net/software/vspaste"></a></p>
<pre class="code"><span style="background:black none repeat scroll 0 0;color:white;">#region

</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">using </span><span style="background:black none repeat scroll 0 0;color:white;">System.Runtime.InteropServices;
</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">using </span><span style="background:black none repeat scroll 0 0;color:white;">System.Security;

#endregion

[</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">SuppressUnmanagedCodeSecurity</span><span style="background:black none repeat scroll 0 0;color:white;">, </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">ComImport</span><span style="background:black none repeat scroll 0 0;color:white;">, </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Guid</span><span style="background:black none repeat scroll 0 0;color:white;">(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">"21B8916C-F28E-11D2-A473-00C04F8EF448"</span><span style="background:black none repeat scroll 0 0;color:white;">),
 </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">InterfaceType</span><span style="background:black none repeat scroll 0 0;color:white;">(1)]
</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">interface </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyEnum
</span><span style="background:black none repeat scroll 0 0;color:white;">{
    [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">PreserveSig</span><span style="background:black none repeat scroll 0 0;color:white;">]
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">GetNextAssembly([</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Out</span><span style="background:black none repeat scroll 0 0;color:white;">] </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">out </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IApplicationContext </span><span style="background:black none repeat scroll 0 0;color:white;">ppAppCtx,
                        [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Out</span><span style="background:black none repeat scroll 0 0;color:white;">] </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">out </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyName </span><span style="background:black none repeat scroll 0 0;color:white;">ppName, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">uint </span><span style="background:black none repeat scroll 0 0;color:white;">dwFlags);

    [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">PreserveSig</span><span style="background:black none repeat scroll 0 0;color:white;">]
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">Reset();

    [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">PreserveSig</span><span style="background:black none repeat scroll 0 0;color:white;">]
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">Clone([</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Out</span><span style="background:black none repeat scroll 0 0;color:white;">] </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">out </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyEnum </span><span style="background:black none repeat scroll 0 0;color:white;">ppEnum);
}</span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p><a href="http://11011.net/software/vspaste"></a></p>
<pre class="code"><span style="background:black none repeat scroll 0 0;color:white;">#region

</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">using </span><span style="background:black none repeat scroll 0 0;color:white;">System.Collections;
</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">using </span><span style="background:black none repeat scroll 0 0;color:white;">System.Collections.Generic;
</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">using </span><span style="background:black none repeat scroll 0 0;color:white;">System.Runtime.InteropServices;

#endregion

</span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;summary&gt;
/// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">Fairly basic stuff once the
</span><span style="background:black none repeat scroll 0 0;color:gray;">/// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">unmanaged stuff is all mapped
</span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;/summary&gt;
</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public class </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">GacEnumerable </span><span style="background:black none repeat scroll 0 0;color:white;">: </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IEnumerator</span><span style="background:black none repeat scroll 0 0;color:white;">&lt;</span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyName</span><span style="background:black none repeat scroll 0 0;color:white;">&gt;, </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IEnumerable</span><span style="background:black none repeat scroll 0 0;color:white;">&lt;</span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyName</span><span style="background:black none repeat scroll 0 0;color:white;">&gt;
{
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">readonly </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyEnum </span><span style="background:black none repeat scroll 0 0;color:white;">_enumeration;
    </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyName </span><span style="background:black none repeat scroll 0 0;color:white;">_enumCurrentAssembly;

    GacEnumerable()
    {
        HandleCom(</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">GAC</span><span style="background:black none repeat scroll 0 0;color:white;">.CreateAssemblyEnum(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">out </span><span style="background:black none repeat scroll 0 0;color:white;">_enumeration, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">null</span><span style="background:black none repeat scroll 0 0;color:white;">, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">null</span><span style="background:black none repeat scroll 0 0;color:white;">,
                                         (</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">uint</span><span style="background:black none repeat scroll 0 0;color:white;">) </span><span style="background:black none repeat scroll 0 0;color:#b8a223;">AssemblyCacheFlags</span><span style="background:black none repeat scroll 0 0;color:white;">.GAC, 0));
    }

    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public static </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">GacEnumerable </span><span style="background:black none repeat scroll 0 0;color:white;">New
    {
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get
        </span><span style="background:black none repeat scroll 0 0;color:white;">{
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return new </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">GacEnumerable</span><span style="background:black none repeat scroll 0 0;color:white;">();
        }
    }

    #region IEnumerable&lt;IAssemblyName&gt; Members

    </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;summary&gt;
    /// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">Returns an enumerator that iterates through the collection.
    </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;/summary&gt;
    /// &lt;returns&gt;
    /// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">A </span><span style="background:black none repeat scroll 0 0;color:gray;">&lt;see cref=</span><span style="background:black none repeat scroll 0 0;color:#9feca5;">"T:System.Collections.Generic.IEnumerator`1"</span><span style="background:black none repeat scroll 0 0;color:gray;">/&gt; </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">that can be used to iterate through the collection.
    </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;/returns&gt;
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IEnumerator</span><span style="background:black none repeat scroll 0 0;color:white;">&lt;</span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyName</span><span style="background:black none repeat scroll 0 0;color:white;">&gt; GetEnumerator()
    {
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return this</span><span style="background:black none repeat scroll 0 0;color:white;">;
    }

    </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;summary&gt;
    /// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">Returns an enumerator that iterates through a collection.
    </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;/summary&gt;
    /// &lt;returns&gt;
    /// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">An </span><span style="background:black none repeat scroll 0 0;color:gray;">&lt;see cref=</span><span style="background:black none repeat scroll 0 0;color:#9feca5;">"T:System.Collections.IEnumerator"</span><span style="background:black none repeat scroll 0 0;color:gray;">/&gt; </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">object that can be used to iterate through the collection.
    </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;/returns&gt;
    </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IEnumerator IEnumerable</span><span style="background:black none repeat scroll 0 0;color:white;">.GetEnumerator()
    {
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:white;">GetEnumerator();
    }

    #endregion

    #region IEnumerator&lt;IAssemblyName&gt; Members

    </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;summary&gt;
    /// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">Advances the enumerator to the next element of the collection.
    </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;/summary&gt;
    /// &lt;returns&gt;
    /// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">true if the enumerator was successfully advanced to the next element; false if the enumerator has passed the end of the collection.
    </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;/returns&gt;
    /// &lt;exception cref=</span><span style="background:black none repeat scroll 0 0;color:#9feca5;">"T:System.InvalidOperationException"</span><span style="background:black none repeat scroll 0 0;color:gray;">&gt;</span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">The collection was modified after the enumerator was created. </span><span style="background:black none repeat scroll 0 0;color:gray;">&lt;/exception&gt;
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">bool </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IEnumerator</span><span style="background:black none repeat scroll 0 0;color:white;">.MoveNext()
    {
        </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IApplicationContext </span><span style="background:black none repeat scroll 0 0;color:white;">context1;
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:white;">(0 ==
                _enumeration.GetNextAssembly(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">out </span><span style="background:black none repeat scroll 0 0;color:white;">context1, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">out </span><span style="background:black none repeat scroll 0 0;color:white;">_enumCurrentAssembly, 0));
    }

    </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;summary&gt;
    /// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">Sets the enumerator to its initial position, which is before the first element in the collection.
    </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;/summary&gt;
    /// &lt;exception cref=</span><span style="background:black none repeat scroll 0 0;color:#9feca5;">"T:System.InvalidOperationException"</span><span style="background:black none repeat scroll 0 0;color:gray;">&gt;</span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">The collection was modified after the enumerator was created. </span><span style="background:black none repeat scroll 0 0;color:gray;">&lt;/exception&gt;
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">void </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IEnumerator</span><span style="background:black none repeat scroll 0 0;color:white;">.Reset()
    {
        _enumeration.Reset();
    }

    </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;summary&gt;
    /// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">IAssemblyName is a Fusion interface
    </span><span style="background:black none repeat scroll 0 0;color:gray;">/// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">Gets the element in the collection at the current position of the enumerator.
    </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;/summary&gt;
    /// &lt;value&gt;&lt;/value&gt;
    /// &lt;returns&gt;</span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">The element in the collection at the current position of the enumerator.</span><span style="background:black none repeat scroll 0 0;color:gray;">&lt;/returns&gt;
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyName </span><span style="background:black none repeat scroll 0 0;color:white;">Current
    {
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get
        </span><span style="background:black none repeat scroll 0 0;color:white;">{
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:white;">_enumCurrentAssembly;
        }
    }
    </span><span style="background:black none repeat scroll 0 0;color:#bcf5c9;">// Properties
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">object </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IEnumerator</span><span style="background:black none repeat scroll 0 0;color:white;">.Current
    {
        </span><span style="background:black none repeat scroll 0 0;color:#bcf5c9;">// Go to the other darn Current not this one
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get
        </span><span style="background:black none repeat scroll 0 0;color:white;">{
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:white;">Current;
        }
    }
    </span><span style="background:black none repeat scroll 0 0;color:#bcf5c9;">// Fields
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public void </span><span style="background:black none repeat scroll 0 0;color:white;">Dispose()
    {
        _enumCurrentAssembly = </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">null</span><span style="background:black none repeat scroll 0 0;color:white;">;
    }

    #endregion

    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">internal static void </span><span style="background:black none repeat scroll 0 0;color:white;">HandleCom(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">hResult)
    {
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">if </span><span style="background:black none repeat scroll 0 0;color:white;">(hResult &lt; 0)
            </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Marshal</span><span style="background:black none repeat scroll 0 0;color:white;">.ThrowExceptionForHR(hResult);
    }
}</span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p><span style="font-size:x-small;"> </span></p>
<pre class="code"><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">[</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Flags</span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">]
</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">enum </span></span><span style="background:black none repeat scroll 0 0;color:#b8a223;"><span style="font-size:x-small;font-family:Consolas;">AssemblyCacheFlags
</span></span><span style="background:black none repeat scroll 0 0;color:white;"><span style="font-size:x-small;font-family:Consolas;">{
    NGenCache = 0x1,
    GAC = 0x2,
    DownloadCache = 0x4
}</span></span></pre>
<p><span style="font-size:x-small;"><br />
</span></p>
<pre class="code"><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">[</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Flags</span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">]
</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public enum </span></span><span style="background:black none repeat scroll 0 0;color:#b8a223;"><span style="font-size:x-small;font-family:Consolas;">AssemblyNameDisplayFlags
</span></span><span style="background:black none repeat scroll 0 0;color:white;"><span style="font-size:x-small;font-family:Consolas;">{
    VERSION = 0x01,
    CULTURE = 0x02,
    PUBLIC_KEY_TOKEN = 0x04,
    PROCESSORARCHITECTURE = 0x20,
    RETARGETABLE = 0x80,
    ALL = VERSION |
        CULTURE | PROCESSORARCHITECTURE |
        PUBLIC_KEY_TOKEN | RETARGETABLE
}</span></span></pre>
<h2>More to Come</h2>
<p>This is the tip of the iceberg so to speak. Here is a test case to show you what this now is doing and perhaps you can give us ideas where to take it. There is a lot of code. Should it be up on CodePlex? Google Code?  Your Environment Variables:</p>
<pre class="code"><span style="background:black none repeat scroll 0 0;color:white;">    <span style="font-size:x-small;font-family:Consolas;">   [</span></span><span style="background:black none repeat scroll 0 0;color:#2b91af;"><span style="font-size:x-small;font-family:Consolas;">Fact</span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">]
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public void </span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">should_show_my_env()
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">var </span><span style="background:black none repeat scroll 0 0;color:white;">sw = </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Stopwatch</span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">.StartNew();
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">var </span><span style="background:black none repeat scroll 0 0;color:white;">dirs = </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">from </span><span style="background:black none repeat scroll 0 0;color:white;">env </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">in </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">ThisBox</span><span style="background:black none repeat scroll 0 0;color:white;">.By&lt;</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">EnvironmentVariable</span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">&gt;()
                       </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">select </span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">env;
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">foreach </span><span style="background:black none repeat scroll 0 0;color:white;">(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">var </span><span style="background:black none repeat scroll 0 0;color:white;">s </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">in </span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">dirs)
            {
                </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Console</span><span style="background:black none repeat scroll 0 0;color:white;">.WriteLine(s.TypeOfEnv + </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">" " </span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">+ s.KeyName);
                </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Console</span><span style="background:black none repeat scroll 0 0;color:white;">.WriteLine(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">"  ==&gt;" </span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">+ s.Value);
            }
            </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Console</span><span style="background:black none repeat scroll 0 0;color:white;">.WriteLine(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">"Count : " </span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">+ dirs.Count());
            </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Console</span><span style="background:black none repeat scroll 0 0;color:white;">.WriteLine(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">"Search Took : " </span><span style="background:black none repeat scroll 0 0;color:white;">+ sw.ElapsedMilliseconds + </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">" ms"</span></span><span style="background:black none repeat scroll 0 0;color:white;"><span style="font-size:x-small;font-family:Consolas;">);
            sw.Stop();
        }</span></span></pre>
<p><span style="font-size:x-small;font-family:Consolas;">Let’s join our GAC with our registry!</span></p>
<p><span style="font-size:x-small;font-family:Consolas;">NOTE: we get 592 hits in 20 or so seconds… </span></p>
<pre class="code"><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">        [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Fact</span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">]
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public void </span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">should_join_policy_registry_section()
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">var </span><span style="background:black none repeat scroll 0 0;color:white;">sw = </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Stopwatch</span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">.StartNew();

            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">var </span><span style="background:black none repeat scroll 0 0;color:white;">result = </span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:#ecc03e;">from
                             </span><span style="background:black none repeat scroll 0 0;color:white;">gac </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">in </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">ThisBox</span><span style="background:black none repeat scroll 0 0;color:white;">.By&lt;</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">AssemblyDetail</span></span><span style="background:black none repeat scroll 0 0;color:white;"><span style="font-size:x-small;font-family:Consolas;">&gt;()
                         </span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:#ecc03e;">join
                             </span><span style="background:black none repeat scroll 0 0;color:white;">registryKey </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">in </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">ThisBox</span><span style="background:black none repeat scroll 0 0;color:white;">.By&lt;</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">RegistryKey</span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">&gt;() 

                         </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">on </span><span style="background:black none repeat scroll 0 0;color:white;">gac.MajorName </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">equals </span></span><span style="background:black none repeat scroll 0 0;color:white;"><span style="font-size:x-small;font-family:Consolas;">registryKey.FirstRegValue()

                         </span></span><span style="background:black none repeat scroll 0 0;color:#ecc03e;"><span style="font-size:x-small;font-family:Consolas;">select new
                                </span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">{
                                        gac, RegVal=registryKey.FirstRegValue()
                                };

            </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Console</span><span style="background:black none repeat scroll 0 0;color:white;">.WriteLine(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">"Count : " </span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">+ result.Count());
            sw.Stop();
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">foreach </span><span style="background:black none repeat scroll 0 0;color:white;">(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">var </span><span style="background:black none repeat scroll 0 0;color:white;">a </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">in </span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">result)
            {
                </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Console</span><span style="background:black none repeat scroll 0 0;color:white;">.WriteLine(a.gac.MajorName + </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">" == " </span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">+ a.RegVal);
                </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Console</span><span style="background:black none repeat scroll 0 0;color:white;">.WriteLine(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">" ==&gt;" </span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">+ a.gac.FullName);
            }

            </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Console</span><span style="background:black none repeat scroll 0 0;color:white;">.WriteLine(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">"Search Took : " </span><span style="background:black none repeat scroll 0 0;color:white;">+ sw.ElapsedMilliseconds + </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">" ms"</span></span><span style="background:black none repeat scroll 0 0;color:white;"><span style="font-size:x-small;font-family:Consolas;">);
        }</span>
</span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<h2>Appendix : A Few Extension Methods we Use<span style="background:black none repeat scroll 0 0;color:white;"> </span></h2>
<pre class="code"><span style="background:black none repeat scroll 0 0;color:white;">  </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">static class </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">LinqProviderTestExtensions
    </span><span style="background:black none repeat scroll 0 0;color:white;">{
        </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;summary&gt;
        /// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">Will perform each action for each
        </span><span style="background:black none repeat scroll 0 0;color:gray;">/// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">'row' in the included collection
        </span><span style="background:black none repeat scroll 0 0;color:gray;">/// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">Each 'row' is of Type TTreeNode
        </span><span style="background:black none repeat scroll 0 0;color:gray;">/// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">Will typically only be one action
        </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;/summary&gt;
        /// &lt;typeparam name=</span><span style="background:black none repeat scroll 0 0;color:#9feca5;">"T"</span><span style="background:black none repeat scroll 0 0;color:gray;">&gt;&lt;/typeparam&gt;
        /// &lt;param name=</span><span style="background:black none repeat scroll 0 0;color:#9feca5;">"items"</span><span style="background:black none repeat scroll 0 0;color:gray;">&gt;&lt;/param&gt;
        /// &lt;param name=</span><span style="background:black none repeat scroll 0 0;color:#9feca5;">"actions"</span><span style="background:black none repeat scroll 0 0;color:gray;">&gt;&lt;/param&gt;
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">static internal void </span><span style="background:black none repeat scroll 0 0;color:white;">ForEach&lt;T&gt;(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">this </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IEnumerable</span><span style="background:black none repeat scroll 0 0;color:white;">&lt;T&gt; items, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">params </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Action</span><span style="background:black none repeat scroll 0 0;color:white;">&lt;T&gt;[] actions)
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">foreach </span><span style="background:black none repeat scroll 0 0;color:white;">(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">var </span><span style="background:black none repeat scroll 0 0;color:white;">t </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">in </span><span style="background:black none repeat scroll 0 0;color:white;">items)
                </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">foreach </span><span style="background:black none repeat scroll 0 0;color:white;">(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">var </span><span style="background:black none repeat scroll 0 0;color:white;">act </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">in </span><span style="background:black none repeat scroll 0 0;color:white;">actions)
                    act.Invoke(t);
        }

        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public static string </span><span style="background:black none repeat scroll 0 0;color:white;">FirstRegValue(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">this </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">RegistryKey </span><span style="background:black none repeat scroll 0 0;color:white;">registryKey)
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:white;">registryKey.ValueCount &gt; 0
                           ? (</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">string</span><span style="background:black none repeat scroll 0 0;color:white;">) registryKey.GetValueNames().GetValue(0) : </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">String</span><span style="background:black none repeat scroll 0 0;color:white;">.Empty;
        }

        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public static double </span><span style="background:black none repeat scroll 0 0;color:white;">ToPercent(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">this int </span><span style="background:black none repeat scroll 0 0;color:white;">target, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">total)
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:white;">target.ToPercent((</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">double</span><span style="background:black none repeat scroll 0 0;color:white;">) total);
        }

        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public static </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">String </span><span style="background:black none repeat scroll 0 0;color:white;">ToPctString(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">this int </span><span style="background:black none repeat scroll 0 0;color:white;">target, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">total)
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:white;">target.ToPercent((</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">double</span><span style="background:black none repeat scroll 0 0;color:white;">) total) + </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">"%"</span><span style="background:black none repeat scroll 0 0;color:white;">;
        }

        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public static double </span><span style="background:black none repeat scroll 0 0;color:white;">ToPercent(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">this int </span><span style="background:black none repeat scroll 0 0;color:white;">target, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">double </span><span style="background:black none repeat scroll 0 0;color:white;">total)
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Math</span><span style="background:black none repeat scroll 0 0;color:white;">.Round((target/total)*100, 2);
        }
    }</span></pre>
<pre class="code"><span style="background:black none repeat scroll 0 0;color:white;">A huge Thanks:</span></pre>
<pre class="code"><a title="http://dotnetjunkies.com/WebLog/debasish/" href="http://dotnetjunkies.com/WebLog/debasish/" target="_blank">Debasish Bose</a></pre>
<pre class="code">
<div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:4996f79e-bdd5-4823-85e8-11fd4c706280" class="wlWriterSmartContent" style="display:inline;float:none;margin:0;padding:0;">del.icio.us Tags: <a rel="tag" href="http://del.icio.us/popular/Advanced+C%23">Advanced C#</a>,<a rel="tag" href="http://del.icio.us/popular/C%23+Unmanaged+Wrapper">C# Unmanaged Wrapper</a>,<a rel="tag" href="http://del.icio.us/popular/Fusion">Fusion</a>,<a rel="tag" href="http://del.icio.us/popular/GAC">GAC</a>,<a rel="tag" href="http://del.icio.us/popular/Global+Assembly+Cache">Global Assembly Cache</a>,<a rel="tag" href="http://del.icio.us/popular/IEnumerable">IEnumerable</a>,<a rel="tag" href="http://del.icio.us/popular/IEnumerator">IEnumerator</a>,<a rel="tag" href="http://del.icio.us/popular/Internals">Internals</a>,<a rel="tag" href="http://del.icio.us/popular/Lambada">Lambada</a>,<a rel="tag" href="http://del.icio.us/popular/Linq+to+Gac">Linq to Gac</a>,<a rel="tag" href="http://del.icio.us/popular/Linq+to+Objects">Linq to Objects</a>,<a rel="tag" href="http://del.icio.us/popular/Machine">Machine</a>,<a rel="tag" href="http://del.icio.us/popular/Registry">Registry</a></div>
<div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:d890b055-0d6b-4680-a4e0-6f7fb6c20546" class="wlWriterSmartContent" style="display:inline;float:none;margin:0;padding:0;">Technorati Tags: <a rel="tag" href="http://technorati.com/tags/Advanced+C%23">Advanced C#</a>,<a rel="tag" href="http://technorati.com/tags/C%23+Unmanaged+Wrapper">C# Unmanaged Wrapper</a>,<a rel="tag" href="http://technorati.com/tags/Fusion">Fusion</a>,<a rel="tag" href="http://technorati.com/tags/GAC">GAC</a>,<a rel="tag" href="http://technorati.com/tags/Global+Assembly+Cache">Global Assembly Cache</a>,<a rel="tag" href="http://technorati.com/tags/IEnumerable">IEnumerable</a>,<a rel="tag" href="http://technorati.com/tags/IEnumerator">IEnumerator</a>,<a rel="tag" href="http://technorati.com/tags/Internals">Internals</a>,<a rel="tag" href="http://technorati.com/tags/Lambada">Lambada</a>,<a rel="tag" href="http://technorati.com/tags/Linq+to+Gac">Linq to Gac</a>,<a rel="tag" href="http://technorati.com/tags/Linq+to+Objects">Linq to Objects</a>,<a rel="tag" href="http://technorati.com/tags/Machine">Machine</a>,<a rel="tag" href="http://technorati.com/tags/Registry">Registry</a></div>
</pre>
<h3>Related Posts</h3>
<div class="wlw_related_posts">from tag <a href="http://del.icio.us/damoncarr/Fusion">Fusion</a></p>
<ul>
<li><a href="http://blog.domaindotnet.com/2008/09/20/fusion_c_sharp_wrapper_for_linq_to_gac_access/">Linq to Gac : Use Linq to Power Query your Gac via this C# Bridge to Fusion « team domain.dot.net</a></li>
</ul>
<p>from tag <a href="http://del.icio.us/damoncarr/Lambada">Lambada</a></p>
<ul>
<li><a href="http://blog.domaindotnet.com/2008/07/24/linq-c-30-enumerable-extension-method-reference/">Linq C# 3.0 Enumerable Extension Method Reference « don’t give up on software just yet</a></li>
</ul>
<p>from tag <a href="http://del.icio.us/damoncarr/Linq">Linq</a></p>
<ul>
<li><a href="http://www.istartedsomething.com/20061029/royale-noir/">Royale Noir: secret XP theme uncovered (download) &#8211; istartedsomething</a></li>
<li><a href="/cifs/opt">linux</a></li>
<li><a href="http://www.google.co.uk/search?hl=en&amp;ie=UTF-8&amp;q=%s&amp;meta=cr%3DcountryUK%7CcountryGB">guk</a></li>
<li><a href="http://msdn2.microsoft.com/en-us/library/ms345135.aspx">Managed Data Access Inside SQL Server with ADO.NET and SQLCLR</a></li>
<li><a href="http://damon.agilefactor.com/feed">where(dev=&gt; Is.Broken(dev)).tryinject(commonsense)</a></li>
<li><a href="http://www.daveandal.net/articles/esbdocs/">Microsoft ESB Guidance (August 2007 CTP Release)</a></li>
<li><a href="http://pinguy.infogami.com/blog/210ee">What to Install After a Fresh XP Install (PinGUY&#8217;s Website)</a></li>
<li><a href="http://evanhoff.com/archive/2007/07/23/39.aspx">NHibernate SysCache Issues &#8211; Solved</a></li>
<li><a href="http://nightweed.com/printableusavotefacts.html">20 Amazing Facts About  Voting in the USA</a></li>
<li><a href="http://cdimage.ubuntu.com/kubuntu-kde4/releases/8.04/release/kubuntu-kde4-8.04.1-desktop-i386.iso">http://cdimage.ubuntu.com/kubuntu-kde4/releases/8.04/release/kubuntu-kde4-8.04.1-desktop-i386.iso</a></li>
<li><a href="http://feeds.feedburner.com/adaptiveblue/feed">BlueBlog</a></li>
<li><a href="http://damoncarr.freepolls.com/cgi-bin/util/site_admin">free Web polls</a></li>
<li><a href="http://code.google.com/">Developer Home &#8211; Google Code</a></li>
<li><a href="http://www.xmllab.net/mvpxml/">Mvp.Xml Library Documentation &#8211; Mvp.Xml.Common Namespace</a></li>
<li><a href="http://www.codeplex.com/esb">patterns &amp; practices Enterprise Service Bus Guidance &#8211; Home</a></li>
<li><a href="http://www.ifcfilms.com/">IFC Entertainment</a></li>
<li><a href="http://www.buildinglink.com/default.asp">BuildingLink</a></li>
<li><a href="http://msdn.microsoft.com/msdnmag/issues/07/02/SQLRegex/default.aspx">SQL Server 2005 Regular Expressions Make Pattern Matching</a></li>
</ul>
<p><a href="http://del.icio.us/damoncarr/Linq">(more..)</a></p>
</div>
<div class="wlWriterHeaderFooter" style="text-align:left;margin:0;padding:4px 0;"><a href="http://digg.com/submit?url=http%3a%2f%2fdcarr.wordpress.com%2f2008%2f09%2f20%2ffusion_c_sharp_wrapper_for_linq_to_gac_access%2f&amp;title=Linq+to+Gac+%3a+Use+Linq+to+Power+Query+your+Gac+via+this+C%23+Bridge+to+Fusion"><img style="border:0;" title="Digg This" src="http://digg.com/img/badges/100x20-digg-button.png" border="0" alt="Digg This" width="100" height="20" /></a></div>
<br />Posted in C# 3.0 Enhancements, C# 3.0 for Internal DSL, concepts implemented, Framework Design, Generics, Proof Driven Development, Software Design, Software Futures, Technology Tagged: CSharp, DomainDriven, Fusion, GAC, Global Assembly Cache, IEnumerable, IEnumerator, Internals, Lambada, Linq, Linq to Gac, Linq to Objects, Machine, Registry <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dcarr.wordpress.com/928/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dcarr.wordpress.com/928/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dcarr.wordpress.com/928/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dcarr.wordpress.com/928/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dcarr.wordpress.com/928/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dcarr.wordpress.com/928/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dcarr.wordpress.com/928/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dcarr.wordpress.com/928/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dcarr.wordpress.com/928/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dcarr.wordpress.com/928/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=928&subd=dcarr&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://team.pushbomb.com/2008/09/20/fusion_c_sharp_wrapper_for_linq_to_gac_access/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<georss:point>30.196311 -97.730807</georss:point>
		<geo:lat>30.196311</geo:lat>
		<geo:long>-97.730807</geo:long>
		<media:content url="http://1.gravatar.com/avatar/7b572cbcda5a17fe984e7dd1ddc9c3d6?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">pushbomb</media:title>
		</media:content>

		<media:content url="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fblog.domaindotnet.com%2f2008%2f09%2f20%2ffusion_c_sharp_wrapper_for_linq_to_gac_access%2f" medium="image">
			<media:title type="html">kick it on DotNetKicks.com</media:title>
		</media:content>

		<media:content url="http://digg.com/img/badges/100x20-digg-button.png" medium="image">
			<media:title type="html">Digg This</media:title>
		</media:content>

		<media:content url="http://dcarr.files.wordpress.com/2008/09/classdiagram2-thumb1.png" medium="image">
			<media:title type="html">ClassDiagram2</media:title>
		</media:content>

		<media:content url="http://digg.com/img/badges/100x20-digg-button.png" medium="image">
			<media:title type="html">Digg This</media:title>
		</media:content>
	</item>
		<item>
		<title>Linq .NET 3.5 Set Operations &#8211; Quick Reference</title>
		<link>http://team.pushbomb.com/2008/09/20/linq-c-30-enumerable-extension-method-reference/</link>
		<comments>http://team.pushbomb.com/2008/09/20/linq-c-30-enumerable-extension-method-reference/#comments</comments>
		<pubDate>Sat, 20 Sep 2008 15:41:00 +0000</pubDate>
		<dc:creator>Damon Wilder Carr</dc:creator>
				<category><![CDATA[C# 3.0 Enhancements]]></category>
		<category><![CDATA[C# 3.0 for Internal DSL]]></category>
		<category><![CDATA[Framework Design]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[.NET 3.5]]></category>
		<category><![CDATA[C# 3.0]]></category>
		<category><![CDATA[Enumerable]]></category>
		<category><![CDATA[extended clauses]]></category>
		<category><![CDATA[HashSet]]></category>
		<category><![CDATA[IEnumerable]]></category>
		<category><![CDATA[Lambada]]></category>
		<category><![CDATA[Linq]]></category>
		<category><![CDATA[linq clauses]]></category>
		<category><![CDATA[nhibernate]]></category>
		<category><![CDATA[select clause syntax]]></category>

		<guid isPermaLink="false">http://blog.domaindotnet.com/?p=505</guid>
		<description><![CDATA[Reference to bassic select clause style as well as extnded enumerable extension method style (for in-line non-sql style synax)<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=505&subd=dcarr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<table style="height:416px;" border="0" width="417">
<tbody>
<tr>
<th></th>
</tr>
<tr>
<td align="right" valign="top"><a id="ctl00_mainContentContainer_ctl23" href="http://msdn.microsoft.com/en-us/library/bb383978%28printer%29.aspx">from</a></td>
<td width="369" valign="top">Specifies a data source and a range variable (similar to an iteration variable).</td>
</tr>
<tr>
<td align="right" valign="top"><a id="ctl00_mainContentContainer_ctl24" href="http://msdn.microsoft.com/en-us/library/bb311043%28printer%29.aspx">where</a></td>
<td width="369" valign="top">Filters source elements based on one or more Boolean expressions separated by logical AND and OR operators ( &amp;&amp; or || ).</td>
</tr>
<tr>
<td align="right" valign="top"><a id="ctl00_mainContentContainer_ctl25" href="http://msdn.microsoft.com/en-us/library/bb384087%28printer%29.aspx">select</a></td>
<td valign="top">Specifies the type and shape that the elements in the returned sequence will have when the query is executed.</td>
</tr>
<tr>
<td align="right" valign="top"><a id="ctl00_mainContentContainer_ctl26" href="http://msdn.microsoft.com/en-us/library/bb384063%28printer%29.aspx">group</a></td>
<td valign="top">Groups query results according to a specified key value.</td>
</tr>
<tr>
<td width="185" align="right" valign="top"><a id="ctl00_mainContentContainer_ctl27" href="http://msdn.microsoft.com/en-us/library/bb311045%28printer%29.aspx">into</a></td>
<td width="369" valign="top">Provides an identifier that can serve as a reference to the results of a join, group or select clause.</td>
</tr>
<tr>
<td width="185" align="right" valign="top"><a id="ctl00_mainContentContainer_ctl28" href="http://msdn.microsoft.com/en-us/library/bb383982%28printer%29.aspx">orderby</a></td>
<td width="369" valign="top">Sorts query results in ascending or descending order based on the default comparer for the element type.</td>
</tr>
<tr>
<td width="185" align="right" valign="top"><a id="ctl00_mainContentContainer_ctl29" href="http://msdn.microsoft.com/en-us/library/bb311040%28printer%29.aspx">join</a></td>
<td width="369" valign="top">Joins two data sources based on an equality comparison between two specified matching criteria. from category in categories join prod in products on category.ID equals prod.CategoryID select new { ProductName = prod.Name, Category = category.Name };</td>
</tr>
<tr>
<td width="185" align="right" valign="top"><a id="ctl00_mainContentContainer_ctl30" href="http://msdn.microsoft.com/en-us/library/bb383976%28printer%29.aspx">let</a></td>
<td width="369" valign="top">Introduces a range variable to store sub-expression results in a query expression.</td>
</tr>
<tr>
<td width="185" align="right" valign="top"><a id="ctl00_mainContentContainer_ctl31" href="http://msdn.microsoft.com/en-us/library/cc713603%28printer%29.aspx">in</a></td>
<td width="369" valign="top">Contextual in a <a id="ctl00_mainContentContainer_ctl32" href="http://msdn.microsoft.com/en-us/library/bb311040%28printer%29.aspx">join</a></td>
</tr>
<tr>
<td width="185" align="right" valign="top"><a id="ctl00_mainContentContainer_ctl33" href="http://msdn.microsoft.com/en-us/library/cc713588%28printer%29.aspx">on</a></td>
<td width="369" valign="top">Contextual in a <a id="ctl00_mainContentContainer_ctl34" href="http://msdn.microsoft.com/en-us/library/bb311040%28printer%29.aspx">join</a></td>
</tr>
<tr>
<td width="185" align="right" valign="top"><a id="ctl00_mainContentContainer_ctl35" href="http://msdn.microsoft.com/en-us/library/cc713644%28printer%29.aspx">equals</a></td>
<td width="369" valign="top">Contextual in a <a id="ctl00_mainContentContainer_ctl36" href="http://msdn.microsoft.com/en-us/library/bb311040%28printer%29.aspx">join</a></td>
</tr>
<tr>
<td width="185" align="right" valign="top"><a id="ctl00_mainContentContainer_ctl37" href="http://msdn.microsoft.com/en-us/library/cc713645%28printer%29.aspx">by</a></td>
<td width="369" valign="top">Contextual in a <a id="ctl00_mainContentContainer_ctl38" href="http://msdn.microsoft.com/en-us/library/bb384063%28printer%29.aspx">group</a></td>
</tr>
<tr>
<td width="185" align="right" valign="top"><a id="ctl00_mainContentContainer_ctl39" href="http://msdn.microsoft.com/en-us/library/cc713606%28printer%29.aspx">ascending</a></td>
<td width="369" valign="top">Contextual in an <a id="ctl00_mainContentContainer_ctl40" href="http://msdn.microsoft.com/en-us/library/bb383982%28printer%29.aspx">orderby</a></td>
</tr>
<tr>
<td width="185" align="right" valign="top"><a id="ctl00_mainContentContainer_ctl41" href="http://msdn.microsoft.com/en-us/library/cc713622%28printer%29.aspx">descending</a></td>
<td width="369" valign="top">Contextual in an <a id="ctl00_mainContentContainer_ctl42" href="http://msdn.microsoft.com/en-us/library/bb383982%28printer%29.aspx">orderby</a></td>
</tr>
</tbody>
</table>
<table style="height:1588px;" border="0" width="416">
<tbody>
<tr>
<td style="text-align:right;"><a href="http://msdn.microsoft.com/en-us/library/system.linq.enumerable.aggregate.aspx">Aggregate</a></td>
<td>Applies an accumulator function over a sequence.</td>
</tr>
<tr>
<td style="text-align:right;"><a href="http://msdn.microsoft.com/en-us/library/bb548541.aspx">All&lt;TSource&gt;</a></td>
<td style="padding-left:8px;padding-right:8px;" width="398">Determines whether all elements of a sequence satisfy a condition.</td>
</tr>
<tr style="height:26px;">
<td style="padding-left:8px;padding-right:8px;" width="157" align="right">
<p style="text-align:right;"><a href="http://msdn.microsoft.com/en-us/library/system.linq.enumerable.any.aspx">Any</a></p>
</td>
<td style="padding-left:8px;padding-right:8px;" width="398">Determines whether any element of a sequence exists or satisfies a condition.</td>
</tr>
<tr style="height:26px;">
<td style="padding-left:8px;padding-right:8px;" width="157" align="right">
<p style="text-align:right;"><a href="http://msdn.microsoft.com/en-us/library/bb335435.aspx">AsEnumerable&lt;TSource&gt;</a></p>
</td>
<td style="padding-left:8px;padding-right:8px;" width="398">Returns the input typed as <a>IEnumerable&lt;T&gt;.</a></td>
</tr>
<tr style="height:26px;">
<td style="padding-left:8px;padding-right:8px;" width="157" align="right">
<p style="text-align:right;"><a href="http://msdn.microsoft.com/en-us/library/system.linq.enumerable.average.aspx">Average</a></p>
</td>
<td style="padding-left:8px;padding-right:8px;" width="398">Computes the average of a sequence of numeric values.</td>
</tr>
<tr style="height:26px;">
<td style="padding-left:8px;padding-right:8px;" width="157" align="right">
<p style="text-align:right;"><a href="http://msdn.microsoft.com/en-us/library/bb341406.aspx">Cast&lt;TResult&gt;</a></p>
</td>
<td style="padding-left:8px;padding-right:8px;" width="398">Converts the elements of an <a>IEnumerable to the specified type.</a></td>
</tr>
<tr style="height:26px;">
<td style="padding-left:8px;padding-right:8px;" width="157" align="right">
<p style="text-align:right;"><a href="http://msdn.microsoft.com/en-us/library/bb302894.aspx">Concat&lt;TSource&gt;</a></p>
</td>
<td style="padding-left:8px;padding-right:8px;" width="398">Concatenates two sequences.</td>
</tr>
<tr style="height:26px;">
<td style="padding-left:8px;padding-right:8px;" width="157" align="right">
<p style="text-align:right;"><a href="http://msdn.microsoft.com/en-us/library/system.linq.enumerable.contains.aspx">Contains</a></p>
</td>
<td style="padding-left:8px;padding-right:8px;" width="398">Determines whether a sequence contains a specified element.</td>
</tr>
<tr style="height:26px;">
<td style="padding-left:8px;padding-right:8px;" width="157" align="right">
<p style="text-align:right;"><a href="http://msdn.microsoft.com/en-us/library/system.linq.enumerable.count.aspx">Count</a></p>
</td>
<td style="padding-left:8px;padding-right:8px;" width="398">Returns the number of elements in a sequence.</td>
</tr>
<tr style="height:26px;">
<td style="padding-left:8px;padding-right:8px;" width="157" align="right">
<p style="text-align:right;"><a href="http://msdn.microsoft.com/en-us/library/system.linq.enumerable.defaultifempty.aspx">DefaultIfEmpty</a></p>
</td>
<td style="padding-left:8px;padding-right:8px;" width="398">Returns the elements of an <a>IEnumerable&lt;T&gt;, or a default valued singleton collection if the sequence is empty.</a></td>
</tr>
<tr style="height:26px;">
<td style="padding-left:8px;padding-right:8px;" width="157" align="right">
<p style="text-align:right;"><a href="http://msdn.microsoft.com/en-us/library/system.linq.enumerable.distinct.aspx">Distinct</a></p>
</td>
<td style="padding-left:8px;padding-right:8px;" width="398">Returns distinct elements from a sequence.</td>
</tr>
<tr style="height:26px;">
<td style="padding-left:8px;padding-right:8px;" width="157" align="right">
<p style="text-align:right;"><a href="http://msdn.microsoft.com/en-us/library/bb299233.aspx">ElementAt&lt;TSource&gt;</a></p>
</td>
<td style="padding-left:8px;padding-right:8px;" width="398">Returns the element at a specified index in a sequence.</td>
</tr>
<tr style="height:26px;">
<td style="padding-left:8px;padding-right:8px;" width="157" align="right">
<p style="text-align:right;"><a href="http://msdn.microsoft.com/en-us/library/bb494386.aspx">ElementAtOrDefault</a></p>
<p>&lt;TSource&gt;</td>
<td style="padding-left:8px;padding-right:8px;" width="398">Returns the element at a specified index in a sequence or a default value if the index is out of range.</td>
</tr>
<tr style="height:26px;">
<td style="padding-left:8px;padding-right:8px;" width="157" align="right">
<p style="text-align:right;"><a href="http://msdn.microsoft.com/en-us/library/bb341042.aspx">Empty&lt;TResult&gt;</a></p>
</td>
<td style="padding-left:8px;padding-right:8px;" width="398">Returns an empty <a>IEnumerable&lt;(Of &lt;(T&gt;)&gt;) that has the specified type argument.</a></td>
</tr>
<tr style="height:26px;">
<td style="padding-left:8px;padding-right:8px;" width="157" align="right">
<p style="text-align:right;"><a href="http://msdn.microsoft.com/en-us/library/system.linq.enumerable.except.aspx">Except</a></p>
</td>
<td style="padding-left:8px;padding-right:8px;" width="398">Produces the set difference of two sequences.</td>
</tr>
<tr style="height:26px;">
<td style="padding-left:8px;padding-right:8px;" width="157" align="right">
<p style="text-align:right;"><a href="http://msdn.microsoft.com/en-us/library/system.linq.enumerable.first.aspx">First</a></p>
</td>
<td style="padding-left:8px;padding-right:8px;" width="398">Returns the first element of a sequence.</td>
</tr>
<tr style="height:26px;">
<td style="padding-left:8px;padding-right:8px;" width="157" align="right">
<p style="text-align:right;"><a href="http://msdn.microsoft.com/en-us/library/system.linq.enumerable.firstordefault.aspx">FirstOrDefault</a></p>
</td>
<td style="padding-left:8px;padding-right:8px;" width="398">Returns the first element of a sequence, or a default value if no element is found.</td>
</tr>
<tr style="height:26px;">
<td style="padding-left:8px;padding-right:8px;" width="157" align="right">
<p style="text-align:right;"><a href="http://msdn.microsoft.com/en-us/library/system.linq.enumerable.groupby.aspx">GroupBy</a></p>
</td>
<td style="padding-left:8px;padding-right:8px;" width="398">Groups the elements of a sequence.</td>
</tr>
<tr style="height:26px;">
<td style="padding-left:8px;padding-right:8px;" width="157" align="right">
<p style="text-align:right;"><a href="http://msdn.microsoft.com/en-us/library/system.linq.enumerable.groupjoin.aspx">GroupJoin</a></p>
</td>
<td style="padding-left:8px;padding-right:8px;" width="398">Correlates the elements of two sequences based on key equality, and groups the results.</td>
</tr>
<tr style="height:26px;">
<td style="padding-left:8px;padding-right:8px;" width="157" align="right">
<p style="text-align:right;"><a href="http://msdn.microsoft.com/en-us/library/system.linq.enumerable.intersect.aspx">Intersect</a></p>
</td>
<td style="padding-left:8px;padding-right:8px;" width="398">Produces the set intersection of two sequences.</td>
</tr>
<tr style="height:26px;">
<td style="padding-left:8px;padding-right:8px;" width="157" align="right">
<p style="text-align:right;"><a href="http://msdn.microsoft.com/en-us/library/system.linq.enumerable.join.aspx">Join</a></p>
</td>
<td style="padding-left:8px;padding-right:8px;" width="398">
<p style="text-align:left;">Correlates the elements of two sequences based on matching keys.</p>
</td>
</tr>
<tr style="height:26px;">
<td style="padding-left:8px;padding-right:8px;" width="157" align="right">
<p style="text-align:right;"><a href="http://msdn.microsoft.com/en-us/library/system.linq.enumerable.last.aspx">Last</a></p>
</td>
<td style="padding-left:8px;padding-right:8px;" width="398">Returns the last element of a sequence.</td>
</tr>
<tr style="height:26px;">
<td style="padding-left:8px;padding-right:8px;" width="157" align="right">
<p style="text-align:right;"><a href="http://msdn.microsoft.com/en-us/library/system.linq.enumerable.lastordefault.aspx">LastOrDefault</a></p>
</td>
<td style="padding-left:8px;padding-right:8px;" width="398">Returns the last element of a sequence, or a default value if no element is found.</td>
</tr>
<tr style="height:26px;">
<td style="padding-left:8px;padding-right:8px;" width="157" align="right">
<p style="text-align:right;"><a href="http://msdn.microsoft.com/en-us/library/system.linq.enumerable.longcount.aspx">LongCount</a></p>
</td>
<td style="padding-left:8px;padding-right:8px;" width="398">Returns an <a>Int64 that represents the number of elements in a sequence.</a></td>
</tr>
<tr style="height:26px;">
<td style="padding-left:8px;padding-right:8px;" width="157" align="right">
<p style="text-align:right;"><a href="http://msdn.microsoft.com/en-us/library/system.linq.enumerable.max.aspx">Max</a></p>
</td>
<td style="padding-left:8px;padding-right:8px;" width="398">Returns the maximum value in a sequence of values.</td>
</tr>
<tr style="height:26px;">
<td style="padding-left:8px;padding-right:8px;" width="157" align="right">
<p style="text-align:right;"><a href="http://msdn.microsoft.com/en-us/library/system.linq.enumerable.min.aspx">Min</a></p>
</td>
<td style="padding-left:8px;padding-right:8px;" width="398">Returns the minimum value in a sequence of values.</td>
</tr>
<tr style="height:26px;">
<td style="padding-left:8px;padding-right:8px;" width="157" align="right">
<p style="text-align:right;"><a href="http://msdn.microsoft.com/en-us/library/bb360913.aspx">OfType&lt;TResult&gt;</a></p>
</td>
<td style="padding-left:8px;padding-right:8px;" width="398">Filters the elements of an <a>IEnumerable based on a specified type.</a></td>
</tr>
<tr style="height:26px;">
<td style="padding-left:8px;padding-right:8px;" width="157" align="right">
<p style="text-align:right;"><a href="http://msdn.microsoft.com/en-us/library/system.linq.enumerable.orderby.aspx">OrderBy</a></p>
</td>
<td style="padding-left:8px;padding-right:8px;" width="398">Sorts the elements of a sequence in ascending order.</td>
</tr>
<tr style="height:26px;">
<td style="padding-left:8px;padding-right:8px;" width="157" align="right">
<p style="text-align:right;"><a href="http://msdn.microsoft.com/en-us/library/system.linq.enumerable.orderbydescending.aspx">OrderByDescending</a></p>
</td>
<td style="padding-left:8px;padding-right:8px;" width="398">Sorts the elements of a sequence in descending order.</td>
</tr>
<tr style="height:26px;">
<td style="padding-left:8px;padding-right:8px;" width="157" align="right">
<p style="text-align:right;"><a href="http://msdn.microsoft.com/en-us/library/system.linq.enumerable.range.aspx">Range</a></p>
</td>
<td style="padding-left:8px;padding-right:8px;" width="398">Generates a sequence of integral numbers within a specified range.</td>
</tr>
<tr style="height:26px;">
<td style="padding-left:8px;padding-right:8px;" width="157" align="right">
<p style="text-align:right;"><a href="http://msdn.microsoft.com/en-us/library/bb348899.aspx">Repeat&lt;TResult&gt;</a></p>
</td>
<td style="padding-left:8px;padding-right:8px;" width="398">Generates a sequence that contains one repeated value.</td>
</tr>
<tr style="height:26px;">
<td style="padding-left:8px;padding-right:8px;" width="157" align="right">
<p style="text-align:right;"><a href="http://msdn.microsoft.com/en-us/library/bb358497.aspx">Reverse&lt;TSource&gt;</a></p>
</td>
<td style="padding-left:8px;padding-right:8px;" width="398">Inverts the order of the elements in a sequence.</td>
</tr>
<tr style="height:26px;">
<td style="padding-left:8px;padding-right:8px;" width="157" align="right">
<p style="text-align:right;"><a href="http://msdn.microsoft.com/en-us/library/system.linq.enumerable.select.aspx">Select</a></p>
</td>
<td style="padding-left:8px;padding-right:8px;" width="398">Projects each element of a sequence into a new form.</td>
</tr>
<tr style="height:26px;">
<td style="padding-left:8px;padding-right:8px;" width="157" align="right">
<p style="text-align:right;"><a href="http://msdn.microsoft.com/en-us/library/system.linq.enumerable.selectmany.aspx">SelectMany</a></p>
</td>
<td style="padding-left:8px;padding-right:8px;" width="398">Projects each element of a sequence to an <a>IEnumerable&lt;T&gt; and flattens the resulting sequences into one sequence.</a></td>
</tr>
<tr style="height:26px;">
<td style="padding-left:8px;padding-right:8px;" width="157" align="right">
<p style="text-align:right;"><a href="http://msdn.microsoft.com/en-us/library/system.linq.enumerable.sequenceequal.aspx">SequenceEqual</a></p>
</td>
<td style="padding-left:8px;padding-right:8px;" width="398">Determines whether two sequences are equal according to an equality comparer.</td>
</tr>
<tr style="height:26px;">
<td style="padding-left:8px;padding-right:8px;" width="157" align="right">
<p style="text-align:right;"><a href="http://msdn.microsoft.com/en-us/library/system.linq.enumerable.single.aspx">Single</a></p>
</td>
<td style="padding-left:8px;padding-right:8px;" width="398">Returns a single, specific element of a sequence of values.</td>
</tr>
<tr style="height:26px;">
<td style="padding-left:8px;padding-right:8px;" width="157" align="right">
<p style="text-align:right;"><a href="http://msdn.microsoft.com/en-us/library/system.linq.enumerable.singleordefault.aspx">SingleOrDefault</a></p>
</td>
<td style="padding-left:8px;padding-right:8px;" width="398">Returns a single, specific element of a sequence of values, or a default value if no such element is found.</td>
</tr>
<tr style="height:26px;">
<td style="padding-left:8px;padding-right:8px;" width="157" align="right">
<p style="text-align:right;"><a href="http://msdn.microsoft.com/en-us/library/bb358985.aspx">Skip&lt;TSource&gt;</a></p>
</td>
<td style="padding-left:8px;padding-right:8px;" width="398">Bypasses a specified number of elements in a sequence and then returns the remaining elements.</td>
</tr>
<tr style="height:26px;">
<td style="padding-left:8px;padding-right:8px;" width="157" align="right">
<p style="text-align:right;"><a href="http://msdn.microsoft.com/en-us/library/system.linq.enumerable.skipwhile.aspx">SkipWhile</a></p>
</td>
<td style="padding-left:8px;padding-right:8px;" width="398">Bypasses elements in a sequence as long as a specified condition is true and then returns the remaining elements.</td>
</tr>
<tr style="height:26px;">
<td style="padding-left:8px;padding-right:8px;" width="157" align="right">
<p style="text-align:right;"><a href="http://msdn.microsoft.com/en-us/library/system.linq.enumerable.sum.aspx">Sum</a></p>
</td>
<td style="padding-left:8px;padding-right:8px;" width="398">Computes the sum of a sequence of numeric values.</td>
</tr>
<tr style="height:26px;">
<td style="padding-left:8px;padding-right:8px;" width="157" align="right">
<p style="text-align:right;">Take&lt;TSource&gt;</p>
</td>
<td style="padding-left:8px;padding-right:8px;" width="398">Returns a specified number of contiguous elements from the start of a sequence.</td>
</tr>
<tr style="height:26px;">
<td style="padding-left:8px;padding-right:8px;" width="157" align="right">
<p style="text-align:right;"><a href="http://msdn.microsoft.com/en-us/library/system.linq.enumerable.takewhile.aspx">TakeWhile</a></p>
</td>
<td style="padding-left:8px;padding-right:8px;" width="398">Returns elements from a sequence as long as a specified condition is true, and then skips the remaining elements.</td>
</tr>
<tr style="height:26px;">
<td style="padding-left:8px;padding-right:8px;" width="157" align="right">
<p style="text-align:right;"><a href="http://msdn.microsoft.com/en-us/library/system.linq.enumerable.thenby.aspx">ThenBy</a></p>
</td>
<td style="padding-left:8px;padding-right:8px;" width="398">Performs a subsequent ordering of the elements in a sequence in ascending order.</td>
</tr>
<tr style="height:26px;">
<td style="padding-left:8px;padding-right:8px;" width="157" align="right">
<p style="text-align:right;"><a href="http://msdn.microsoft.com/en-us/library/system.linq.enumerable.thenbydescending.aspx">ThenByDescending</a></p>
</td>
<td style="padding-left:8px;padding-right:8px;" width="398">Performs a subsequent ordering of the elements in a sequence in descending order.</td>
</tr>
<tr style="height:26px;">
<td style="padding-left:8px;padding-right:8px;" width="157" align="right">
<p style="text-align:right;"><a href="http://msdn.microsoft.com/en-us/library/bb298736.aspx">ToArray&lt;TSource&gt;</a></p>
</td>
<td style="padding-left:8px;padding-right:8px;" width="398">Creates an array from a <a>IEnumerable&lt;T&gt;.</a></td>
</tr>
<tr style="height:26px;">
<td style="padding-left:8px;padding-right:8px;" width="157" align="right">
<p style="text-align:right;"><a href="http://msdn.microsoft.com/en-us/library/system.linq.enumerable.todictionary.aspx">ToDictionary</a></p>
</td>
<td style="padding-left:8px;padding-right:8px;" width="398">Creates a <a>Dictionary&lt;TKey, TValue&gt; from an </a><a>IEnumerable&lt;T&gt;.</a></td>
</tr>
<tr style="height:26px;">
<td style="padding-left:8px;padding-right:8px;" width="157" align="right">
<p style="text-align:right;"><a href="http://msdn.microsoft.com/en-us/library/bb342261.aspx">ToList&lt;TSource&gt;</a></p>
</td>
<td style="padding-left:8px;padding-right:8px;" width="398">Creates a <a>List&lt;T&gt; from an </a><a>IEnumerable&lt;T&gt;.</a></td>
</tr>
<tr style="height:26px;">
<td style="padding-left:8px;padding-right:8px;" width="157" align="right">
<p style="text-align:right;"><a href="http://msdn.microsoft.com/en-us/library/system.linq.enumerable.tolookup.aspx">ToLookup</a></p>
</td>
<td style="padding-left:8px;padding-right:8px;" width="398">Creates a generic <a>Lookup&lt;TKey, TElement&gt; from an </a><a>IEnumerable&lt;T&gt;.</a></td>
</tr>
<tr style="height:26px;">
<td style="padding-left:8px;padding-right:8px;" width="157" align="right">
<p style="text-align:right;"><a href="http://msdn.microsoft.com/en-us/library/system.linq.enumerable.union.aspx">Union</a></p>
</td>
<td style="padding-left:8px;padding-right:8px;" width="398">Produces the set union of two sequences.</td>
</tr>
<tr style="height:5px;">
<td style="border-bottom:#f79646 1pt solid;padding-left:8px;padding-right:8px;" width="157" align="right">
<p style="text-align:right;"><a href="http://msdn.microsoft.com/en-us/library/system.linq.enumerable.where.aspx">Where</a></p>
</td>
<td style="border-bottom:#f79646 1pt solid;padding-left:8px;padding-right:8px;" width="398">Filters a sequence of values based on a predicate.</td>
</tr>
</tbody>
</table>
<p><a href="http://en.wikipedia.org/wiki/Linq" target="_blank">Linq</a> on Wikipedia</p>
<div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:14ea0115-bcad-4409-87b5-213082fe0f68" class="wlWriterSmartContent" style="display:inline;float:none;margin:0;padding:0;">Technorati Tags: <a rel="tag" href="http://technorati.com/tags/Linq+to+Objects">Linq to Objects</a>,<a rel="tag" href="http://technorati.com/tags/Linq">Linq</a>,<a rel="tag" href="http://technorati.com/tags/Expressions">Expressions</a>,<a rel="tag" href="http://technorati.com/tags/Enumerable">Enumerable</a>,<a rel="tag" href="http://technorati.com/tags/IEnumerable%3cT%3e">IEnumerable&lt;T&gt;</a>,<a rel="tag" href="http://technorati.com/tags/C%23">C#</a>,<a rel="tag" href="http://technorati.com/tags/.NET+3.5">.NET 3.5</a>,<a rel="tag" href="http://technorati.com/tags/Fluent+API">Fluent API</a></div>
<div class="wlWriterHeaderFooter" style="text-align:left;margin:0;padding:4px 0;"><a href="http://digg.com/submit?url=http%3a%2f%2fdcarr.wordpress.com%2f2008%2f09%2f20%2flinq-c-30-enumerable-extension-method-reference%2f&amp;title=Linq+.NET+3.5+Set+Operations+-+Quick+Reference"><img style="border:0;" title="Digg This" src="http://digg.com/img/badges/100x20-digg-button.png" border="0" alt="Digg This" width="100" height="20" /></a></div>
<br />Posted in C# 3.0 Enhancements, C# 3.0 for Internal DSL, Framework Design, Technology Tagged: .NET 3.5, C# 3.0, Enumerable, extended clauses, HashSet, IEnumerable, Lambada, Linq, linq clauses, nhibernate, select clause syntax <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dcarr.wordpress.com/505/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dcarr.wordpress.com/505/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dcarr.wordpress.com/505/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dcarr.wordpress.com/505/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dcarr.wordpress.com/505/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dcarr.wordpress.com/505/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dcarr.wordpress.com/505/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dcarr.wordpress.com/505/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dcarr.wordpress.com/505/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dcarr.wordpress.com/505/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=505&subd=dcarr&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://team.pushbomb.com/2008/09/20/linq-c-30-enumerable-extension-method-reference/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7b572cbcda5a17fe984e7dd1ddc9c3d6?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">pushbomb</media:title>
		</media:content>

		<media:content url="http://digg.com/img/badges/100x20-digg-button.png" medium="image">
			<media:title type="html">Digg This</media:title>
		</media:content>
	</item>
		<item>
		<title>Linq to Financial Markets : Optimizing Provider to Real-Time Quotes, Analytics, and Silverlight-WPF Visualization</title>
		<link>http://team.pushbomb.com/2008/09/18/linq-to-financial-markets-optimizing-provider-to-real-time-quotes-analytics-and-silverlight-wpf-visualization/</link>
		<comments>http://team.pushbomb.com/2008/09/18/linq-to-financial-markets-optimizing-provider-to-real-time-quotes-analytics-and-silverlight-wpf-visualization/#comments</comments>
		<pubDate>Thu, 18 Sep 2008 15:36:20 +0000</pubDate>
		<dc:creator>Damon Wilder Carr</dc:creator>
				<category><![CDATA[C# 3.0 Enhancements]]></category>
		<category><![CDATA[C# 3.0 for Internal DSL]]></category>
		<category><![CDATA[Financial Services]]></category>
		<category><![CDATA[Framework Design]]></category>
		<category><![CDATA[Linq]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[software as strategic]]></category>
		<category><![CDATA[Batched]]></category>
		<category><![CDATA[C# 3.0]]></category>
		<category><![CDATA[Custom Provider]]></category>
		<category><![CDATA[Domain Specific Language]]></category>
		<category><![CDATA[dsl]]></category>
		<category><![CDATA[Expression Tree Parse]]></category>
		<category><![CDATA[Financial Engineering]]></category>
		<category><![CDATA[Lambada]]></category>
		<category><![CDATA[Nasdaq]]></category>
		<category><![CDATA[Parsed Expressions]]></category>
		<category><![CDATA[Portfolio Optimization]]></category>
		<category><![CDATA[SOA]]></category>
		<category><![CDATA[Visitor]]></category>
		<category><![CDATA[Web Services]]></category>
		<category><![CDATA[XIgnite]]></category>

		<guid isPermaLink="false">http://dcarr.wordpress.com/?p=727</guid>
		<description><![CDATA[The Linq to Financial Markets provider An easier way to consume, visualize, understand and quantify just about any information you can imagine from the world of global financial services. Real-Time stock quotes to Complex Analytics of Multi-Asset Class Portfolios  Monte-Carlo simulation with Optional Quantitative Add-Ins Efficient frontier Optimization based on Constraints you Set User defined heuristics from strategic rebalancing to day-trading<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=727&subd=dcarr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<h3><a href="http://en.wikipedia.org/wiki/Language_Integrated_Query" target="_blank"><strong>Linq</strong></a><strong> to Financial Markets</strong></h3>
<p>An easier way to consume, visualize, understand and quantify just about any information you can imagine from the world of global financial services.</p>
<ul>
<li>Delayed Quotes to Real-Time Portfolio Analytics</li>
<li>Simulation Engine with Strategy Add-Ins (Monte-Carlo, etc)</li>
<li>Efficient Frontier Optimization : N-Dimension Constraint Option</li>
<li>User defined heuristics from strategic rebalancing to day-trading</li>
</ul>
<p><em></em></p>
<p>Thanks to <a href="http://msdn.microsoft.com/en-us/netframework/aa904594.aspx">Microsoft&#8217;s Linq technology (introduced in the .NET 3.5 platform)</a>, the code in the image is real. It&#8217;s<a href="http://blogs.msdn.com/charlie/archive/2008/06/16/cut-development-time-use-linq.aspx"> well established that by making things easier and more &#8216;declarative&#8217; overall productivity goes up</a>.</p>
<p><a href="http://www.xignite.com/"><img class="alignnone size-full wp-image-748" style="display:inline;margin:10px 0 10px 20px;" src="http://dcarr.files.wordpress.com/2008/08/xignite_logo_anim.gif?w=336&#038;h=80" alt="" width="336" height="80" align="right" /></a></p>
<blockquote>
<p align="right"><span style="font-size:x-small;">Quality improves and most importantly bandwidth increases significantly in focusing on ‘what is important’ not ‘what is tedious’.</span></p>
</blockquote>
<p><em>In the case above we get the items in our portfolio now priced (using a real-time feed) below their 90 day moving average. You can &#8216;inject&#8217; added information as we do above for history. Another option would be to inject some &#8216;predictive&#8217; numbers using a simulation technique.</em></p>
<p><em></em></p>
<p><a href="http://blogs.msdn.com/charlie/archive/2008/02/28/link-to-everything-a-list-of-linq-providers.aspx">There are many Linq providers</a>, however most are &#8216;technology focused&#8217; such as dealing with protocols or platform APIs. We have always been the most interested in solving the harder problems driven from the business perspective. Although there are many technologies involved here, the larger difficulty is making it available in whatever way you would like to see it, across a broad set of dimensions well beyond any technology constraint.</p>
<p>We support more then just &#8216;detail&#8217; information, You can use aggregate style commands (say you want to to get you assets for a pie chart that displays asset class holdings in percent).</p>
<p>If you then wanted to drill-down, you could use the same asset class information in a &#8216;where&#8217; clause to limit the detail to just what you own in that class. But moving well beyond &#8216;SQL&#8217; type logic, you can set up monitoring alerts that take action if/when a trigger is met.</p>
<p>The key is the same simple syntax is used for all data providers across all levels of information, including full-text scans and a new feature we&#8217;re working on now for a future release incorporating an even easier natural language syntax.</p>
<p>This platform is not a fundamentally new way to calculate or retrieve this information. We&#8217;ve had access to many frameworks, API&#8217;s, data providers, etc. for a long time now.<img class="alignright size-full wp-image-700" style="display:inline;margin:15px 0 10px 35px;" src="http://dcarr.files.wordpress.com/2008/08/techsmithwor5c.png?w=238&#038;h=131" alt="" width="238" height="131" align="right" /></p>
<p>What this Linq provider does however, it change the dynamics of complexity, time to market, assumed costs in maintenance and testing, and much more. This offering&#8217;s goal is to make problems in this domain become utterly trivial. Our goal is to empower your team to make trivial what was previously arduous.</p>
<p>You&#8217;re about to &#8216;declare&#8217; what you want, rather then describe each step in the process. If your thinking it looks a lot like &#8216;SQL&#8217; you&#8217;re 100% correct. However SQL could never achieve what Linq provides.</p>
<blockquote>
<p style="text-align:center;"> </p>
</blockquote>
<h5>Due to the nature of the access to this information, we are still working out the details for the open-source version we plan to offer soon. The world of the owners of this data has not caught up to the philosophy we have for transparency and shared value. <a href="mailto:damon@domaindotnet.com">Send us an email for updates </a>or simply register with us. Also if your in the industry and have an interest we are looking for innovative early adopters. Also, we&#8217;ll be posting on many of the challenges we faced and a few innovative solutions we applied to the emerging and highly strategic domain of intelligent Linq Parser development.</h5>
<h3>Links</h3>
<ul>
<li><a title="http://msdn.microsoft.com/netframework/future/linq/" rel="nofollow" href="http://msdn.microsoft.com/netframework/future/linq/"><span style="color:#ffffff;">Official Microsoft LINQ Project</span></a></li>
<li><a class="external text" title="http://msdn2.microsoft.com/en-us/vcsharp/aa336746.aspx" rel="nofollow" href="http://msdn2.microsoft.com/en-us/vcsharp/aa336746.aspx"><span style="color:#ffffff;">101 C# LINQ Samples</span></a></li>
<li><a class="external text" title="http://msdn2.microsoft.com/en-us/vbasic/bb688088.aspx" rel="nofollow" href="http://msdn2.microsoft.com/en-us/vbasic/bb688088.aspx"><span style="color:#ffffff;">101 Visual Basic LINQ Samples</span></a></li>
<li><a class="external text" title="http://msdn2.microsoft.com/en-us/library/bb387098.aspx" rel="nofollow" href="http://msdn2.microsoft.com/en-us/library/bb387098.aspx"><span style="color:#ffffff;">LINQ to XML Documentation</span></a></li>
<li><a class="external text" title="http://forums.microsoft.com/msdn/showforum.aspx?forumid=123&amp;siteid=1" rel="nofollow" href="http://forums.microsoft.com/msdn/showforum.aspx?forumid=123&amp;siteid=1"><span style="color:#ffffff;">Microsoft LINQ forum</span></a></li>
<li><a class="external text" title="http://www.netfxguide.com/guide/linq.aspx" rel="nofollow" href="http://www.netfxguide.com/guide/linq.aspx"><span style="color:#ffffff;">LINQ page on NetFXGuide.com</span></a></li>
<li><a class="external text" title="http://www.hookedonlinq.com/" rel="nofollow" href="http://www.hookedonlinq.com/"><span style="color:#ffffff;">LINQ wiki</span></a></li>
<li><a class="external text" title="http://blogs.msdn.com/charlie/archive/2008/02/17/linq-books.aspx" rel="nofollow" href="http://blogs.msdn.com/charlie/archive/2008/02/17/linq-books.aspx"><span style="color:#ffffff;">LINQ books</span></a></li>
<li><a class="external text" title="http://www.codeplex.com/clinq" rel="nofollow" href="http://www.codeplex.com/clinq"><span style="color:#ffffff;">Continuous LINQ</span></a></li>
<li><a class="external text" title="http://www.codeplex.com/LINQtoSharePoint" rel="nofollow" href="http://www.codeplex.com/LINQtoSharePoint"><span style="color:#ffffff;">LINQ To Sharepoint</span></a></li>
<li><a class="external text" title="http://www.codeplex.com/LINQtoAD" rel="nofollow" href="http://www.codeplex.com/LINQtoAD"><span style="color:#ffffff;">LINQ To Active Directory</span></a></li>
<li><a class="external text" title="http://www.linqhelp.com/" rel="nofollow" href="http://www.linqhelp.com/"><span style="color:#ffffff;">Linq Tutorials and Active Articles</span></a></li>
<li><a class="external text" title="http://reddevnews.com/features/article.aspx?editorialsid=707" rel="nofollow" href="http://reddevnews.com/features/article.aspx?editorialsid=707"><span style="color:#ffffff;">Looking to LINQ &#8211; Will Microsoft&#8217;s Language Integrated Query transform programmatic data access?</span></a></li>
<li><a class="external text" title="http://www.codeplex.com/obtics" rel="nofollow" href="http://www.codeplex.com/obtics"><span style="color:#ffffff;">Obtics (Observable Object LINQ)</span></a></li>
<li><a class="external text" title="http://www.nstrument.net/Products/SnmpLibrary/tabid/70/Default.aspx" rel="nofollow" href="http://www.nstrument.net/Products/SnmpLibrary/tabid/70/Default.aspx"><span style="color:#ffffff;">LINQ to SNMP</span></a></li>
<li><a class="external text" title="http://www.onedotnetway.com/different-ways-of-retrieving-data-from-collections/" rel="nofollow" href="http://www.onedotnetway.com/different-ways-of-retrieving-data-from-collections/"><span style="color:#ffffff;">Different Ways Of Retrieving Data From Collections</span></a></li>
<li><a class="external text" title="http://blog.linqexchange.com" rel="nofollow" href="http://blog.linqexchange.com"><span style="color:#ffffff;">LINQ Exchange &#8211; Learn LINQ and Lambda Expressions</span></a></li>
</ul>
<div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:be681d48-faa8-4d98-a98a-d8e9f96c6310" class="wlWriterSmartContent" style="display:inline;float:none;margin:0;padding:0;"><span style="font-size:xx-small;">Technorati Tags: </span><a rel="tag" href="http://technorati.com/tags/Batched"><span style="font-size:xx-small;">Batched</span></a><span style="font-size:xx-small;">,</span><a rel="tag" href="http://technorati.com/tags/C%23+3.0"><span style="font-size:xx-small;">C# 3.0</span></a><span style="font-size:xx-small;">,</span><a rel="tag" href="http://technorati.com/tags/Custom+Provider"><span style="font-size:xx-small;">Custom Provider</span></a><span style="font-size:xx-small;">,</span><a rel="tag" href="http://technorati.com/tags/Domain+Specific+Language"><span style="font-size:xx-small;">Domain Specific Language</span></a><span style="font-size:xx-small;">,</span><a rel="tag" href="http://technorati.com/tags/dsl"><span style="font-size:xx-small;">dsl</span></a><span style="font-size:xx-small;">,</span><a rel="tag" href="http://technorati.com/tags/Expression+Tree+Parse"><span style="font-size:xx-small;">Expression Tree Parse</span></a><span style="font-size:xx-small;">,</span><a rel="tag" href="http://technorati.com/tags/Financial+Engineering"><span style="font-size:xx-small;">Financial Engineering</span></a><span style="font-size:xx-small;">,</span><a rel="tag" href="http://technorati.com/tags/Financial+Services"><span style="font-size:xx-small;">Financial Services</span></a><span style="font-size:xx-small;">,</span><a rel="tag" href="http://technorati.com/tags/Lambada"><span style="font-size:xx-small;">Lambada</span></a><span style="font-size:xx-small;">,</span><a rel="tag" href="http://technorati.com/tags/Linq"><span style="font-size:xx-small;">Linq</span></a><span style="font-size:xx-small;">,</span><a rel="tag" href="http://technorati.com/tags/Nasdaq"><span style="font-size:xx-small;">Nasdaq</span></a><span style="font-size:xx-small;">,</span><a rel="tag" href="http://technorati.com/tags/Parsed+Expressions"><span style="font-size:xx-small;">Parsed Expressions</span></a><span style="font-size:xx-small;">,</span><a rel="tag" href="http://technorati.com/tags/Portfolio+Optimization"><span style="font-size:xx-small;">Portfolio Optimization</span></a><span style="font-size:xx-small;">,</span><a rel="tag" href="http://technorati.com/tags/SOA"><span style="font-size:xx-small;">SOA</span></a><span style="font-size:xx-small;">,</span><a rel="tag" href="http://technorati.com/tags/Visitor"><span style="font-size:xx-small;">Visitor</span></a><span style="font-size:xx-small;">,</span><a rel="tag" href="http://technorati.com/tags/Web+Services"><span style="font-size:xx-small;">Web Services</span></a><span style="font-size:xx-small;">,</span><a rel="tag" href="http://technorati.com/tags/XIgnite"><span style="font-size:xx-small;">XIgnite</span></a></div>
<div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:408d275a-5b87-425b-9c32-bc9686da1703" class="wlWriterSmartContent" style="display:inline;float:none;margin:0;padding:0;"><span style="font-size:xx-small;">del.icio.us Tags: </span><a rel="tag" href="http://del.icio.us/popular/Batched"><span style="font-size:xx-small;">Batched</span></a><span style="font-size:xx-small;">,</span><a rel="tag" href="http://del.icio.us/popular/C%23+3.0"><span style="font-size:xx-small;">C# 3.0</span></a><span style="font-size:xx-small;">,</span><a rel="tag" href="http://del.icio.us/popular/Custom+Provider"><span style="font-size:xx-small;">Custom Provider</span></a><span style="font-size:xx-small;">,</span><a rel="tag" href="http://del.icio.us/popular/Domain+Specific+Language"><span style="font-size:xx-small;">Domain Specific Language</span></a><span style="font-size:xx-small;">,</span><a rel="tag" href="http://del.icio.us/popular/dsl"><span style="font-size:xx-small;">dsl</span></a><span style="font-size:xx-small;">,</span><a rel="tag" href="http://del.icio.us/popular/Expression+Tree+Parse"><span style="font-size:xx-small;">Expression Tree Parse</span></a><span style="font-size:xx-small;">,</span><a rel="tag" href="http://del.icio.us/popular/Financial+Engineering"><span style="font-size:xx-small;">Financial Engineering</span></a><span style="font-size:xx-small;">,</span><a rel="tag" href="http://del.icio.us/popular/Financial+Services"><span style="font-size:xx-small;">Financial Services</span></a><span style="font-size:xx-small;">,</span><a rel="tag" href="http://del.icio.us/popular/Lambada"><span style="font-size:xx-small;">Lambada</span></a><span style="font-size:xx-small;">,</span><a rel="tag" href="http://del.icio.us/popular/Linq"><span style="font-size:xx-small;">Linq</span></a><span style="font-size:xx-small;">,</span><a rel="tag" href="http://del.icio.us/popular/Nasdaq"><span style="font-size:xx-small;">Nasdaq</span></a><span style="font-size:xx-small;">,</span><a rel="tag" href="http://del.icio.us/popular/Parsed+Expressions"><span style="font-size:xx-small;">Parsed Expressions</span></a><span style="font-size:xx-small;">,</span><a rel="tag" href="http://del.icio.us/popular/Portfolio+Optimization"><span style="font-size:xx-small;">Portfolio Optimization</span></a><span style="font-size:xx-small;">,</span><a rel="tag" href="http://del.icio.us/popular/SOA"><span style="font-size:xx-small;">SOA</span></a><span style="font-size:xx-small;">,</span><a rel="tag" href="http://del.icio.us/popular/Visitor"><span style="font-size:xx-small;">Visitor</span></a><span style="font-size:xx-small;">,</span><a rel="tag" href="http://del.icio.us/popular/Web+Services"><span style="font-size:xx-small;">Web Services</span></a><span style="font-size:xx-small;">,</span><a rel="tag" href="http://del.icio.us/popular/XIgnite"><span style="font-size:xx-small;">XIgnite</span></a></div>
<div class="wlWriterHeaderFooter" style="text-align:left;margin:0;padding:4px 0;"><a href="http://digg.com/submit?url=http%3a%2f%2fdcarr.wordpress.com%2f2008%2f09%2f18%2flinq-to-financial-markets-optimizing-provider-to-real-time-quotes-analytics-and-silverlight-wpf-visualization%2f&amp;title=Linq+to+Financial+Markets+%3a+Optimizing+Provider+to+Real-Time+Quotes%2c+Analytics%2c+and+Silverlight-WPF+Visualization"><img style="border:0;" title="Digg This" src="http://digg.com/img/badges/100x20-digg-button.png" border="0" alt="Digg This" width="100" height="20" /></a></div>
<br />Posted in C# 3.0 Enhancements, C# 3.0 for Internal DSL, Financial Services, Framework Design, Linq, software as strategic, Technology Tagged: Batched, C# 3.0, Custom Provider, Domain Specific Language, dsl, Expression Tree Parse, Financial Engineering, Financial Services, Lambada, Linq, Nasdaq, Parsed Expressions, Portfolio Optimization, SOA, Visitor, Web Services, XIgnite <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dcarr.wordpress.com/727/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dcarr.wordpress.com/727/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dcarr.wordpress.com/727/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dcarr.wordpress.com/727/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dcarr.wordpress.com/727/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dcarr.wordpress.com/727/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dcarr.wordpress.com/727/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dcarr.wordpress.com/727/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dcarr.wordpress.com/727/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dcarr.wordpress.com/727/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=727&subd=dcarr&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://team.pushbomb.com/2008/09/18/linq-to-financial-markets-optimizing-provider-to-real-time-quotes-analytics-and-silverlight-wpf-visualization/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7b572cbcda5a17fe984e7dd1ddc9c3d6?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">pushbomb</media:title>
		</media:content>

		<media:content url="http://dcarr.files.wordpress.com/2008/08/xignite_logo_anim.gif" medium="image" />

		<media:content url="http://dcarr.files.wordpress.com/2008/08/techsmithwor5c.png" medium="image" />

		<media:content url="http://digg.com/img/badges/100x20-digg-button.png" medium="image">
			<media:title type="html">Digg This</media:title>
		</media:content>
	</item>
		<item>
		<title>Expose New Linq Operations from the Screaming HashSet&lt;T&gt; Collection</title>
		<link>http://team.pushbomb.com/2008/09/08/the_fastest_dot_net_hash_set_collection_with_linq_extended_features/</link>
		<comments>http://team.pushbomb.com/2008/09/08/the_fastest_dot_net_hash_set_collection_with_linq_extended_features/#comments</comments>
		<pubDate>Tue, 09 Sep 2008 01:36:20 +0000</pubDate>
		<dc:creator>Damon Wilder Carr</dc:creator>
				<category><![CDATA[C# 3.0 Enhancements]]></category>
		<category><![CDATA[C# 3.0 for Internal DSL]]></category>
		<category><![CDATA[Framework Design]]></category>
		<category><![CDATA[Generics]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[concepts implemented]]></category>
		<category><![CDATA[nhibernate]]></category>
		<category><![CDATA[.NET 3.5]]></category>
		<category><![CDATA[Functional Programming]]></category>
		<category><![CDATA[HashSet]]></category>
		<category><![CDATA[Linq]]></category>
		<category><![CDATA[Linq to NHibernate]]></category>
		<category><![CDATA[Linq Undocumented]]></category>
		<category><![CDATA[ORM]]></category>

		<guid isPermaLink="false">http://dcarr.wordpress.com/2008/09/08/the_fastest_dot_net_hash_set_collection_with_linq_extended_features/</guid>
		<description><![CDATA[Linq is not just about databases. It’s about reading the registry, your hard-disk, or even a list of function pointers to be invoked. Linq is about more event then sets (collections). It’s about making tasks easier in many cases and vastly more powerful (and most importantly your code more readable and maintainable at the same time).<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=874&subd=dcarr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>&#160;</p>
<p><a target="_blank" href="http://en.wikipedia.org/wiki/Language_Integrated_Query">Linq</a> is not just about databases. It’s about reading the registry, your hard-disk, or even a list of function pointers to be invoked. Linq is about more even then sets (collections). It’s about making tasks easier in many cases and vastly more powerful (and most importantly your code more readable and maintainable at the same time).     <br /><a href="http://dcarr.files.wordpress.com/2008/09/premature-6.jpg"><img style="border-width:0;margin:0 0 15px 20px;" title="premature_optimization" border="0" alt="premature_optimization" align="right" src="http://dcarr.files.wordpress.com/2008/09/premature-6-thumb.jpg?w=244&#038;h=181" width="244" height="181" /></a></p>
<blockquote><h3>It’s astounding just how fast the <a target="_blank" href="http://msdn.microsoft.com/en-us/library/bb397727.aspx">HashSet&lt;T&gt;</a> collection is.</h3>
</blockquote>
<p>This post will show how to gain additional power that is fully supported from Microsoft which is often overlooked, yet it can solve some of the hardest problems (especially around performance however don’t prematurely optimize!).</p>
<p>&#160; <br />There are tons of cases where we need a real powerhouse to manage super-large sets (in this example we will use the registry). An entire part of the registry actually. </p>
<p>Here is the API we want to use to query the HKLM part of our registry:</p>
<pre class="code"><span style="background:black;color:white;">            </span><span style="background:black;color:#ecc03e;">var </span><span style="background:black;color:white;">FindFontsColors = </span><span style="background:black;color:#ecc03e;">from </span><span style="background:black;color:white;">rk </span><span style="background:black;color:#ecc03e;">in </span><span style="background:black;color:#2b91af;">RegistryServer</span><span style="background:black;color:white;">.Hklm
                                  </span><span style="background:black;color:#ecc03e;">where
                                          </span><span style="background:black;color:white;">rk.Name.Contains(</span><span style="background:black;color:#ecc03e;">&quot;VisualStudio&quot;</span><span style="background:black;color:white;">) &amp;&amp;
                                          rk.Name.EndsWith(</span><span style="background:black;color:#ecc03e;">&quot;FontsAndColors&quot;</span><span style="background:black;color:white;">) &amp;&amp;
                                          rk.ValueCount &gt; 0

                                  </span><span style="background:black;color:#ecc03e;">select </span><span style="background:black;color:white;">rk.Name;

</span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<ul>
  </ul>
<ul>
<li>
<div align="left">The core win here is &#8216;ease of development and maintenance’ without the typical trade-off<br />
        <br />in performance. The entire equation is shifted actually so the tradeoff becomes irrelevant. </div>
</li>
<li>
<div align="left">Sure you could do this with a lot more code perhaps even a few ms faster. But at what real cost over the life of your code?</div>
</li>
<li>
<div align="left">The entire point of this post is the far greater win in maintenance and ease of understanding, without the assumed loss of things like performance.</div>
</li>
</ul>
<p>&#160;</p>
<p>When there is no intelligence available on a ‘back-end’ to parse your requests, yet you need the power of finding complex conditional results and much more, there is one recently introduced superstar that is often not described in terms of Linq:</p>
<h2>HashSet&lt;T&gt;</h2>
<p>Let’s start with some code. You know you can call ToList, ToArray, ToDictionary &amp; ToLookup on your collections (we’ll call them Sequences to stay in line with Linq terms).</p>
<ul>
<li>
<div align="right">You will see ‘sets’, ‘collections’ &amp; sequences used together in documentation today. The differences are mostly academic, however the HashSet does illustrate some of those semantic differences which we point out.</div>
</li>
</ul>
<p>We are going to add an extension method to provide us a ToHashSet capability off any IEnumerable&lt;T&gt; (in exactly the same implementation style Microsoft used internally).</p>
<p>Here is how we gain access to this type in the easiest way:</p>
<pre class="code"><span style="background:black;color:white;">    </span><span style="background:black;color:#ecc03e;">using </span><span style="background:black;color:white;">System;
    </span><span style="background:black;color:#ecc03e;">using </span><span style="background:black;color:white;">System.Collections.Generic;

    </span><span style="background:black;color:gray;">/// &lt;summary&gt;
    /// </span><span style="background:black;color:#9ff5fd;">This extension method class will add a ToHashSet</span><span style="background:black;color:gray;">&lt;typeparamref name=</span><span style="background:black;color:#9feca5;">&quot;&gt;&quot;</span><span style="background:black;color:gray;">/&gt;
    /// </span><span style="background:black;color:#9ff5fd;">in exactly the same way it is provided by the others:
    </span><span style="background:black;color:gray;">///
    /// </span><span style="background:black;color:#9ff5fd;">ToList(), ToArray(), ToDictionary().. Now ToHashSet() is available
    </span><span style="background:black;color:gray;">/// &lt;/summary&gt;
    </span><span style="background:black;color:#ecc03e;">public static class </span><span style="background:black;color:#2b91af;">HashSetLinqAccess
    </span><span style="background:black;color:white;">{
        </span><span style="background:black;color:#ecc03e;">public static </span><span style="background:black;color:#2b91af;">HashSet</span><span style="background:black;color:white;">&lt;T&gt; ToHashSet&lt;T&gt;(</span><span style="background:black;color:#ecc03e;">this </span><span style="background:black;color:#9185fa;">IEnumerable</span><span style="background:black;color:white;">&lt;T&gt; fromEnumerable,
            </span><span style="background:black;color:#9185fa;">IEqualityComparer</span><span style="background:black;color:white;">&lt;T&gt; comparer)
        {
            </span><span style="background:black;color:#ecc03e;">if </span><span style="background:black;color:white;">(fromEnumerable == </span><span style="background:black;color:#ecc03e;">null</span><span style="background:black;color:white;">)
                </span><span style="background:black;color:#ecc03e;">throw new </span><span style="background:black;color:#2b91af;">ArgumentNullException</span><span style="background:black;color:white;">(</span><span style="background:black;color:#ecc03e;">&quot;fromEnumerable&quot;</span><span style="background:black;color:white;">);

            </span><span style="background:black;color:#ecc03e;">if </span><span style="background:black;color:white;">(comparer == </span><span style="background:black;color:#ecc03e;">null</span><span style="background:black;color:white;">)
                comparer = </span><span style="background:black;color:#2b91af;">EqualityComparer</span><span style="background:black;color:white;">&lt;T&gt;.Default;

            </span><span style="background:black;color:#ecc03e;">return </span><span style="background:black;color:white;">!</span><span style="background:black;color:#ecc03e;">typeof</span><span style="background:black;color:white;">(</span><span style="background:black;color:#2b91af;">HashSet</span><span style="background:black;color:white;">&lt;T&gt;).IsAssignableFrom(fromEnumerable.GetType())
                           ? </span><span style="background:black;color:#ecc03e;">new </span><span style="background:black;color:#2b91af;">HashSet</span><span style="background:black;color:white;">&lt;T&gt;(fromEnumerable, comparer)
                           : (</span><span style="background:black;color:#2b91af;">HashSet</span><span style="background:black;color:white;">&lt;T&gt;)fromEnumerable;
        }

        </span><span style="background:black;color:#ecc03e;">public static </span><span style="background:black;color:#2b91af;">HashSet</span><span style="background:black;color:white;">&lt;T&gt; ToHashSet&lt;T&gt;(</span><span style="background:black;color:#ecc03e;">this </span><span style="background:black;color:#9185fa;">IEnumerable</span><span style="background:black;color:white;">&lt;T&gt; fromEnumerable) {

            </span><span style="background:black;color:#ecc03e;">return </span><span style="background:black;color:white;">ToHashSet(fromEnumerable, </span><span style="background:black;color:#2b91af;">EqualityComparer</span><span style="background:black;color:white;">&lt;T&gt;.Default);
        }
    }</span></pre>
<p>Ok so what are we going to do with the HashSet&lt;T&gt; and why?</p>
<p>The benefit comes when we have in-memory large sequences to deal with. I will be using the following code as the ‘server’ here. This is code that provides a ‘Registry Server’ to our application. We will populate up a HashSet&lt;T&gt; with RegistryKey instances and then see just how fast it is.</p>
<p>In the next post we will cover all of the additional methods the HashSet&lt;T&gt; exposes. </p>
<p>Here is the code for our Registry Server. NOTE: Please do not try to modify this to change your registry unless you know what you are doing. This is an immutable (read-only) projection from the registry for a very good reason: You can thrash your machine otherwise.</p>
<p>&#160;</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<pre class="code"><span style="background:black;color:#ecc03e;">namespace </span><span style="background:black;color:white;">domaindotnet.LinqToRegistry {
    </span><span style="background:black;color:#ecc03e;">using </span><span style="background:black;color:white;">System;
    </span><span style="background:black;color:#ecc03e;">using </span><span style="background:black;color:white;">System.Collections;
    </span><span style="background:black;color:#ecc03e;">using </span><span style="background:black;color:white;">System.Collections.Generic;
    </span><span style="background:black;color:#ecc03e;">using </span><span style="background:black;color:white;">System.Linq;
    </span><span style="background:black;color:#ecc03e;">using </span><span style="background:black;color:white;">System.Runtime.CompilerServices;
    </span><span style="background:black;color:#ecc03e;">using </span><span style="background:black;color:white;">System.Threading;
    </span><span style="background:black;color:#ecc03e;">using </span><span style="background:black;color:white;">Castle.Core;
    </span><span style="background:black;color:#ecc03e;">using </span><span style="background:black;color:white;">LinqToCore;
    </span><span style="background:black;color:#ecc03e;">using </span><span style="background:black;color:white;">Microsoft.Win32;

    </span><span style="background:black;color:gray;">/// &lt;summary&gt;
    /// </span><span style="background:black;color:#9ff5fd;">Provider immutable projections from the registry
    </span><span style="background:black;color:gray;">/// </span><span style="background:black;color:#9ff5fd;">of the machine, as well as events for status and errors
    </span><span style="background:black;color:gray;">/// </span><span style="background:black;color:#9ff5fd;">via a singeton wrapper on the .NET Registry
    </span><span style="background:black;color:gray;">/// </span><span style="background:black;color:#9ff5fd;">singleton.
    </span><span style="background:black;color:gray;">/// </span><span style="background:black;color:#9ff5fd;">Here we are only exposing the HKLM area
    </span><span style="background:black;color:gray;">/// </span><span style="background:black;color:#9ff5fd;">subkey but you can see it is easily extensible
    </span><span style="background:black;color:gray;">/// &lt;/summary&gt;
    </span><span style="background:black;color:#ecc03e;">public class </span><span style="background:black;color:#2b91af;">RegistryServer </span><span style="background:black;color:white;">: </span><span style="background:black;color:#9185fa;">IEqualityComparer</span><span style="background:black;color:white;">&lt;</span><span style="background:black;color:#2b91af;">RegistryKey</span><span style="background:black;color:white;">&gt;, </span><span style="background:black;color:#9185fa;">IInitializable</span><span style="background:black;color:white;">,
                                  </span><span style="background:black;color:#9185fa;">IEnumerable</span><span style="background:black;color:white;">&lt;</span><span style="background:black;color:#2b91af;">RegistryKey</span><span style="background:black;color:white;">&gt; {
        </span><span style="background:black;color:#f5f01f;">// IInitializable is from Castle.Core Contractually
        // saying we need a call on our Initialize() method
        // before we can be given out as a service to
        // others

        </span><span style="background:black;color:#ecc03e;">private static readonly </span><span style="background:black;color:#2b91af;">RegistryServer </span><span style="background:black;color:white;">_instance;
        </span><span style="background:black;color:#ecc03e;">private static int </span><span style="background:black;color:white;">iCounter;
        </span><span style="background:black;color:#ecc03e;">private </span><span style="background:black;color:#2b91af;">HashSet</span><span style="background:black;color:white;">&lt;</span><span style="background:black;color:#2b91af;">RegistryKey</span><span style="background:black;color:white;">&gt; allKeys;
        </span><span style="background:black;color:#ecc03e;">private </span><span style="background:black;color:#2b91af;">PopulateProgressEventArgs </span><span style="background:black;color:white;">eventArgStatus;
        </span><span style="background:black;color:#ecc03e;">private bool </span><span style="background:black;color:white;">isInitialized;
</span></pre>
<pre class="code"><span style="background:black;color:white;">        </span><span style="background:black;color:#ecc03e;">private </span><span style="background:black;color:#2b91af;">PopulateProgressDelegateError </span><span style="background:black;color:white;">populateError = </span><span style="background:black;color:#ecc03e;">delegate </span><span style="background:black;color:white;">{ };
        </span><span style="background:black;color:#ecc03e;">private </span><span style="background:black;color:#2b91af;">PopulateProgressDelegate </span><span style="background:black;color:white;">populateEventOk = </span><span style="background:black;color:#ecc03e;">delegate </span><span style="background:black;color:white;">{ };</span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<pre class="code"><span style="background:black;color:white;">
        </span><span style="background:black;color:#ecc03e;">static </span><span style="background:black;color:white;">RegistryServer() {
          </span></pre>
<pre class="code"><span style="background:black;color:white;">            _instance = </span><span style="background:black;color:#ecc03e;">new </span><span style="background:black;color:#2b91af;">RegistryServer
            </span><span style="background:black;color:white;">{eventArgStatus = </span><span style="background:black;color:#ecc03e;">new </span><span style="background:black;color:#2b91af;">PopulateProgressEventArgs</span><span style="background:black;color:white;">()};</span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<pre class="code"><span style="background:black;color:white;"></span><span style="background:black;color:white;">        }

        </span><span style="background:black;color:#ecc03e;">private </span><span style="background:black;color:white;">RegistryServer() {}

        </span><span style="background:black;color:#ecc03e;">public static long </span><span style="background:black;color:white;">Count {
            </span><span style="background:black;color:#ecc03e;">get </span><span style="background:black;color:white;">{
                </span><span style="background:black;color:#ecc03e;">if </span><span style="background:black;color:white;">(!_instance.isInitialized)
                    </span><span style="background:black;color:#ecc03e;">throw new </span><span style="background:black;color:#2b91af;">InvalidOperationException</span><span style="background:black;color:white;">(
                            </span><span style="background:black;color:#ecc03e;">&quot;Please initialize the backing store first&quot;</span><span style="background:black;color:white;">);

                </span><span style="background:black;color:#ecc03e;">return </span><span style="background:black;color:white;">_instance.allKeys.Count;
            }
        }

        </span><span style="background:black;color:#ecc03e;">public static </span><span style="background:black;color:#2b91af;">RegistryServer </span><span style="background:black;color:white;">Hklm {
            </span><span style="background:black;color:#ecc03e;">get </span><span style="background:black;color:white;">{
                </span><span style="background:black;color:#ecc03e;">if </span><span style="background:black;color:white;">(!_instance.isInitialized)
                    </span><span style="background:black;color:#ecc03e;">throw new </span><span style="background:black;color:#2b91af;">InvalidOperationException</span><span style="background:black;color:white;">(
                            </span><span style="background:black;color:#ecc03e;">&quot;Please initialize the backing store first&quot;</span><span style="background:black;color:white;">);

                </span><span style="background:black;color:#ecc03e;">return </span><span style="background:black;color:white;">_instance;
            }
        }

        #region IEnumerable&lt;RegistryKey&gt; Members

        </span><span style="background:black;color:#ecc03e;">public </span><span style="background:black;color:#9185fa;">IEnumerator</span><span style="background:black;color:white;">&lt;</span><span style="background:black;color:#2b91af;">RegistryKey</span><span style="background:black;color:white;">&gt; GetEnumerator() {
            </span><span style="background:black;color:#ecc03e;">if </span><span style="background:black;color:white;">(!isInitialized)
                </span><span style="background:black;color:#ecc03e;">throw new </span><span style="background:black;color:#2b91af;">InvalidOperationException</span><span style="background:black;color:white;">(
                        </span><span style="background:black;color:#ecc03e;">&quot;Please initialize the backing store first&quot;</span><span style="background:black;color:white;">);

            </span><span style="background:black;color:#ecc03e;">return </span><span style="background:black;color:white;">allKeys.GetEnumerator();
        }

        </span><span style="background:black;color:#9185fa;">IEnumerator IEnumerable</span><span style="background:black;color:white;">.GetEnumerator() {
            </span><span style="background:black;color:#ecc03e;">return </span><span style="background:black;color:white;">GetEnumerator();
        }

        #endregion

        #region IEqualityComparer&lt;RegistryKey&gt; Members

        </span><span style="background:black;color:gray;">/// &lt;summary&gt;
        /// </span><span style="background:black;color:#9ff5fd;">If either contains a null, the result is false (actually it is
        </span><span style="background:black;color:gray;">/// </span><span style="background:black;color:#9ff5fd;">null be we do not have that option. It is 'unknown and indeterminant'.
        </span><span style="background:black;color:gray;">/// </span><span style="background:black;color:#9ff5fd;">An emptry string however is treated as 'known to be empty'
        </span><span style="background:black;color:gray;">/// </span><span style="background:black;color:#9ff5fd;">where null is 'could be anything we have no idea'.
        </span><span style="background:black;color:gray;">/// &lt;/summary&gt;
        /// &lt;param name=</span><span style="background:black;color:#9feca5;">&quot;x&quot;</span><span style="background:black;color:gray;">&gt;&lt;/param&gt;
        /// &lt;param name=</span><span style="background:black;color:#9feca5;">&quot;y&quot;</span><span style="background:black;color:gray;">&gt;&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        </span><span style="background:black;color:#ecc03e;">public bool </span><span style="background:black;color:white;">Equals(</span><span style="background:black;color:#2b91af;">RegistryKey </span><span style="background:black;color:white;">x, </span><span style="background:black;color:#2b91af;">RegistryKey </span><span style="background:black;color:white;">y) {
            </span><span style="background:black;color:#ecc03e;">return </span><span style="background:black;color:white;">x.Name != </span><span style="background:black;color:#ecc03e;">null </span><span style="background:black;color:white;">&amp;&amp; y.Name != </span><span style="background:black;color:#ecc03e;">null </span><span style="background:black;color:white;">&amp;&amp; x.Name == y.Name;
        }

        </span><span style="background:black;color:gray;">/// &lt;summary&gt;
        /// </span><span style="background:black;color:#9ff5fd;">For null names here we will calculate a funky random number
        </span><span style="background:black;color:gray;">/// </span><span style="background:black;color:#9ff5fd;">as null != null
        </span><span style="background:black;color:gray;">/// &lt;/summary&gt;
        /// &lt;param name=</span><span style="background:black;color:#9feca5;">&quot;obj&quot;</span><span style="background:black;color:gray;">&gt;&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        </span><span style="background:black;color:#ecc03e;">public int </span><span style="background:black;color:white;">GetHashCode(</span><span style="background:black;color:#2b91af;">RegistryKey </span><span style="background:black;color:white;">obj) {
            </span><span style="background:black;color:#ecc03e;">return </span><span style="background:black;color:white;">obj.Name != </span><span style="background:black;color:#ecc03e;">null
                           </span><span style="background:black;color:white;">? obj.Name.GetHashCode()
                           : </span><span style="background:black;color:#2b91af;">RuntimeHelpers</span><span style="background:black;color:white;">.GetHashCode(</span><span style="background:black;color:#ecc03e;">new object</span><span style="background:black;color:white;">());
        }

        #endregion

        #region IInitializable Members

        </span><span style="background:black;color:#ecc03e;">void </span><span style="background:black;color:#9185fa;">IInitializable</span><span style="background:black;color:white;">.Initialize() {
            Initialize();
        }

        #endregion

        </span><span style="background:black;color:#ecc03e;">public static event </span><span style="background:black;color:#2b91af;">PopulateProgressDelegate </span><span style="background:black;color:white;">PopulateProgress {
            </span><span style="background:black;color:#ecc03e;">add </span><span style="background:black;color:white;">{ _instance.populateEventOk += </span><span style="background:black;color:#ecc03e;">value</span><span style="background:black;color:white;">; }
            </span><span style="background:black;color:#ecc03e;">remove </span><span style="background:black;color:white;">{ _instance.populateEventOk -= </span><span style="background:black;color:#ecc03e;">value</span><span style="background:black;color:white;">; }
        }

        </span><span style="background:black;color:#ecc03e;">private void </span><span style="background:black;color:white;">InvokePopulateProgress() {
            </span><span style="background:black;color:#ecc03e;">var </span><span style="background:black;color:white;">PopulateProgressDelegate = _instance.populateEventOk;
</span><span style="background:black;color:white;">                eventArgStatus.ItemCount = </span><span style="background:black;color:#2b91af;">Interlocked</span><span style="background:black;color:white;">.Increment(</span><span style="background:black;color:#ecc03e;">ref </span><span style="background:black;color:white;">iCounter);
                PopulateProgressDelegate(</span><span style="background:black;color:#ecc03e;">this</span><span style="background:black;color:white;">, eventArgStatus);

        }

        </span><span style="background:black;color:#ecc03e;">public static event </span><span style="background:black;color:#2b91af;">PopulateProgressDelegateError </span><span style="background:black;color:white;">PopulateProgressItemError {
            </span><span style="background:black;color:#ecc03e;">add </span><span style="background:black;color:white;">{ _instance.populateError += </span><span style="background:black;color:#ecc03e;">value</span><span style="background:black;color:white;">; }
            </span><span style="background:black;color:#ecc03e;">remove </span><span style="background:black;color:white;">{ _instance.populateError -= </span><span style="background:black;color:#ecc03e;">value</span><span style="background:black;color:white;">; }
        }

        </span><span style="background:black;color:#ecc03e;">private static void </span><span style="background:black;color:white;">InvokePopulateProgressItemError(</span><span style="background:black;color:#2b91af;">PopulateProgressEventArgs </span><span style="background:black;color:white;">args) {
         </span><span style="background:black;color:white;">  _instance.populateError(_instance, args);
        }

        </span><span style="background:black;color:#ecc03e;">public static void </span><span style="background:black;color:white;">Initialize() {
            Initialize(</span><span style="background:black;color:#2b91af;">Registry</span><span style="background:black;color:white;">.LocalMachine);
        }

        </span><span style="background:black;color:#ecc03e;">private static void </span><span style="background:black;color:white;">Initialize(</span><span style="background:black;color:#2b91af;">RegistryKey </span><span style="background:black;color:white;">RegistryStartKey) {
            </span><span style="background:black;color:#ecc03e;">if </span><span style="background:black;color:white;">(_instance.isInitialized)
                </span><span style="background:black;color:#ecc03e;">throw new </span><span style="background:black;color:#2b91af;">InvalidOperationException</span><span style="background:black;color:white;">(
                        </span><span style="background:black;color:#ecc03e;">&quot;Already Initialized. Cannot perform twice&quot;</span><span style="background:black;color:white;">);

          </span><span style="background:black;color:white;">
            _instance.allKeys = GetAllSubkeys(RegistryStartKey, </span><span style="background:black;color:#ecc03e;">&quot;&quot;</span><span style="background:black;color:white;">).ToHashSet(_instance);

            _instance.isInitialized = </span><span style="background:black;color:#ecc03e;">true</span><span style="background:black;color:white;">;
        }

        </span><span style="background:black;color:#ecc03e;">private static </span><span style="background:black;color:#9185fa;">IEnumerable</span><span style="background:black;color:white;">&lt;</span><span style="background:black;color:#2b91af;">RegistryKey</span><span style="background:black;color:white;">&gt; GetAllSubkeys(</span><span style="background:black;color:#2b91af;">RegistryKey </span><span style="background:black;color:white;">StartkeyIn,
                                                              </span><span style="background:black;color:#2b91af;">String </span><span style="background:black;color:white;">NodeKey) {
            _instance.InvokePopulateProgress();

            </span><span style="background:black;color:#ecc03e;">if </span><span style="background:black;color:white;">(StartkeyIn != </span><span style="background:black;color:#ecc03e;">null</span><span style="background:black;color:white;">) {
                </span><span style="background:black;color:#2b91af;">RegistryKey </span><span style="background:black;color:white;">SubItemRoot;

                </span><span style="background:black;color:#ecc03e;">if </span><span style="background:black;color:white;">(TryOpenSubKey(StartkeyIn, NodeKey, </span><span style="background:black;color:#ecc03e;">out </span><span style="background:black;color:white;">SubItemRoot)) {
                    </span><span style="background:black;color:#ecc03e;">yield return </span><span style="background:black;color:white;">SubItemRoot;

                    </span><span style="background:black;color:#ecc03e;">foreach </span><span style="background:black;color:white;">(</span><span style="background:black;color:#ecc03e;">var </span><span style="background:black;color:white;">sub </span><span style="background:black;color:#ecc03e;">in

                            </span><span style="background:black;color:white;">SubItemRoot.GetSubKeyNames().SelectMany( </span><span style="background:black;color:#f5f01f;">// Recursion back into this method
                                    </span><span style="background:black;color:white;">s =&gt; GetAllSubkeys(SubItemRoot, s)))

                        </span><span style="background:black;color:#ecc03e;">yield return </span><span style="background:black;color:white;">sub;
                }
            }
        }

        </span><span style="background:black;color:#ecc03e;">private static bool </span><span style="background:black;color:white;">TryOpenSubKey(</span><span style="background:black;color:#2b91af;">RegistryKey </span><span style="background:black;color:white;">StartFrom, </span><span style="background:black;color:#2b91af;">String </span><span style="background:black;color:white;">Name,
                                          </span><span style="background:black;color:#ecc03e;">out </span><span style="background:black;color:#2b91af;">RegistryKey </span><span style="background:black;color:white;">itemOut) {
            </span><span style="background:black;color:#ecc03e;">var </span><span style="background:black;color:white;">bIsOK = </span><span style="background:black;color:#ecc03e;">false</span><span style="background:black;color:white;">;
            itemOut = </span><span style="background:black;color:#ecc03e;">null</span><span style="background:black;color:white;">;

            </span><span style="background:black;color:#ecc03e;">try </span><span style="background:black;color:white;">{
                itemOut = StartFrom.OpenSubKey(Name,
                        </span><span style="background:black;color:#b8a223;">RegistryKeyPermissionCheck</span><span style="background:black;color:white;">.ReadSubTree);
                </span><span style="background:black;color:#ecc03e;">if </span><span style="background:black;color:white;">(itemOut != </span><span style="background:black;color:#ecc03e;">null</span><span style="background:black;color:white;">)
                    bIsOK = </span><span style="background:black;color:#ecc03e;">true</span><span style="background:black;color:white;">;
            }
            </span><span style="background:black;color:#ecc03e;">catch </span><span style="background:black;color:white;">(</span><span style="background:black;color:#2b91af;">Exception </span><span style="background:black;color:white;">ex) {
                InvokePopulateProgressItemError(</span><span style="background:black;color:#ecc03e;">new </span><span style="background:black;color:#2b91af;">PopulateProgressEventArgs</span><span style="background:black;color:white;">(-1,
                        ex.Message + </span><span style="background:black;color:#2b91af;">Environment</span><span style="background:black;color:white;">.NewLine + </span><span style="background:black;color:#ecc03e;">&quot;Key=&quot; </span><span style="background:black;color:white;">+ StartFrom.Name + </span><span style="background:black;color:#ecc03e;">&quot; failed trying &quot; </span><span style="background:black;color:white;">+ Name));
            }

            </span><span style="background:black;color:#ecc03e;">return </span><span style="background:black;color:white;">bIsOK;
        }
                                  }

    </span><span style="background:black;color:#ecc03e;">public delegate void </span><span style="background:black;color:#2b91af;">PopulateProgressDelegateError</span><span style="background:black;color:white;">(
            </span><span style="background:black;color:#ecc03e;">object </span><span style="background:black;color:white;">sender, </span><span style="background:black;color:#2b91af;">PopulateProgressEventArgs </span><span style="background:black;color:white;">args);

    </span><span style="background:black;color:#ecc03e;">public delegate void </span><span style="background:black;color:#2b91af;">PopulateProgressDelegate</span><span style="background:black;color:white;">(
            </span><span style="background:black;color:#ecc03e;">object </span><span style="background:black;color:white;">sender, </span><span style="background:black;color:#2b91af;">PopulateProgressEventArgs </span><span style="background:black;color:white;">args);
}</span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<pre class="code">&#160;</pre>
<pre class="code"><span style="background:black;color:#ecc03e;">namespace </span><span style="background:black;color:white;">domaindotnet.LinqToRegistry {
    </span><span style="background:black;color:#ecc03e;">using </span><span style="background:black;color:white;">System;

    </span><span style="background:black;color:gray;">/// &lt;summary&gt;
    /// </span><span style="background:black;color:#9ff5fd;">Simple EventArg for the two progress events
    </span><span style="background:black;color:gray;">///
    /// </span><span style="background:black;color:#9ff5fd;">NOTE: There will typically be some errors
    </span><span style="background:black;color:gray;">/// </span><span style="background:black;color:#9ff5fd;">which is fine as some parts of the Registry are
    </span><span style="background:black;color:gray;">/// </span><span style="background:black;color:#9ff5fd;">not accessible with standard security
    </span><span style="background:black;color:gray;">/// &lt;/summary&gt;
    </span><span style="background:black;color:#ecc03e;">public class </span><span style="background:black;color:#2b91af;">PopulateProgressEventArgs </span><span style="background:black;color:white;">: </span><span style="background:black;color:#2b91af;">EventArgs </span><span style="background:black;color:white;">{

        </span><span style="background:black;color:#ecc03e;">private readonly string </span><span style="background:black;color:white;">_keyName;

        </span><span style="background:black;color:#ecc03e;">public </span><span style="background:black;color:white;">PopulateProgressEventArgs(</span><span style="background:black;color:#ecc03e;">int </span><span style="background:black;color:white;">itemCount) : </span><span style="background:black;color:#ecc03e;">this</span><span style="background:black;color:white;">(itemCount, </span><span style="background:black;color:#ecc03e;">null</span><span style="background:black;color:white;">) {}

        </span><span style="background:black;color:#ecc03e;">public </span><span style="background:black;color:white;">PopulateProgressEventArgs(</span><span style="background:black;color:#ecc03e;">int </span><span style="background:black;color:white;">itemCount, </span><span style="background:black;color:#2b91af;">String </span><span style="background:black;color:white;">KeyName) {

            ItemCount = itemCount;
            _keyName = KeyName;

        }

        </span><span style="background:black;color:#ecc03e;">public </span><span style="background:black;color:white;">PopulateProgressEventArgs() : </span><span style="background:black;color:#ecc03e;">this</span><span style="background:black;color:white;">(-1, </span><span style="background:black;color:#ecc03e;">null</span><span style="background:black;color:white;">) {}

        </span><span style="background:black;color:#ecc03e;">public string </span><span style="background:black;color:white;">KeyName {
            </span><span style="background:black;color:#ecc03e;">get </span><span style="background:black;color:white;">{ </span><span style="background:black;color:#ecc03e;">return </span><span style="background:black;color:white;">_keyName; }
        }

        </span><span style="background:black;color:#ecc03e;">public int </span><span style="background:black;color:white;">ItemCount { </span><span style="background:black;color:#ecc03e;">get</span><span style="background:black;color:white;">; </span><span style="background:black;color:#ecc03e;">internal set</span><span style="background:black;color:white;">; }
    }
}</span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<pre class="code">&#160;</pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>Although not required, if you want to use this Registry Server (it makes a fantastic ‘mock’ server – although not really a Mock at all) put all the code above in a separate assembly for ease of use.</p>
<p>It’s great for trying our many variants of Linq queries over objects (as we do here) as the Registry – although a bit dangerous to muck about with – is a nice hierarchical source with enough interesting turns to make it fun. </p>
<p>In practice we rarely need to change the registry but if we did, it would be though this (we would carefully evolve it so it could perform controlled updates).</p>
<p>&#160;</p>
<h2>The Regression Tests</h2>
<p>&#160;</p>
<p>So we are using xUnit because we like it. Use whatever you want. The code shown next is the abstract base class our real test cases will use:</p>
<p>&#160;</p>
<pre class="code"><span style="background:black;color:#ecc03e;">namespace </span><span style="background:black;color:white;">LinqToORMValidation {
    </span><span style="background:black;color:#ecc03e;">using </span><span style="background:black;color:white;">System;
    </span><span style="background:black;color:#ecc03e;">using </span><span style="background:black;color:white;">domaindotnet.LinqToRegistry;

    </span><span style="background:black;color:#ecc03e;">public abstract class </span><span style="background:black;color:#2b91af;">BaseTestContext </span><span style="background:black;color:white;">{

        </span><span style="background:black;color:#ecc03e;">private static void </span><span style="background:black;color:white;">RegistryServer_OnPopulateProgress(</span><span style="background:black;color:#ecc03e;">object </span><span style="background:black;color:white;">sender, </span><span style="background:black;color:#2b91af;">PopulateProgressEventArgs </span><span style="background:black;color:white;">args)
        {
            </span><span style="background:black;color:#f5f01f;">//Console.WriteLine(&quot;Processed &quot; + args.ItemCount + &quot; items&quot;);

        </span><span style="background:black;color:white;">}

        </span><span style="background:black;color:#ecc03e;">private static void </span><span style="background:black;color:white;">RegistryServer_OnPopulateProgressError(</span><span style="background:black;color:#ecc03e;">object </span><span style="background:black;color:white;">sender, </span><span style="background:black;color:#2b91af;">PopulateProgressEventArgs </span><span style="background:black;color:white;">args)
        {
            </span><span style="background:black;color:#2b91af;">Console</span><span style="background:black;color:white;">.WriteLine(</span><span style="background:black;color:#ecc03e;">&quot;Error : &quot; </span><span style="background:black;color:white;">+ args.KeyName);
        }
        </span><span style="background:black;color:#ecc03e;">protected </span><span style="background:black;color:white;">BaseTestContext() {

            </span><span style="background:black;color:#2b91af;">RegistryServer</span><span style="background:black;color:white;">.PopulateProgress += RegistryServer_OnPopulateProgress;
            </span><span style="background:black;color:#2b91af;">RegistryServer</span><span style="background:black;color:white;">.PopulateProgressItemError += RegistryServer_OnPopulateProgressError;
            </span><span style="background:black;color:#2b91af;">RegistryServer</span><span style="background:black;color:white;">.Initialize();

            </span><span style="background:black;color:#2b91af;">Console</span><span style="background:black;color:white;">.WriteLine(</span><span style="background:black;color:#ecc03e;">&quot;Initialization Complete. Total Records = &quot; </span><span style="background:black;color:white;">+ </span><span style="background:black;color:#2b91af;">RegistryServer</span><span style="background:black;color:white;">.Count);
        }

    }
}</span></pre>
<p><a href="http://11011.net/software/vspaste"></a><a href="http://11011.net/software/vspaste"></a></p>
<p>NOTE: Un-Comment the Console.WriteLine in the OnPopulateProgress to view the status as it runs.</p>
<blockquote>
<p>The main area to see is the protected constructor. It’s clear that the Singleton is exposing a separate Initialize() method (we did this on purpose as it can take a little while for all those keys to get inside the HashSet&lt;T&gt; and debugging things if they go wrong in say a static constructor is harder then making a long-running initialization explicit. In general a good design decision we believe.</p>
</blockquote>
<p>&#160;</p>
<p>So the final part of code for this post at least is the first test which indeed shows the exact query from the beginning working:&quot;</p>
<pre class="code"><span style="background:black;color:white;"></span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<pre class="code"><span style="background:black;color:#ecc03e;">namespace </span><span style="background:black;color:white;">LinqToORMValidation {
    </span><span style="background:black;color:#ecc03e;">using </span><span style="background:black;color:white;">System;
    </span><span style="background:black;color:#ecc03e;">using </span><span style="background:black;color:white;">System.Diagnostics;
    </span><span style="background:black;color:#ecc03e;">using </span><span style="background:black;color:white;">System.Linq;
    </span><span style="background:black;color:#ecc03e;">using </span><span style="background:black;color:white;">domaindotnet.LinqToRegistry;
    </span><span style="background:black;color:#ecc03e;">using </span><span style="background:black;color:white;">Xunit;

    </span><span style="background:black;color:#ecc03e;">public class </span><span style="background:black;color:#2b91af;">RegistryServerValidation </span><span style="background:black;color:white;">: </span><span style="background:black;color:#2b91af;">BaseTestContext </span><span style="background:black;color:white;">{

        </span><span style="background:black;color:gray;">/// &lt;summary&gt;
        /// </span><span style="background:black;color:#9ff5fd;">As a Linq IEnumerable</span><span style="background:black;color:gray;">&lt;T&gt; </span><span style="background:black;color:#9ff5fd;">result
        </span><span style="background:black;color:gray;">/// </span><span style="background:black;color:#9ff5fd;">if anything changed, the
        </span><span style="background:black;color:gray;">/// </span><span style="background:black;color:#9ff5fd;">underlying HashSet</span><span style="background:black;color:gray;">&lt;T&gt; </span><span style="background:black;color:#9ff5fd;">would not change. However if this
        </span><span style="background:black;color:gray;">/// </span><span style="background:black;color:#9ff5fd;">were a direct reference to the HashSet the values ARE
        </span><span style="background:black;color:gray;">/// </span><span style="background:black;color:#9ff5fd;">changeable. The idea is to project out immutable results
        </span><span style="background:black;color:gray;">/// </span><span style="background:black;color:#9ff5fd;">from the Registry server and indeed treat all the data
        </span><span style="background:black;color:gray;">/// </span><span style="background:black;color:#9ff5fd;">as read only
        </span><span style="background:black;color:gray;">/// &lt;/summary&gt;
        </span><span style="background:black;color:white;">[</span><span style="background:black;color:#2b91af;">Fact</span><span style="background:black;color:white;">]
        </span><span style="background:black;color:#ecc03e;">public void </span><span style="background:black;color:white;">should_prove_basic() {

            </span><span style="background:black;color:#f5f01f;">// Find the registry key(s) that have
            // VisualStudo in the name and end in
            // 'FontsAndColors' that also have at least
            // one value defined inside they key

            </span><span style="background:black;color:#ecc03e;">var </span><span style="background:black;color:white;">sw =</span><span style="background:black;color:#2b91af;">Stopwatch</span><span style="background:black;color:white;">.StartNew();

            </span><span style="background:black;color:#ecc03e;">var </span><span style="background:black;color:white;">FindFontsColors = </span><span style="background:black;color:#ecc03e;">from </span><span style="background:black;color:white;">rk </span><span style="background:black;color:#ecc03e;">in </span><span style="background:black;color:#2b91af;">RegistryServer</span><span style="background:black;color:white;">.Hklm
                                  </span><span style="background:black;color:#ecc03e;">where
                                          </span><span style="background:black;color:white;">rk.Name.Contains(</span><span style="background:black;color:#ecc03e;">&quot;VisualStudio&quot;</span><span style="background:black;color:white;">) &amp;&amp;
                                          rk.Name.EndsWith(</span><span style="background:black;color:#ecc03e;">&quot;FontsAndColors&quot;</span><span style="background:black;color:white;">) &amp;&amp;
                                          rk.ValueCount &gt; 0

                                  </span><span style="background:black;color:#ecc03e;">select </span><span style="background:black;color:white;">rk.Name;

            </span><span style="background:black;color:#ecc03e;">var </span><span style="background:black;color:white;">countMatched = FindFontsColors.Count();

            sw.Stop();

            </span><span style="background:black;color:#2b91af;">Console</span><span style="background:black;color:white;">.WriteLine(</span><span style="background:black;color:#ecc03e;">&quot;Total Records Matched = &quot; </span><span style="background:black;color:white;">+ countMatched);
            </span><span style="background:black;color:#2b91af;">Console</span><span style="background:black;color:white;">.WriteLine(</span><span style="background:black;color:#ecc03e;">&quot;Search Took : &quot; </span><span style="background:black;color:white;">+ sw.ElapsedMilliseconds + </span><span style="background:black;color:#ecc03e;">&quot; ms&quot;</span><span style="background:black;color:white;">);

            </span><span style="background:black;color:#f5f01f;">// Assert it took less then one second
            </span><span style="background:black;color:#2b91af;">Assert</span><span style="background:black;color:white;">.True(sw.ElapsedMilliseconds &lt; 1000);
            </span><span style="background:black;color:#2b91af;">ObjectDumper</span><span style="background:black;color:white;">.Write(FindFontsColors);
        }

    }
}</span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>&#160;</p>
<p>&#160;</p>
<p>For this test cases we are very specifically finding any keys across any in HKLM matching the conditions: </p>
<ul>
<li>The key name ‘VisualStudio’ somewhere. </li>
<li>The key ends with &#8216;FontsAndColors’ </li>
<li>The key has at least one value inside (you’ll see why in the next post when things get harder) </li>
</ul>
<p>We also introduce a time to show off the speed of the HashSet&lt;T&gt;.</p>
<p>&#160;</p>
<p>Here I am making the assumption that the name of the key holds identity, and if null, we use standard null semantics (as defined in relational algebra).</p>
<p>The only few interesting points are the use of the static RuntimeHelpers class from .NET as the fact we are using the singleton static instance as the Equality instance.</p>
<p>&#160;</p>
<h2>Running the Code</h2>
<p>&#160;</p>
<p><a href="http://dcarr.files.wordpress.com/2008/09/image1.png"><img style="border-width:0;" title="image" border="0" alt="image" src="http://dcarr.files.wordpress.com/2008/09/image-thumb1.png?w=700&#038;h=526" width="700" height="526" /></a> </p>
<p>As expected we received a few errors, but they make sense as they are protected areas of the registry.</p>
<h3>So we matched across 233142 instances of RegistryKey with three conditions in 746ms. Try that in RegEdt32!!</h3>
<p>&#160;</p>
<div align="right">
<table border="1" cellspacing="4" cellpadding="4" width="400" align="right">
<tbody>
<tr>
<td valign="top" width="390">
<p align="center">MSDN Facts</p>
<p>The HashSet&lt;T&gt; class provides high performance set operations. A set is a collection that contains no duplicate elements, and whose elements are in no particular order. </p>
<p>The capacity of a HashSet&lt;T&gt; object is the number of elements that the object can hold. A HashSet&lt;T&gt; object&#8217;s capacity automatically increases as elements are added to the object. </p>
<p>The HashSet&lt;T&gt; class is a set collection that implements the <a href="http://msdn.microsoft.com/en-us/library/system.collections.icollection.aspx">ICollection</a> interface and the <a href="http://msdn.microsoft.com/en-us/library/92t2ye13.aspx">ICollection&lt;(Of &lt;(T&gt;)&gt;)</a> generic interface. </p>
<p><img src="http://i.msdn.microsoft.com/platform/Controls/CollapsibleArea/resources/minus.gif" /> Set Collections </p>
<p><a name="sectionToggle0"></a></p>
<p>In mathematics, a set is a collection of distinct objects that is usually defined by a rule that determines whether an element is a member of a particular set. For example, a set could be defined to contain &quot;all the odd numbers between 1 and 21&quot; or the numbers &quot;1, 3, 5 and 7&quot;. </p>
<p><img src="http://i.msdn.microsoft.com/platform/Controls/CollapsibleArea/resources/minus.gif" /> The HashSet Class </p>
<p><a name="sectionToggle1"></a></p>
<p>The <a href="http://msdn.microsoft.com/en-us/library/bb359438.aspx">HashSet&lt;(Of &lt;(T&gt;)&gt;)</a> class is based on the model of mathematical sets and provides high-performance set operations similar to accessing the keys of the <a href="http://msdn.microsoft.com/en-us/library/xfhwa508.aspx">Dictionary&lt;(Of &lt;(TKey, TValue&gt;)&gt;)</a> or <a href="http://msdn.microsoft.com/en-us/library/system.collections.hashtable.aspx">Hashtable</a> collections. In simple terms, the <a href="http://msdn.microsoft.com/en-us/library/bb359438.aspx">HashSet&lt;(Of &lt;(T&gt;)&gt;)</a> class can be thought of as a <a href="http://msdn.microsoft.com/en-us/library/xfhwa508.aspx">Dictionary&lt;TKey, TValue&gt;</a> collection without values. </p>
<p>A <a href="http://msdn.microsoft.com/en-us/library/bb359438.aspx">HashSet&lt;(Of &lt;(T&gt;)&gt;)</a> collection is not sorted and cannot contain duplicate elements. If order or element duplication is more important than performance for your application, consider using the <a href="http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx">List&lt;(Of &lt;(T&gt;)&gt;)</a> class together with the <a href="http://msdn.microsoft.com/en-us/library/3da4abas.aspx">Sort</a> method. </p>
<p><a href="http://msdn.microsoft.com/en-us/library/bb359438.aspx">HashSet&lt;(Of &lt;(T&gt;)&gt;)</a> provides many mathematical set operations, such as set addition (unions) and set subtraction. The following table lists the provided <a href="http://msdn.microsoft.com/en-us/library/bb359438.aspx">HashSet&lt;(Of &lt;(T&gt;)&gt;)</a> operations and their mathematical equivalents. </p>
<p>HashSet(Of T) operation </p>
<p>Mathematical equivalent </p>
<p><a href="http://msdn.microsoft.com/en-us/library/bb342097.aspx">UnionWith</a></p>
<p>Union or set addition </p>
<p><a href="http://msdn.microsoft.com/en-us/library/bb293080.aspx">IntersectWith</a></p>
<p>Intersection </p>
<p><a href="http://msdn.microsoft.com/en-us/library/bb299875.aspx">ExceptWith</a></p>
<p>Set subtraction </p>
<p><a href="http://msdn.microsoft.com/en-us/library/bb336848.aspx">SymmetricExceptWith</a></p>
<p>Symmetric difference </p>
<p>In addition to the listed set operations, the <a href="http://msdn.microsoft.com/en-us/library/bb359438.aspx">HashSet&lt;(T&gt;</a> class also provides methods for determining set equality, overlap of sets, and whether a set is a subset or superset of another set. </p>
<p>&#160;</p>
</p>
</td>
</tr>
</tbody>
</table>
</div>
<p>So far this has only set a baseline for the next exploration into these new methods provided in the HashSet&lt;T&gt; you might not have been aware of which we can now easily use: </p>
<p>&#160;</p>
<div id="contents">
<div style="height:607px;" id="ctl00_rs1_ra1" class="resizableArea">
<div id="ctl00_rs1_raRight" class="rightSection">
<div class="RightPanel">
<div class="ContentArea">
<div class="topic">
<div id="mainSection">
<div id="mainBody">
<div id="ctl00_rs1_mainContentContainer_cpe804725" class="MTPS_CollapsibleRegion">
<div style="width:auto;display:block;height:auto;overflow:visible;" id="ctl00_rs1_mainContentContainer_cpe804725_c" class="MTPS_CollapsibleSection">
<div style="border-bottom:medium none;border-left:medium none;display:block;border-top:medium none;border-right:medium none;" class="MTPS_CollapsibleSection">
<div class="tableSection">
<table width="50%">
<tbody>
<tr>
<th width="172">
<p>HashSet(Of T) operation </p>
</th>
<th width="176">
<p>LINQ equivalent </p>
</th>
</tr>
<tr>
<td width="172">
<p><span><a id="ctl00_rs1_mainContentContainer_ctl84" href="http://msdn.microsoft.com/en-us/library/bb342097.aspx">UnionWith</a></span> </p>
</td>
<td width="176">
<p><span><a id="ctl00_rs1_mainContentContainer_ctl85" href="http://msdn.microsoft.com/en-us/library/system.linq.enumerable.union.aspx">Union</a></span> </p>
</td>
</tr>
<tr>
<td width="172">
<p><span><a id="ctl00_rs1_mainContentContainer_ctl86" href="http://msdn.microsoft.com/en-us/library/bb293080.aspx">IntersectWith</a></span> </p>
</td>
<td width="176">
<p><span><a id="ctl00_rs1_mainContentContainer_ctl87" href="http://msdn.microsoft.com/en-us/library/system.linq.enumerable.intersect.aspx">Intersect</a></span> </p>
</td>
</tr>
<tr>
<td width="172">
<p><span><a id="ctl00_rs1_mainContentContainer_ctl88" href="http://msdn.microsoft.com/en-us/library/bb299875.aspx">ExceptWith</a></span> </p>
</td>
<td width="176">
<p><span><a id="ctl00_rs1_mainContentContainer_ctl89" href="http://msdn.microsoft.com/en-us/library/system.linq.enumerable.except.aspx">Except</a></span> </p>
</td>
</tr>
<tr>
<td width="172">
<p>Not Provided </p>
</td>
<td width="176">
<p><span><a id="ctl00_rs1_mainContentContainer_ctl90" href="http://msdn.microsoft.com/en-us/library/system.linq.enumerable.distinct.aspx">Distinct</a></span> </p>
</td>
</tr>
<tr>
<td width="172">
<p><span><a id="ctl00_rs1_mainContentContainer_ctl91" href="http://msdn.microsoft.com/en-us/library/bb336848.aspx">SymmetricExceptWith</a></span> </p>
</td>
<td width="176">
<p>Not Provided. </p>
</td>
</tr>
<tr>
<td width="172">
<p><span><a id="ctl00_rs1_mainContentContainer_ctl92" href="http://msdn.microsoft.com/en-us/library/bb355623.aspx">Overlaps</a></span> </p>
</td>
<td width="176">
<p>Not Provided. </p>
</td>
</tr>
<tr>
<td width="172">
<p><span><a id="ctl00_rs1_mainContentContainer_ctl93" href="http://msdn.microsoft.com/en-us/library/bb358446.aspx">IsSubsetOf</a></span> </p>
</td>
<td width="176">
<p>Not Provided. </p>
</td>
</tr>
<tr>
<td width="172">
<p><span><a id="ctl00_rs1_mainContentContainer_ctl94" href="http://msdn.microsoft.com/en-us/library/bb351418.aspx">IsProperSubsetOf</a></span> </p>
</td>
<td width="176">
<p>Not Provided. </p>
</td>
</tr>
<tr>
<td width="172">
<p><span><a id="ctl00_rs1_mainContentContainer_ctl95" href="http://msdn.microsoft.com/en-us/library/bb346923.aspx">IsSupersetOf</a></span> </p>
</td>
<td width="176">
<p>Not Provided. </p>
</td>
</tr>
<tr>
<td width="172">
<p><span><a id="ctl00_rs1_mainContentContainer_ctl96" href="http://msdn.microsoft.com/en-us/library/bb299734.aspx">IsProperSupersetOf</a></span> </p>
</td>
<td width="176">
<p>Not Provided. </p>
</td>
</tr>
<tr>
<td width="172">
<p><span><a id="ctl00_rs1_mainContentContainer_ctl97" href="http://msdn.microsoft.com/en-us/library/bb346516.aspx">SetEquals</a></span> </p>
</td>
<td width="176">
<p>Not Provided. </p>
</td>
</tr>
</tbody>
</table></div>
</p></div>
</p></div>
</p></div>
</p></div>
</p></div>
</p></div>
</p></div>
</p></div>
</p></div>
</p></div>
</p></div>
<p>&#160;</p>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:57bcd4fd-45be-4e95-9e9b-7dba54a771c6" class="wlWriterSmartContent">Technorati Tags: <a href="http://technorati.com/tags/Linq" rel="tag">Linq</a>,<a href="http://technorati.com/tags/HashSet" rel="tag">HashSet</a>,<a href="http://technorati.com/tags/ORM" rel="tag">ORM</a>,<a href="http://technorati.com/tags/NHibernate" rel="tag">NHibernate</a>,<a href="http://technorati.com/tags/Linq+to+NHibernate" rel="tag">Linq to NHibernate</a>,<a href="http://technorati.com/tags/Linq+Undocumented" rel="tag">Linq Undocumented</a>,<a href="http://technorati.com/tags/Functional+Programming" rel="tag">Functional Programming</a>,<a href="http://technorati.com/tags/.NET+3.5" rel="tag">.NET 3.5</a></div>
<div class="wlWriterHeaderFooter" style="text-align:left;margin:0;padding:4px 0;"><a href="http://digg.com/submit?url=http%3a%2f%2fdcarr.wordpress.com%2f2008%2f09%2f08%2fthe_fastest_dot_net_hash_set_collection_with_linq_extended_features%2f&amp;title=Expose+New+Linq+Operations+from+the+Screaming+HashSet%3cT%3e+Collection"><img src="http://digg.com/img/badges/100x20-digg-button.png" width="100" height="20" alt="Digg This" title="Digg This" border="0" style="border:0;" /></a></div>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/dcarr.wordpress.com/874/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/dcarr.wordpress.com/874/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dcarr.wordpress.com/874/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dcarr.wordpress.com/874/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dcarr.wordpress.com/874/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dcarr.wordpress.com/874/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dcarr.wordpress.com/874/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dcarr.wordpress.com/874/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dcarr.wordpress.com/874/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dcarr.wordpress.com/874/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dcarr.wordpress.com/874/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dcarr.wordpress.com/874/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=874&subd=dcarr&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://team.pushbomb.com/2008/09/08/the_fastest_dot_net_hash_set_collection_with_linq_extended_features/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7b572cbcda5a17fe984e7dd1ddc9c3d6?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">pushbomb</media:title>
		</media:content>

		<media:content url="http://dcarr.files.wordpress.com/2008/09/premature-6-thumb.jpg" medium="image">
			<media:title type="html">premature_optimization</media:title>
		</media:content>

		<media:content url="http://dcarr.files.wordpress.com/2008/09/image-thumb1.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://i.msdn.microsoft.com/platform/Controls/CollapsibleArea/resources/minus.gif" medium="image" />

		<media:content url="http://i.msdn.microsoft.com/platform/Controls/CollapsibleArea/resources/minus.gif" medium="image" />

		<media:content url="http://digg.com/img/badges/100x20-digg-button.png" medium="image">
			<media:title type="html">Digg This</media:title>
		</media:content>
	</item>
		<item>
		<title>Undocumented Linq! .NET 3.5 SP1 Gold Forgot to Mention these Critical Changes that might Break your Code</title>
		<link>http://team.pushbomb.com/2008/08/11/undocumented-linq-net-35-sp1-gold-forgot-to-mention-these-critical-changes-that-might-break-your-code/</link>
		<comments>http://team.pushbomb.com/2008/08/11/undocumented-linq-net-35-sp1-gold-forgot-to-mention-these-critical-changes-that-might-break-your-code/#comments</comments>
		<pubDate>Tue, 12 Aug 2008 01:54:03 +0000</pubDate>
		<dc:creator>Damon Wilder Carr</dc:creator>
				<category><![CDATA[C# 3.0 Enhancements]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[concepts implemented]]></category>
		<category><![CDATA[c# 3.5]]></category>
		<category><![CDATA[Linq]]></category>
		<category><![CDATA[sp1]]></category>
		<category><![CDATA[Undocumented]]></category>

		<guid isPermaLink="false">http://dcarr.wordpress.com/2008/08/11/undocumented-linq-net-35-sp1-gold-forgot-to-mention-these-critical-changes-that-might-break-your-code/</guid>
		<description><![CDATA[There are a few changes (one you absolutely need to know about yet I’ve never seen officially from MSFT) in the just released SP1 for .NET 3.5 . Again, these are completely undocumented. Cast breaking change: Cast was not correctly behaving in all scenarios do it was silently fixed for SP1. This does break you code in some situations! If you’ve been using Cast for example to perform generic collection type conversions well that was not so good. Here are the two assumptions that we used to get away with not following:

The elements in the object based collections need some additional step (specifically an un-box or a reference conversion)

The starting point is only non-generic types (think ICollection, IEnumerable, etc) you call Cast on.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=647&subd=dcarr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://dcarr.files.wordpress.com/2008/08/linq.png"><img style="border-right:0;border-top:0;border-left:0;border-bottom:0;margin:0 0 0 10px;" src="http://dcarr.files.wordpress.com/2008/08/linq-thumb.png?w=351&#038;h=123" border="0" alt="Linq" width="351" height="123" align="right" /></a></p>
<p>These are <a href="http://download.microsoft.com/download/A/2/8/A2807F78-C861-4B66-9B31-9205C3F22252/VS2008SP1Readme.htm#LINQ" target="_blank">completely undocumented. </a></p>
<h2>LINQ to Objects:</h2>
<p><strong></strong></p>
<h6><strong>Specialized enumerable:</strong></h6>
<p><strong></strong>The new implementation recognizes queries that apply Where and/or Select to arrays or List&lt;T&gt; and fold pipelines of multiple enumerable objects into single specialized enumerables.</p>
<p>According to <a href="http://blogs.msdn.com/dinesh.kulkarni/about.aspx" target="_blank">Dinesh Kulkari</a> at Microsoft this enhancement:</p>
<blockquote><p><strong>….produces substantial improvement in base overhead of common LINQ to Objects queries (at times 30+%).</strong></p></blockquote>
<h2>Cast&lt;T&gt; breaking change</h2>
<h5>This is a bug fix and a breaking change.  Note: <a href="http://blogs.msdn.com/ed_maurer/archive/2008/02/16/breaking-change-in-linq-queries-using-explicitly-typed-range-variables.aspx">this</a> post</h5>
<p>Cast&lt;T&gt; was not correctly behaving in all scenarios do it was silently fixed for SP1. This does break you code in some situations!</p>
<p>If you’ve been using Cast&lt;T&gt; for example to perform generic collection type conversions well that was not so good. Here are the two assumptions that we used to get away with not following:</p>
<ul>
<li>The elements in the object based collections need some additional step (specifically an un-box or a reference conversion)</li>
<li>The starting point is only non-generic types (think ICollection, IEnumerable, etc) you call Cast&lt;T&gt; on.</li>
</ul>
<p>So although the fix is a breaking one, it does move Cast&lt;T&gt; to expected and specified behavior (as it worked in beta 2).</p>
<p>Indeed if this breaks your code your code was already silently broken (another possible reason for the silence).</p>
<p><strong>Expect more InvalidCastExceptions (if you start to wonder why).</strong></p>
<p><a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fblog.domaindotnet.com%2f2008%2f08%2f11%2fundocumented-linq-net-35-sp1-gold-forgot-to-mention-these-critical-changes-that-might-break-your-code%2f"><img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fblog.domaindotnet.com%2f2008%2f08%2f11%2fundocumented-linq-net-35-sp1-gold-forgot-to-mention-these-critical-changes-that-might-break-your-code%2f" border="0" alt="kick it on DotNetKicks.com" /></a></p>
<div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:b68e263b-963b-4c0a-bf6e-8d4e0388d117" class="wlWriterSmartContent" style="display:inline;float:none;margin:0;padding:0;">Technorati Tags: <a rel="tag" href="http://technorati.com/tags/.NET+3.5+SP1">.NET 3.5 SP1</a>,<a rel="tag" href="http://technorati.com/tags/LINQ.+performance">LINQ. performance</a>,<a rel="tag" href="http://technorati.com/tags/LINQ+to+Objects">LINQ to Objects</a>,<a rel="tag" href="http://technorati.com/tags/undocumented">undocumented</a></div>
<div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:a6283564-d9f7-4299-a4fe-90f94a34b78b" class="wlWriterSmartContent" style="display:inline;float:none;margin:0;padding:0;">del.icio.us Tags: <a rel="tag" href="http://del.icio.us/popular/.NET+3.5+SP1">.NET 3.5 SP1</a>,<a rel="tag" href="http://del.icio.us/popular/LINQ.+performance">LINQ. performance</a>,<a rel="tag" href="http://del.icio.us/popular/LINQ+to+Objects">LINQ to Objects</a>,<a rel="tag" href="http://del.icio.us/popular/undocumented">undocumented</a></div>
<p><em>Adapted from </em><a href="http://blogs.msdn.com/user/Profile.aspx?UserID=3562"><em>Dinesh.Kulkarni</em></a></p>
<div class="wlWriterHeaderFooter" style="text-align:right;margin:0;padding:4px 0;"><a href="http://digg.com/submit?url=http%3a%2f%2fdcarr.wordpress.com%2f2008%2f08%2f11%2fundocumented-linq-net-35-sp1-gold-forgot-to-mention-these-critical-changes-that-might-break-your-code%2f&amp;title=Undocumented+Linq!+.NET+3.5+SP1+Gold+Forgot+to+Mention+these+Critical+Changes+that+might+Break+your+Code"><img style="border:0;" src="http://digg.com/img/badges/100x20-digg-button.png" border="0" alt="Digg This" width="100" height="20" /></a></div>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/dcarr.wordpress.com/647/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/dcarr.wordpress.com/647/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dcarr.wordpress.com/647/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dcarr.wordpress.com/647/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dcarr.wordpress.com/647/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dcarr.wordpress.com/647/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dcarr.wordpress.com/647/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dcarr.wordpress.com/647/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dcarr.wordpress.com/647/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dcarr.wordpress.com/647/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dcarr.wordpress.com/647/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dcarr.wordpress.com/647/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=647&subd=dcarr&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://team.pushbomb.com/2008/08/11/undocumented-linq-net-35-sp1-gold-forgot-to-mention-these-critical-changes-that-might-break-your-code/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7b572cbcda5a17fe984e7dd1ddc9c3d6?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">pushbomb</media:title>
		</media:content>

		<media:content url="http://dcarr.files.wordpress.com/2008/08/linq-thumb.png" medium="image">
			<media:title type="html">Linq</media:title>
		</media:content>

		<media:content url="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fblog.domaindotnet.com%2f2008%2f08%2f11%2fundocumented-linq-net-35-sp1-gold-forgot-to-mention-these-critical-changes-that-might-break-your-code%2f" medium="image">
			<media:title type="html">kick it on DotNetKicks.com</media:title>
		</media:content>

		<media:content url="http://digg.com/img/badges/100x20-digg-button.png" medium="image">
			<media:title type="html">Digg This</media:title>
		</media:content>
	</item>
		<item>
		<title>JetBrains Releases ReSharper 4.01 Beta 1 as EAP Build 917 &#8211; Download Here</title>
		<link>http://team.pushbomb.com/2008/08/05/resharper-releases-401-beta-1-as-eap-build-917-download-here/</link>
		<comments>http://team.pushbomb.com/2008/08/05/resharper-releases-401-beta-1-as-eap-build-917-download-here/#comments</comments>
		<pubDate>Wed, 06 Aug 2008 01:08:20 +0000</pubDate>
		<dc:creator>Damon Wilder Carr</dc:creator>
				<category><![CDATA[C# 3.0 Enhancements]]></category>
		<category><![CDATA[C# 3.0 for Internal DSL]]></category>
		<category><![CDATA[Industry News]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[concepts implemented]]></category>
		<category><![CDATA[resharper]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[C# 3.0]]></category>
		<category><![CDATA[JetBrains]]></category>
		<category><![CDATA[Must-Have]]></category>
		<category><![CDATA[Refactoring]]></category>
		<category><![CDATA[Resharper]]></category>
		<category><![CDATA[VS 2008 Add-In]]></category>

		<guid isPermaLink="false">http://dcarr.wordpress.com/2008/08/05/resharper-releases-401-beta-1-as-eap-build-917-download-here/</guid>
		<description><![CDATA[Click here to download the new EAP post 4.0 beta 1 release of 4.01 (a maintenance focused release).  On the heels of their 4.0 release which further cemented their utter dominance as the must have Visual Studio 2008 augmentation for true enterprise development, their not resting in the least.Click here to download the new EAP post 4.0 beta 1 release of 4.01 (a maintenance focused release). 

Please participate by providing your experiences to JetBrains so they can evolve this work into another solid must have upgrade. Click here to join their issue tracker as well as newsgroups.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=622&subd=dcarr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<blockquote><p>On the heels of their 4.0 release which is arguably their most strategic in the .NET world to date, JetBrains continues to innovate with this beta.</p></blockquote>
<p><a title="ReSharper New 4.01 Beta" href="http://download.jetbrains.com/resharper/ReSharperSetup.4.0.917.2.msi" target="_blank">Click here to download</a> the new EAP post 4.0  release of 4.01 (a maintenance focused release).<a href="http://www.jetbrains.com/"><img class="alignright size-full wp-image-624" style="border:2px solid black;margin:2px;" src="http://dcarr.files.wordpress.com/2008/08/pic_buy_rs.gif?w=138&#038;h=119" alt="" width="138" height="119" /></a></p>
<p>Please participate by providing your experiences to JetBrains so they can evolve this work into another solid must have upgrade.</p>
<p>We’re using this release with great success (however we do not use the VB.NET aspects so no comment there).</p>
<p>Also make sure to check out the add-ins for 4.0 <a href="http://www.jetbrains.com/resharper/plugins/" target="_blank">here</a>.</p>
<div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:07bcd8e2-0fcb-4f85-93bc-fec30e221398" class="wlWriterSmartContent" style="display:inline;float:none;margin:0;padding:0;">del.icio.us Tags: <a rel="tag" href="http://del.icio.us/popular/ReSharper">ReSharper</a>,<a rel="tag" href="http://del.icio.us/popular/C%23+3.0">C# 3.0</a>,<a rel="tag" href="http://del.icio.us/popular/VS+2008+Add-In">VS 2008 Add-In</a>,<a rel="tag" href="http://del.icio.us/popular/Must-Have">Must-Have</a>,<a rel="tag" href="http://del.icio.us/popular/ReFactoring">ReFactoring</a>,<a rel="tag" href="http://del.icio.us/popular/Agile">Agile</a>,<a rel="tag" href="http://del.icio.us/popular/JetBrains">JetBrains</a></div>
<div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:c8dd9da0-eab0-4c6e-8a24-fce6661020e5" class="wlWriterSmartContent" style="display:inline;float:none;margin:0;padding:0;">Technorati Tags: <a rel="tag" href="http://technorati.com/tags/ReSharper">ReSharper</a>,<a rel="tag" href="http://technorati.com/tags/C%23+3.0">C# 3.0</a>,<a rel="tag" href="http://technorati.com/tags/VS+2008+Add-In">VS 2008 Add-In</a>,<a rel="tag" href="http://technorati.com/tags/Must-Have">Must-Have</a>,<a rel="tag" href="http://technorati.com/tags/ReFactoring">ReFactoring</a>,<a rel="tag" href="http://technorati.com/tags/Agile">Agile</a>,<a rel="tag" href="http://technorati.com/tags/JetBrains">JetBrains</a></div>
<div class="wlWriterHeaderFooter" style="text-align:right;margin:0;padding:4px 0;"><a href="http://digg.com/submit?url=http%3a%2f%2fdcarr.wordpress.com%2f2008%2f08%2f05%2fresharper-releases-401-beta-1-as-eap-build-917-download-here%2f&amp;title=ReSharper+Releases+4.01+Beta+1+as+EAP+Build+917+%e2%80%93+Download+Here"><img style="border:0;" src="http://digg.com/img/badges/100x20-digg-button.png" border="0" alt="Digg This" width="100" height="20" /></a></div>
<p><a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fblog.domaindotnet.com%2f2008%2f08%2f05%2fresharper-releases-401-beta-1-as-eap-build-917-download-here%2f"><img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fblog.domaindotnet.com%2f2008%2f08%2f05%2fresharper-releases-401-beta-1-as-eap-build-917-download-here%2f" border="0" alt="kick it on DotNetKicks.com" /></a></p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/dcarr.wordpress.com/622/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/dcarr.wordpress.com/622/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dcarr.wordpress.com/622/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dcarr.wordpress.com/622/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dcarr.wordpress.com/622/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dcarr.wordpress.com/622/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dcarr.wordpress.com/622/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dcarr.wordpress.com/622/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dcarr.wordpress.com/622/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dcarr.wordpress.com/622/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dcarr.wordpress.com/622/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dcarr.wordpress.com/622/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=622&subd=dcarr&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://team.pushbomb.com/2008/08/05/resharper-releases-401-beta-1-as-eap-build-917-download-here/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7b572cbcda5a17fe984e7dd1ddc9c3d6?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">pushbomb</media:title>
		</media:content>

		<media:content url="http://dcarr.files.wordpress.com/2008/08/pic_buy_rs.gif" medium="image" />

		<media:content url="http://digg.com/img/badges/100x20-digg-button.png" medium="image">
			<media:title type="html">Digg This</media:title>
		</media:content>

		<media:content url="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fblog.domaindotnet.com%2f2008%2f08%2f05%2fresharper-releases-401-beta-1-as-eap-build-917-download-here%2f" medium="image">
			<media:title type="html">kick it on DotNetKicks.com</media:title>
		</media:content>
	</item>
		<item>
		<title>Linq Framework Design Guidelines : don&#8217;t wait for the book update</title>
		<link>http://team.pushbomb.com/2008/07/27/linq-framework-design-guidelines-great-content-from-the-upcoming-book/</link>
		<comments>http://team.pushbomb.com/2008/07/27/linq-framework-design-guidelines-great-content-from-the-upcoming-book/#comments</comments>
		<pubDate>Sun, 27 Jul 2008 15:00:36 +0000</pubDate>
		<dc:creator>Damon Wilder Carr</dc:creator>
				<category><![CDATA[C# 3.0 Enhancements]]></category>
		<category><![CDATA[C# 3.0 for Internal DSL]]></category>
		<category><![CDATA[Framework Design]]></category>
		<category><![CDATA[Software Design]]></category>
		<category><![CDATA[.NET 3.0]]></category>
		<category><![CDATA[Architecture]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Domain Driven]]></category>
		<category><![CDATA[dsl]]></category>
		<category><![CDATA[Fluent API]]></category>
		<category><![CDATA[Linq]]></category>

		<guid isPermaLink="false">http://dcarr.wordpress.com/?p=557</guid>
		<description><![CDATA[Do not implement IQueryable

without understanding all the performance tradeoffs. 



·     Building and parsing expression trees is expensive and many queries can actually get slower when IQueryable

is implemented. 



·     

The trade-off is acceptable in the LINQ to SQL case, since the alternative overhead of performing queries in memory would have been far greater than the transformation of the expression to an SQL statement and the delegation of the query processing to the database server.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=557&subd=dcarr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>This is from the team that brought you <a href="http://www.amazon.com/dp/0321246756?tag=cwalina-20&amp;camp=14573&amp;creative=327641&amp;linkCode=as1&amp;creativeASIN=0321246756&amp;adid=16XTFVZSF2T2H97M2AWS&amp;">‘Framework Design Guidelines’</a> led by <a href="http://blogs.msdn.com/kcwalina/">Krzysztof Cwalina</a>, an individual we are not shy to recognize as an amazing mind.</p>
<p>Look for this content (as shared here from their internal work) in the next version of the book</p>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<h2>A Quick Overview</h2>
<ul>
<li>
<div><span style="color:#ffffff;"><span style="font-family:batang;">The Query Pattern, a specification of the set of methods a type must provide in order to be considered as a LINQ provider. The names of these methods can be found in </span><span>System.Linq.Enumerable</span><span style="font-family:batang;"> (found in </span><span>System.Core</span><span style="font-family:batang;">). Their signature follows a pattern that will be discussed later in this chapter.<br />
</span></span></div>
</li>
<li>
<div><span style="color:#ffffff;"><span style="font-family:batang;">A definition of a new interface,<strong> </strong></span><span><strong>IQueryable&lt;T&gt; :I Enumerable&lt;T&gt;<br />
</strong></span></span></div>
</li>
<li>
<div><span style="color:#ffffff;"><span style="font-family:symbol;"><span><span> </span></span></span><span style="font-family:batang;">New types representing generic delegates: </span><span>Func&lt;&gt; </span><span style="font-family:batang;">and </span><span>Action&lt;&gt;<br />
</span></span></div>
</li>
<li>
<div><span style="font-family:batang;"><span style="color:#ffffff;">Lambda expressions, a language feature in VB and C# for defining anonymous delegate </span></span><span style="color:#ffffff;"><span style="font-family:batang;">types representing the notion of a delay-compiled delegate, the </span><span>Expression&lt;&gt;</span><span style="font-family:batang;"> family of types.<br />
</span></span></div>
</li>
<li>
<div><span style="font-family:batang;"><span style="color:#ffffff;">An extension to the C# and VB syntax allowing for queries to be expressed in an alternative, SQL-like format. For example (C#):</span></span></div>
</li>
</ul>
<table style="height:241px;" border="1" cellspacing="5" cellpadding="5" width="841">
<tbody>
<tr>
<td width="485" valign="top"><span><span style="font-family:courier;"> </span></span><span><span style="font-family:courier;"> </span></span><span><span style="font-family:courier;"><strong> </strong></span></span></p>
<p><span><span style="font-family:courier;"><strong>//using extension methods: </strong></span></span></p>
<p><span><span style="font-family:courier;"> </span></span></p>
<p><span><span style="font-family:courier;"><strong>IEnumerable&lt;string&gt; names = set.Where(x=&gt;x.Age&gt;20).Select(x=&gt;x.Name); </strong></span></span></p>
<p><span><span style="font-family:courier;"> </span><span style="font-family:courier;"><strong> </strong></span></span><strong> </strong></p>
<p><span><span style="font-family:courier;"><strong>//using SQL-like syntax: </strong></span></span></p>
<p><span><span style="font-family:courier;"> </span></span></p>
<p><span><span style="font-family:courier;"><strong>IEnumerable&lt;string&gt; names = from x in set where x.Age&gt;20 </strong></span></span></p>
<p><span><span style="font-family:courier;"> </span></span></p>
<p><span><span style="font-family:courier;"><strong><span> </span>select x.Name; </strong></span></span></p>
<p><span><span style="font-family:courier;"> </span></span></td>
</tr>
</tbody>
</table>
<p class="DO-codefirstCxSpFirst" style="margin:5pt 0 0 30.25pt;">
<div class="DO-codefirstCxSpFirst" style="margin:5pt 0 0 30.25pt;"><span><span style="font-family:courier;"> </span></span></div>
<p><span><span style="font-family:courier;"> </span></span></p>
<p><span><span style="font-family:courier;"> </span></span><span style="font-family:courier;"> </span></p>
<blockquote><p><span>The interplay between these features is the following: any </span><span>IEnumerable&lt;&gt;</span><span style="font-family:batang;"> can be queried upon using the LINQ extension methods, most of which require one or more lambda expressions as parameters; this leads to an in-memory, generic evaluation of the queries. For cases where the set of data is not in memory (e.g. in a database), and/or queries may be optimized, the set of data is presented as an </span><span>IQueryable&lt;&gt;</span><span style="font-family:batang;">. If lambda expressions are given as parameters, they are transformed by the compiler to </span><span>Expression&lt;&gt;</span><span style="font-family:batang;"> objects. The implementation of </span><span>IQueryable&lt;&gt;</span><span style="font-family:batang;"> is responsible for processing said expressions. For example, the implementation of an </span><span>IQueryable&lt;&gt;</span><span style="font-family:batang;"> representing a database table would translate </span><span>Expression&lt;&gt;</span><span> objects to SQL queries.</span></p></blockquote>
<p class="NL" style="margin:2pt 0 0 24pt;"><span style="font-family:batang;"> </span></p>
<h2 style="margin:24pt 0 12pt .25in;"><span style="color:#4f81bd;"><span><span><span style="font-size:medium;font-family:cambria;">2.</span><span> </span></span></span><span style="font-size:medium;font-family:cambria;">Extension Methods, Func&lt;&gt;, Action&lt;&gt;, and Expression&lt;&gt;</span></span></h2>
<p class="BodyFirst" style="margin:10pt 0 0;"><span style="font-family:batang;"><strong><span style="font-size:11pt;">Extension methods</span></strong><span style="font-size:11pt;"> constitute a language feature that allows static methods to be invoked on instance variables. These methods must take at least one parameter, which represents the instance the method is to operate on. For example, in C#, this is done by using the </span></span><span style="font-size:11pt;">this</span><span style="font-size:11pt;"><span style="font-family:batang;"> modifier on such a parameter, when defining the method:</span></span></p>
<p class="BodyFirst" style="margin:10pt 0 0;">
<div class="BodyFirst" style="margin:10pt 0 0;"><span style="font-size:11pt;"> </span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="CodeFirstCxSpFirst" style="margin:6pt 0 0 15.1pt;">
<div class="CodeFirstCxSpFirst" style="margin:6pt 0 0 15.1pt;"><span><span style="font-family:courier;">public static bool IsPalindrome(<strong>this</strong> string s){ </span></span></div>
<p><span><span style="font-family:courier;"> </span></span></p>
<p class="CodeFirstCxSpMiddle" style="margin:0 0 0 15.1pt;">
<div class="CodeFirstCxSpMiddle" style="margin:0 0 0 15.1pt;"><span><span style="font-family:courier;"><span> </span>//implementation follows here </span></span></div>
<p><span><span style="font-family:courier;"> </span></span></p>
<p class="CodeFirstCxSpLast" style="margin:0 0 0 15.1pt;"><span><span style="font-family:courier;">}</span></span></p>
<p class="CodeFirstCxSpLast" style="margin:0 0 0 15.1pt;">
<div class="CodeFirstCxSpLast" style="margin:0 0 0 15.1pt;"><span> </span></div>
<p><span><span style="font-family:courier;"> </span></span></p>
<p class="Body" style="margin:10pt 0 6pt;">
<div class="Body" style="margin:10pt 0 6pt;"><span style="font-size:11pt;"><span style="font-family:batang;">This example allows one to write, for example: </span></span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="CodeFirst" style="margin:6pt 0 0 15.1pt;">
<div class="CodeFirst" style="margin:6pt 0 0 15.1pt;"><span>“some string”.IsPalindrome(); </span></div>
<p><span> </span></p>
<p class="BodyCxSpFirst" style="margin:10pt 0 0;"><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="BodyCxSpMiddle" style="margin:0;"><span style="font-size:11pt;"><span style="font-family:batang;">&#8230;which in this case would result in </span></span><span style="font-size:11pt;">false</span></p>
<div class="BodyCxSpMiddle" style="margin:0;"><span style="font-size:11pt;"><span style="font-family:batang;">being displayed on the console. </span></span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="BodyCxSpMiddle" style="margin:0;"><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="BodyCxSpMiddle" style="margin:0;">
<div class="BodyCxSpMiddle" style="margin:0;"><span style="font-size:11pt;"><span style="font-family:batang;">The class that defines such extension methods is referred to in this text as “sponsor” class, and it must be declared as static. To use extension methods, one must import the namespace defining their sponsor class. </span></span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="BodyCxSpMiddle" style="margin:0;"><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="BodyCxSpLast" style="margin:0 0 6pt;">
<div class="BodyCxSpLast" style="margin:0 0 6pt;"><span style="font-family:batang;"><strong><span style="font-size:11pt;">Func&lt;&gt;</span></strong></p>
<div class="BodyCxSpLast" style="margin:0 0 6pt;"><span style="font-size:11pt;">objects represent a generic delegate. For example: </span></div>
<p></span></div>
<p><span style="font-family:batang;"><span style="font-size:11pt;"> </span></span></p>
<p class="CodeFirstCxSpFirst" style="margin:6pt 0 0 15.1pt;">
<div class="CodeFirstCxSpFirst" style="margin:6pt 0 0 15.1pt;"><span><span style="font-family:courier;">Func&lt;int,int,double&gt; divide=(x,y)=&gt;(double)x/(double)y; </span></span></div>
<p><span><span style="font-family:courier;"> </span></span></p>
<p class="CodeFirstCxSpLast" style="margin:0 0 0 15.1pt;">
<div class="CodeFirstCxSpLast" style="margin:0 0 0 15.1pt;"><span><span style="font-family:courier;">Console.WriteLine(divide(2,3)); </span></span></div>
<p><span><span style="font-family:courier;"> </span></span></p>
<p class="Body" style="margin:10pt 0 6pt;"><span style="font-size:11pt;"><span style="font-family:batang;">In this example, divide is a function that takes two integers and returns a double. The last parameter in the generic definition of a </span></span><span style="font-size:11pt;">Func&lt;&gt;</span><span style="font-size:11pt;"><span style="font-family:batang;"> is always the return type. To represent void-returning functions, use </span></span><span style="font-size:11pt;">Action&lt;&gt;</span></p>
<div class="Body" style="margin:10pt 0 6pt;"><span style="font-size:11pt;"><span style="font-family:batang;">instead. For example: </span></span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="CodeFirstCxSpFirst" style="margin:6pt 0 0 15.1pt;">
<div class="CodeFirstCxSpFirst" style="margin:6pt 0 0 15.1pt;"><span><span style="font-family:courier;">Action&lt;double&gt; write=(aDouble)=&gt;Console.WriteLine(aDouble); </span></span></div>
<p><span><span style="font-family:courier;"> </span></span></p>
<p class="CodeFirstCxSpLast" style="margin:0 0 0 15.1pt;">
<div class="CodeFirstCxSpLast" style="margin:0 0 0 15.1pt;"><span><span style="font-family:courier;">write(divide(2,3)); </span></span></div>
<p><span><span style="font-family:courier;"> </span></span></p>
<p class="Body" style="margin:10pt 0 6pt;">
<div class="Body" style="margin:10pt 0 6pt;"><span style="font-family:batang;"><strong><span style="font-size:11pt;">Expression&lt;&gt;</span></strong></p>
<div class="Body" style="margin:10pt 0 6pt;"><span style="font-size:11pt;">objects represent function definitions that can be compiled and subsequently invoked at runtime. Continuing with our example: </span></div>
<p></span></div>
<p><span style="font-family:batang;"><span style="font-size:11pt;"> </span></span></p>
<p class="CodeFirstCxSpFirst" style="margin:6pt 0 0 15.1pt;">
<div class="CodeFirstCxSpFirst" style="margin:6pt 0 0 15.1pt;"><span><span style="font-family:courier;">Expression&lt;Func&lt;int,int,double&gt;&gt; divideBody=(x,y)=&gt;(double)x/(double)y; </span></span></div>
<p><span><span style="font-family:courier;"> </span></span></p>
<p class="CodeFirstCxSpMiddle" style="margin:0 0 0 15.1pt;">
<div class="CodeFirstCxSpMiddle" style="margin:0 0 0 15.1pt;"><span><span style="font-family:courier;">Func&lt;int,int,double&gt; divide2=divideBody.Compile(); </span></span></div>
<p><span><span style="font-family:courier;"> </span></span></p>
<p class="CodeFirstCxSpLast" style="margin:0 0 0 15.1pt;">
<div class="CodeFirstCxSpLast" style="margin:0 0 0 15.1pt;"><span><span style="font-family:courier;">write(divide2(2,3)); </span></span></div>
<p><span><span style="font-family:courier;"> </span></span></p>
<p class="BodyCxSpFirst" style="margin:14pt 0 0;"><span style="font-size:11pt;"><span style="font-family:batang;">Notice how the syntax for constructing an </span></span><span style="font-size:11pt;">Expression&lt;&gt; </span><span style="font-size:11pt;"><span style="font-family:batang;">object is very similar to the one used to construct a </span></span><span style="font-size:11pt;">Func&lt;&gt; </span><span style="font-size:11pt;"><span style="font-family:batang;">object; in fact, the only difference is the static type declaration of the variable (</span></span><span style="font-size:11pt;">Expression&lt;&gt; </span><span style="font-size:11pt;"><span style="font-family:batang;">instead of </span></span><span style="font-size:11pt;">Func&lt;&gt;</span></p>
<div class="BodyCxSpFirst" style="margin:14pt 0 0;"><span style="font-size:11pt;"><span style="font-family:batang;">). </span></span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="BodyCxSpMiddle" style="margin:14pt 0 0;"><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="BodyCxSpLast" style="margin:14pt 0 6pt;"><span style="font-size:11pt;"><span style="font-family:batang;">Expressions may also be constructed programmatically, using the predefined static methods of the non-generic </span></span><span style="font-size:11pt;">Expression</span></p>
<div class="BodyCxSpLast" style="margin:14pt 0 6pt;"><span style="font-size:11pt;"><span style="font-family:batang;">class, however, this is a topic that does not need to be covered for our purposes here. </span></span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span class="DO1"><span style="font-size:11pt;color:#ff0000;font-family:wingdings;"><span>ý</span></span></span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-family:batang;"><span class="DO1"><span style="font-size:11pt;color:#ff0000;"> </span></span><span class="DO1"><strong><span style="text-decoration:underline;"><span style="font-size:11pt;">Avoid</span></span></strong></span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">frivolous use of the extension methods feature when defining methods on a new type. Use the canonical, language-specific means for defining type members. </span></div>
<p></span></div>
<p><span style="font-family:batang;"><span style="font-size:11pt;"> </span></span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;">
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;"><span style="font-family:batang;">There are a few reasons for this. The main one is that liberal use of extension methods has the potential of cluttering the API of types. Another reason is that extension methods are a compile-time facility, and not all languages provide support for them. </span></span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;">
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;"><span style="font-family:batang;">There are, of course, scenarios in which extension methods should be employed. These are outlined in what follows. </span></span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;font-family:wingdings;"><span>þ</span></span></strong></span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-family:batang;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;"> </span></strong></span><span class="DO1"><strong><span style="text-decoration:underline;"><span style="font-size:11pt;">Consider</span></span></strong></span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">using extension methods in any of the following scenarios: </span></div>
<p></span></div>
<p><span style="font-family:batang;"><span style="font-size:11pt;"> </span></span></p>
<p class="DOFirst" style="text-indent:-.25in;margin:12pt 0 6pt .5in;"><span style="font-size:11pt;font-family:symbol;"><span>·<span> </span></span></span><span style="font-size:11pt;"><span style="font-family:batang;">to provide helper functionality relevant to every implementation of an interface, if said functionality can be written in terms of the core interface. This is because concrete implementations cannot otherwise be assigned to interfaces. For example, the LINQ to Objects operators are implemented as extension methods for all </span></span><span style="font-size:11pt;">IEnumerable&lt;T&gt;</span><span style="font-size:11pt;"><span style="font-family:batang;"> types. Thus, any </span></span><span style="font-size:11pt;">IEnumerable&lt;&gt;</span></p>
<div class="DOFirst" style="text-indent:-.25in;margin:12pt 0 6pt .5in;"><span style="font-size:11pt;"><span style="font-family:batang;">implementation is automatically LINQ-enabled </span></span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="DOFirst" style="text-indent:-.25in;margin:12pt 0 6pt .5in;"><span style="font-size:11pt;font-family:symbol;"><span>·<span> </span></span></span></p>
<div class="DOFirst" style="text-indent:-.25in;margin:12pt 0 6pt .5in;"><span style="font-size:11pt;"><span style="font-family:batang;">when object model considerations would dictate taking a dependency on some assembly, but taking such a dependency would break dependency management rules. </span></span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="DOFirst" style="text-indent:0;margin:12pt 0 6pt .5in;"><span style="font-size:11pt;"><span style="font-family:batang;">For example, consider the domain of telecommunications. Let us consider that a core domain-specific model is that of network nodes. A library is defined for this domain, called </span></span><span style="font-size:11pt;">nodes.dll</span><span style="font-size:11pt;"><span style="font-family:batang;">. The library contains types such as </span></span><span style="font-size:11pt;">Node</span><span style="font-size:11pt;"><span style="font-family:batang;">. </span></span><span style="font-size:11pt;">Node</span><span style="font-size:11pt;"><span style="font-family:batang;"> may have properties such as “address” and “manufacturer”, etc. Now consider the problem of establishing communication paths through such a network (i.e. routing). A second library, </span></span><span style="font-size:11pt;">routing.dll</span><span style="font-size:11pt;"><span style="font-family:batang;">, is thus developed, taking a dependency on </span></span><span style="font-size:11pt;">nodes.dll</span><span style="font-size:11pt;"><span style="font-family:batang;">. Good engineering practice dictates that </span></span><span style="font-size:11pt;">nodes.dll </span><span style="font-size:11pt;"><span style="font-family:batang;">not take a dependency on </span></span><span style="font-size:11pt;">routing.dll</span><span style="font-size:11pt;"><span style="font-family:batang;">. <span> </span>However, it could be imagined that, in the domain of path routing, the model for network nodes may have new characteristics, namely, that of being or not a path endpoint, and that of being associated with a number of paths. To maintain clean dependencies, a possibility is to have static methods defined in </span></span><span style="font-size:11pt;">routing.dll</span><span style="font-size:11pt;"><span style="font-family:batang;">, e.g. </span></span><span style="font-size:11pt;">Paths.IsNodePathEndpoint(Node n)</span><span style="font-size:11pt;"><span style="font-family:batang;"> or </span></span><span style="font-size:11pt;">Paths.GetListOfPathsCrossingNode(Node n)</span><span style="font-size:11pt;"><span style="font-family:batang;">. However, it may be considered more natural to simply have methods like </span></span><span style="font-size:11pt;">IsEndpoint()</span><span style="font-size:11pt;"><span style="font-family:batang;"> defined on </span></span><span style="font-size:11pt;">Node</span></p>
<div class="DOFirst" style="text-indent:0;margin:12pt 0 6pt .5in;"><span style="font-size:11pt;"><span style="font-family:batang;">. Defining extension methods on the Node type in the paths library is, thus, the option to be considered. </span></span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span class="DO1"><span style="font-size:11pt;color:#ff0000;font-family:wingdings;"><span>ý</span></span></span><span style="font-family:batang;"><span class="DO1"><span style="font-size:11pt;color:#ff0000;"> </span></span><span class="DO1"><strong><span style="text-decoration:underline;"><span style="font-size:11pt;">Avoid</span></span></strong></span><span style="font-size:11pt;"> defining extension methods on </span></span><span style="font-size:11pt;">System.Object</span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;"><span style="font-family:batang;">, unless absolutely necessary. When doing so, be aware that VB users will not be able to use thus-defined extension methods and, as such, they will not be able to take advantage of usability/syntax benefits that come with extension methods. </span></span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;"><span style="font-family:batang;">This is because, in VB, declaring a variable as </span></span><span style="font-size:11pt;">object</span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;"><span style="font-family:batang;">forces all method invocations on it to be late bound – while bindings to extension methods are compile-time determined (early bound). For example: </span></span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;">public static class SomeExtensions{ </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;"><span> </span>static void Foo(this object o){…} </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;">} </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;">… </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;">Object o = … </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;">o.Foo(); </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:11pt;"><span style="font-family:batang;">In this example, the call to </span></span><span style="font-size:11pt;">Foo</span></p>
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:11pt;"><span style="font-family:batang;">will fail in VB. Instead, the VB syntax should simply be: </span></span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;">SomeExtensions.Foo(o) </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;font-family:courier;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:11pt;"><span style="font-family:batang;">Note that the guideline applies to other languages where the same binding behavior is present, or where extension methods are not supported. </span></span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span class="DO1"><span style="font-size:11pt;color:#ff0000;font-family:wingdings;"><span>ý</span></span></span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-family:batang;"><span class="DO1"><span style="font-size:11pt;color:#ff0000;"> </span></span><span class="DO1"><strong><span style="text-decoration:underline;"><span style="font-size:11pt;">Do not</span></span></strong></span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">put extension methods in the same namespace as the extended type, unless it is for adding methods to interfaces, or for dependency management. In the latter case, the type would be in a different assembly. </span></div>
<p></span></div>
<p><span style="font-family:batang;"><span style="font-size:11pt;"> </span></span></p>
<p class="DO" style="margin:12pt 0 6pt 12.25pt;"><span class="DO1"><span style="font-size:11pt;color:#ff0000;font-family:wingdings;"><span>ý</span></span></span><span style="font-family:batang;"><span class="DO1"><span style="font-size:11pt;color:#ff0000;"> </span></span><span class="DO1"><strong><span style="text-decoration:underline;"><span style="font-size:11pt;">Avoid</span></span></strong></span><span style="font-size:11pt;"> redefining extension methods on a type </span></span><span style="font-size:11pt;">T</span></p>
<div class="DO" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;"><span style="font-family:batang;">with extension methods on the same type. </span></span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="DO" style="margin:12pt 0 6pt 12.25pt;">
<div class="DO" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;"><span style="font-family:batang;">For example, in C#, if two different namespaces defined the same extension method on the same type, it would be impossible to import both namespaces in the same file – the compiler would report an ambiguity. </span></span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><strong><span style="font-size:8pt;">&lt;file 1&gt; </span></strong></div>
<p><strong><span style="font-size:8pt;"> </span></strong></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;">namespace A{ </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;"><span> </span>public static class ExtMethodsInA{ </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;"><span> </span>public static void ExtMethod(this T obj){…} </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;"><span> </span>} </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;">} </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><strong><span style="font-size:8pt;">&lt;file 2&gt; </span></strong></div>
<p><strong><span style="font-size:8pt;"> </span></strong></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;">namespace B{ </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;"><span> </span>public static class ExtMethodsInB{ </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;"><span> </span>static void ExtMethod(this T obj){…} </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;"><span> </span>} </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;">} </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><strong><span style="font-size:8pt;">&lt;file 3&gt; </span></strong></div>
<p><strong><span style="font-size:8pt;"> </span></strong></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;">using A; </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;">using B; </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:11pt;"><span style="font-family:batang;">This will fail at compile time, since </span></span><span style="font-size:11pt;">ExtMethod</span></p>
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:11pt;"><span style="font-family:batang;">is considered to be defined twice. This may break valid reusability scenarios; if the scenarios occur late in the development cycle, refactoring namespaces may prove costly. It is thus preferable to avoid this form of overriding methods. </span></span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="BodyFirst" style="margin:10pt 0 0;">
<div class="BodyFirst" style="margin:10pt 0 0;"><span style="font-family:batang;"><span style="font-size:11pt;"><span> </span></span></span></div>
<p><span style="font-family:batang;"><span style="font-size:8pt;font-family:courier;"> </span></span></p>
<table class="MsoNormalTable" style="border-collapse:collapse;margin:auto auto auto 9pt;" border="0" cellspacing="5" cellpadding="5" width="497">
<tbody>
<tr style="height:132pt;">
<td style="border:3pt solid black;background:#e6e6e6 none repeat scroll 0 0;width:351pt;height:132pt;padding:9pt;" width="485">
<p class="AnnotationHead" style="margin:6pt 0 0 .25in;"><span><span style="font-size:small;"><strong> </strong></span></span></p>
<div><span><span style="font-size:small;"></p>
<div><strong><span style="color:#000000;">Mircea Trofin </span></strong></div>
<p></span></span></div>
<p><span><span style="font-size:small;"><strong><span style="color:#000000;"> </span></strong> </span></span></p>
<div><span style="font-size:11pt;"><strong><span style="color:#000000;">Such a situation may occur when using a mix of third-party libraries. To resolve it, import in a file only one namespace defining extension methods on a type, and use fully-qualified static method calls for extension methods defined on the same type in a different namespace. </span></strong></span></div>
<p><span style="font-size:11pt;"><strong><span style="color:#000000;"> </span></strong> </span></p>
<div><span style="font-size:11pt;"><strong><span style="color:#000000;">Using the example before: </span></strong></span></div>
<p><span style="font-size:11pt;"><strong><span style="color:#000000;"> </span></strong> </span></p>
<div><span style="font-size:8pt;"></p>
<div><strong><span style="color:#000000;">&lt;file 3&gt; </span></strong></div>
<p></span></div>
<p><span style="font-size:8pt;"><strong><span style="color:#000000;"> </span></strong> </span></p>
<div><span style="font-size:8pt;"></p>
<div><strong><span style="color:#000000;">using A; </span></strong></div>
<p></span></div>
<p><span style="font-size:8pt;"><strong><span style="color:#000000;"> </span></strong> </span></p>
<div><span style="font-size:8pt;"></p>
<div><strong><span style="color:#000000;">… </span></strong></div>
<p></span></div>
<p><span style="font-size:8pt;"><strong><span style="color:#000000;"> </span></strong> </span></p>
<div><span style="font-size:8pt;"></p>
<div><strong><span style="color:#000000;">T someObj=… </span></strong></div>
<p></span></div>
<p><span style="font-size:8pt;"><strong><span style="color:#000000;"> </span></strong> </span></p>
<div><span style="font-size:8pt;"></p>
<div><strong><span style="color:#000000;">someObj.ExtMethod(); //this calls A.ExtMethodsInA.ExtMethod </span></strong></div>
<p></span></div>
<p><span style="font-size:8pt;"><strong><span style="color:#000000;"> </span></strong> </span></p>
<p><span style="font-size:8pt;"><strong><span style="color:#000000;">B.<span> B.</span>ExtMethodsInB.ExtMethod(someObj); //to avoid compilation errors of file 3, we call explicitly the extension method defined in namespace B</span></strong></span></td>
</tr>
</tbody>
</table>
<p class="NL" style="text-indent:0;margin:2pt 0 0;"><span style="font-size:8pt;"> </span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;font-family:wingdings;"><span>þ</span></span></strong></span><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;"> </span></strong></span><span class="DO1"><strong><span style="text-decoration:underline;"><span style="font-size:11pt;">Do</span></span></strong></span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">define extension methods in the same namespace as the extended type, if the type is an interface, and if the extension methods are meant to be used in most or all cases. </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span class="DO1"><span style="font-size:11pt;color:#ff0000;font-family:wingdings;"><span>ý</span></span></span><span class="DO1"><span style="font-size:11pt;color:#ff0000;"> </span></span><span class="DO1"><strong><span style="text-decoration:underline;"><span style="font-size:11pt;">Do not</span></span></strong></span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">define extension methods pertaining to a feature in namespaces normally associated with other features. Instead, define them in the namespace associated with the feature they belong to, or a namespace of it. </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">For example, do not define extension methods for </span><span style="font-size:11pt;">Telecom.Node </span><span style="font-size:11pt;">in the </span><span style="font-size:11pt;">Telecom </span><span style="font-size:11pt;">namespace, but in a separate namespace, e.g. </span><span style="font-size:11pt;">Routing</span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">. </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="DO" style="margin:12pt 0 6pt 12.25pt;"><span class="DO1"><span style="font-size:11pt;color:#ff0000;font-family:wingdings;"><span>ý</span></span></span><span class="DO1"><span style="font-size:11pt;color:#ff0000;"> </span></span><span class="DO1"><strong><span style="text-decoration:underline;"><span style="font-size:11pt;">Avoid</span></span></strong></span><span style="font-size:11pt;"> generic naming of namespaces dedicated to extension methods (e.g. “Extensions”) – rather, use a descriptive name – e.g. “</span><span style="font-size:11pt;">Routing</span></p>
<div class="DO" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">”. </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;font-family:wingdings;"><span>þ</span></span></strong></span><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;"> </span></strong></span><span class="DO1"><strong><span style="text-decoration:underline;"><span style="font-size:11pt;">Do</span></span></strong></span><span style="font-size:11pt;"> use the new LINQ types “</span><span style="font-size:11pt;">Func&lt;&gt;</span><span style="font-size:11pt;">” and “</span><span style="font-size:11pt;">Expression&lt;&gt;</span><span style="font-size:11pt;">” instead of custom delegates and predicates, when defining new APIs. The example below illustrates this point</span><span style="font-size:11pt;"><span style="font-family:batang;">:</span></span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;font-family:courier;">//rather than: </span></div>
<p><span style="font-size:8pt;font-family:courier;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;font-family:courier;">delegate bool Tester(int i); </span></div>
<p><span style="font-size:8pt;font-family:courier;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;font-family:courier;">class AClass{ </span></div>
<p><span style="font-size:8pt;font-family:courier;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;font-family:courier;"><span> </span><span> </span>public Tester MyTester{get;set;} </span></div>
<p><span style="font-size:8pt;font-family:courier;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;font-family:courier;">} </span></div>
<p><span style="font-size:8pt;font-family:courier;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;font-family:courier;">//use this: </span></div>
<p><span style="font-size:8pt;font-family:courier;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;font-family:courier;">class AClass{ </span></div>
<p><span style="font-size:8pt;font-family:courier;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;font-family:courier;"><span> </span><span> </span>public Func&lt;int,bool&gt; MyTester{get;set;} </span></div>
<p><span style="font-size:8pt;font-family:courier;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;font-family:courier;">} </span></div>
<p><span style="font-size:8pt;font-family:courier;"> </span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;"><span style="font-family:batang;">Benefits of using </span></span><span style="font-size:11pt;">Func&lt;&gt;</span><span style="font-size:11pt;"><span style="font-family:batang;">, in this case, include minimizing the concept count by employing an existing abstraction, as well as eliminating the dependency on the definition of </span></span><span style="font-size:11pt;">Tester</span><span style="font-size:11pt;"><span style="font-family:batang;">.</span></span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;">
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;"> </span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<h2 style="margin:24pt 0 12pt .25in;"><span style="color:#4f81bd;"><span><span><span style="font-size:medium;font-family:cambria;">3.</span><span> </span></span></span><span style="font-size:medium;font-family:cambria;">Extending on LINQ</span></span></h2>
<p class="BodyFirst" style="margin:10pt 0 0;"><span style="font-size:11pt;"> </span></p>
<p class="BodyFirst" style="margin:10pt 0 0;"><span style="font-size:11pt;"><span style="font-family:batang;">There are three means by which a type can be designed to participate in LINQ queries: implementing </span></span><span style="font-size:11pt;">IEnumerable&lt;&gt;</span><span style="font-size:11pt;"><span style="font-family:batang;"> (or interfaces derived from it), implementing </span></span><span style="font-size:11pt;">IQueryable&lt;&gt;</span></p>
<div class="BodyFirst" style="margin:10pt 0 0;"><span style="font-size:11pt;"><span style="font-family:batang;">, or by defining the Query Pattern on the type, with no relationship to these two interfaces. </span></span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="BodyFirst" style="margin:10pt 0 0;">
<div class="BodyFirst" style="margin:10pt 0 0;"><span style="font-size:11pt;"><span style="font-family:batang;">To preface the guidelines, the choice can be made as follows: </span></span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="BodyCxSpFirst" style="text-indent:-.25in;margin:10pt 0 0 .5in;"><span style="font-size:11pt;"><span><span style="font-family:batang;">-</span><span> </span></span></span><span style="font-size:11pt;"><span style="font-family:batang;">Extend </span></span><span style="font-size:11pt;">IEnumerable&lt;&gt;</span></p>
<div class="BodyCxSpFirst" style="text-indent:-.25in;margin:10pt 0 0 .5in;"><span style="font-size:11pt;"><span style="font-family:batang;">(or interfaced derived from it) if the default, LINQ to Objects support provided in the framework is sufficient </span></span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="BodyCxSpMiddle" style="text-indent:-.25in;margin:0 0 0 1in;"><span style="font-size:11pt;"><span>o<span> </span></span></span></p>
<div class="BodyCxSpMiddle" style="text-indent:-.25in;margin:0 0 0 1in;"><span style="font-size:11pt;"><span style="font-family:batang;">Override some/all LINQ methods if optimizations are required, but access to the query expression is not necessary </span></span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="BodyCxSpMiddle" style="text-indent:-.25in;margin:0 0 0 .5in;"><span style="font-size:11pt;"><span><span style="font-family:batang;">-</span><span> </span></span></span><span style="font-size:11pt;"><span style="font-family:batang;">Extend </span></span><span style="font-size:11pt;">IQueryable&lt;&gt;</span></p>
<div class="BodyCxSpMiddle" style="text-indent:-.25in;margin:0 0 0 .5in;"><span style="font-size:11pt;"><span style="font-family:batang;">if access to the query expression is necessary </span></span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="BodyCxSpLast" style="text-indent:-.25in;margin:0 0 6pt .5in;"><span style="font-size:11pt;"><span><span style="font-family:batang;">-</span><span> </span></span></span><span style="font-size:11pt;"><span style="font-family:batang;">Define the Query Pattern on the new type if the domain makes it impossible or undesirable to implement </span></span><span style="font-size:11pt;">IEnumerable&lt;&gt;</span><span style="font-size:11pt;"><span style="font-family:batang;"> or </span></span><span style="font-size:11pt;">IQueryable&lt;&gt;</span></p>
<div class="BodyCxSpLast" style="text-indent:-.25in;margin:0 0 6pt .5in;"><span style="font-size:11pt;"> </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="BodyFirst" style="margin:10pt 0 0;"><span style="font-size:11pt;"><span style="font-family:batang;">The query methods are those defined by the sponsor class </span></span><span style="font-size:11pt;">System.Linq.Enumerable</span><span style="font-size:11pt;"><span style="font-family:batang;">, as extension methods to </span></span><span style="font-size:11pt;">IEnumerable&lt;&gt;</span></p>
<div class="BodyFirst" style="margin:10pt 0 0;"><span style="font-size:11pt;"><span style="font-family:batang;">. Regardless of the means by which a type participates in LINQ queries, the following guideline applies: </span></span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;font-family:wingdings;"><span>þ</span></span></strong></span><span style="font-family:batang;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;"> </span></strong></span><span class="DO1"><strong><span style="text-decoration:underline;"><span style="font-size:11pt;">Do</span></span></strong></span></span><span style="font-size:11pt;"> respect the signature pattern in </span><span style="font-family:batang;">Figure <span>1</span></span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">when overriding LINQ methods. </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">We use </span><span style="font-size:11pt;">S </span><span style="font-size:11pt;">with or without subscript to indicate a collection type (e.g. </span><span style="font-size:11pt;">IEnumerable&lt;&gt;</span><span style="font-size:11pt;">, </span><span style="font-size:11pt;">ICollection&lt;&gt;</span><span style="font-size:11pt;">) and </span><span style="font-size:11pt;">T</span><span style="font-size:11pt;">, with or without subscript, to indicate the type of elements in that collection. Additionally, we use </span><span>O&lt;T&gt;</span><span><span style="font-family:batang;"> </span></span><span style="font-size:11pt;">to represent subtypes of </span><span style="font-size:11pt;">S&lt;T&gt;</span><span style="font-size:11pt;"> that are ordered. For example, </span><span style="font-size:11pt;">S&lt;T&gt;</span><span style="font-size:11pt;"> is a notation that could be substituted with </span><span style="font-size:11pt;">IEnumerable&lt;int&gt;</span><span style="font-size:11pt;">. The first parameter of all the methods is the type of the object the method is applied on, and it is marked accordingly by prefixing with “</span><span style="font-size:11pt;">this</span><span style="font-size:11pt;">” – whether one chooses to implement these methods as extension methods or as member methods. Also, anywhere </span><span style="font-size:11pt;">Func&lt;&gt;</span><span style="font-size:11pt;"> is being used, one may substitute accordingly with </span><span style="font-size:11pt;">Expression&lt;Func&lt;&gt;&gt;</span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">- the guidelines indicate where that is preferable. </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;">
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">Please note that the notation is not meant to be valid code in any particular language, but simply present the type signature pattern. </span></div>
<p><span style="font-size:11pt;"> </span></p>
<table class="MsoNormalTable" style="border-right:medium none;border-top:medium none;border-left:medium none;border-bottom:medium none;border-collapse:collapse;margin:auto auto auto 24pt;" border="1" cellspacing="5" cellpadding="5" width="499">
<tbody>
<tr>
<td style="border:1pt solid black;width:361.8pt;background-color:transparent;padding:0 5.4pt;" width="487" valign="top">
<p class="DO-codelastCxSpFirst" style="margin:0 0 0 30.25pt;">
<div class="DO-codelastCxSpFirst" style="margin:0 0 0 30.25pt;"><span><span style="font-family:courier;">S&lt;T&gt; Where(this S&lt;T&gt;, Func&lt;T,bool&gt;) </span></span></div>
<p><span><span style="font-family:courier;"> </span></span></p>
<p class="DO-codelastCxSpMiddle" style="margin:0 0 0 30.25pt;">
<div class="DO-codelastCxSpMiddle" style="margin:0 0 0 30.25pt;"><span><span style="font-family:courier;">S&lt;T2&gt; Select(this S&lt;T1&gt;,Func&lt;T1,T2&gt;) </span></span></div>
<p><span><span style="font-family:courier;"> </span></span></p>
<p class="DO-codelastCxSpMiddle" style="margin:0 0 0 30.25pt;">
<p class="DO-codelastCxSpMiddle" style="margin:0 0 0 30.25pt;">
<div class="DO-codelastCxSpMiddle" style="margin:0 0 0 30.25pt;"><span><span style="font-family:courier;">O&lt;T&gt; OrderBy(this S&lt;T&gt;, Func&lt;T,K&gt;), where K is  IComparable </span></span></div>
<p><span><span style="font-family:courier;"> </span></span></p>
<p class="DO-codelastCxSpMiddle" style="margin:0 0 0 30.25pt;">
<p class="DO-codelastCxSpMiddle" style="margin:0 0 0 30.25pt;">
<div class="DO-codelastCxSpMiddle" style="margin:0 0 0 30.25pt;"><span><span style="font-family:courier;">O&lt;T&gt; ThenBy(this O&lt;T&gt;,Func&lt;T,K&gt;), where K is  IComparable </span></span></div>
<p><span><span style="font-family:courier;"> </span></span></p>
<p class="DO-codelastCxSpMiddle" style="margin:0 0 0 30.25pt;"><span><span style="font-family:courier;"> </span></span></p>
<p class="DO-codelastCxSpMiddle" style="margin:0 0 0 30.25pt;">
<div class="DO-codelastCxSpMiddle" style="margin:0 0 0 30.25pt;"><span><span style="font-family:courier;">S&lt;T&gt; Union(this S&lt;T&gt;, S&lt;T&gt;) </span></span></div>
<p><span><span style="font-family:courier;"> </span></span></p>
<p class="DO-codelastCxSpMiddle" style="margin:0 0 0 30.25pt;"><span><span style="font-family:courier;"> </span></span></p>
<p class="DO-codelastCxSpMiddle" style="margin:0 0 0 30.25pt;">
<div class="DO-codelastCxSpMiddle" style="margin:0 0 0 30.25pt;"><span><span style="font-family:courier;">S&lt;T&gt; Skip(this S&lt;T&gt;,int) </span></span></div>
<p><span><span style="font-family:courier;"> </span></span></p>
<p class="DO-codelastCxSpMiddle" style="margin:0 0 0 30.25pt;">
<div class="DO-codelastCxSpMiddle" style="margin:0 0 0 30.25pt;"><span><span style="font-family:courier;">S&lt;T&gt; Take(this S&lt;T&gt;,int) </span></span></div>
<p><span><span style="font-family:courier;"> </span></span></p>
<p class="DO-codelastCxSpMiddle" style="margin:0 0 0 30.25pt;">
<div class="DO-codelastCxSpMiddle" style="margin:0 0 0 30.25pt;"><span><span style="font-family:courier;">S&lt;T&gt; SkipWhile(this S&lt;T&gt;, Func&lt;T,bool&gt;) </span></span></div>
<p><span><span style="font-family:courier;"> </span></span></p>
<p class="DO-codelastCxSpMiddle" style="margin:0 0 0 30.25pt;">
<p class="DO-codelastCxSpMiddle" style="margin:0 0 0 30.25pt;">
<div class="DO-codelastCxSpMiddle" style="margin:0 0 0 30.25pt;"><span><span style="font-family:courier;">T ElementAt(this S&lt;T&gt;,int) </span></span></div>
<p><span><span style="font-family:courier;"> </span></span></p>
<p class="DO-codelastCxSpMiddle" style="margin:0 0 0 30.25pt;">
<p class="DO-codelastCxSpMiddle" style="margin:0 0 0 30.25pt;"><span><span style="font-family:courier;">S&lt;T3&gt; Join(this S&lt;T1&gt;, S&lt;T2&gt;,</span></span></p>
<p class="DO-codelastCxSpMiddle" style="margin:0 0 0 30.25pt;"><span><span style="font-family:courier;">Func&lt;T1,K1&gt;,Func&lt;T2,K2&gt;,</span></span></p>
<p class="DO-codelastCxSpMiddle" style="margin:0 0 0 30.25pt;">
<div class="DO-codelastCxSpMiddle" style="margin:0 0 0 30.25pt;"><span><span style="font-family:courier;">Func&lt;T1,T2,T3&gt;) </span></span></div>
<p><span><span style="font-family:courier;"> </span></span></p>
<p class="DO-codelastCxSpMiddle" style="margin:0 0 0 30.25pt;">
<p class="DO-codelastCxSpMiddle" style="margin:0 0 0 30.25pt;">
<div class="DO-codelastCxSpMiddle" style="margin:0 0 0 30.25pt;"><span><span style="font-family:courier;">S&lt;T3&gt; SelectMany(this   S&lt;T1&gt;,Func&lt;T1,S&lt;T2&gt;&gt;,Func&lt;T1,T2,T3&gt;) </span></span></div>
<p><span><span style="font-family:courier;"> </span></span></p>
<p class="DO-codelastCxSpLast" style="margin:0 0 6pt 30.25pt;">
<p class="DO-codelastCxSpLast" style="margin:0 0 6pt 30.25pt;">
<div class="DO-codelastCxSpLast" style="margin:0 0 6pt 30.25pt;"><span><span style="font-family:courier;">S&lt;T2&gt; SelectMany(this S&lt;T1&gt;,Func&lt;T1,S&lt;T2&gt;&gt;) </span></span></div>
<p><span><span style="font-family:courier;"> </span></span></td>
</tr>
</tbody>
</table>
<p class="MsoCaption" style="margin:0 0 10pt;" align="center"><a title="_Ref185215760" name="_Ref185215760"></a><strong><span style="color:#4f81bd;font-family:times new roman;">Figure </span></strong><strong><span style="color:#4f81bd;"><span style="font-family:times new roman;"><span><span>1</span></span> Query Pattern Method Signatures</span></span></strong></p>
<p class="MsoCaption" style="margin:0 0 10pt;" align="center"><strong> </strong></p>
<h3 style="margin:10pt 0 0;"><span style="font-size:small;color:#4f81bd;font-family:cambria;">Extending IEnumerable&lt;&gt;</span></h3>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;font-family:wingdings;"><span>þ</span></span></strong></span><span style="font-family:batang;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;"> </span></strong></span><span class="DO1"><strong><span style="text-decoration:underline;"><span style="font-size:11pt;">Do</span></span></strong></span></span><span style="font-size:11pt;"> implement </span><span style="font-size:11pt;">IEnumerable&lt;T&gt; </span><span style="font-size:11pt;">to enable basic LINQ support. Such basic support should be sufficient for most in-memory data sets. The basic LINQ support will use the default -provided extension methods on </span><span style="font-size:11pt;">IEnumerable&lt;T&gt;</span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">. </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;">
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">For example, simply defining: </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;">public class RangeOfInts:IEnumerable&lt;int&gt;{ </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;"><span> </span>public IEnumerator&lt;int&gt; GetEnumerator() {…} </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;"><span> </span>public IEnumerator GetEnumerator() {…} </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;">} </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;">
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">Allows for the following code: </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;">p</span><span> </span></p>
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;">var a=new RangeOfInts(); </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;">var b=a.Where(x=&gt;x&gt;10); </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;font-family:courier;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:11pt;">Although </span><span style="font-size:11pt;">RangeOfInts</span><span style="font-size:11pt;"> did not implement a “</span><span style="font-size:11pt;">Where</span></p>
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:11pt;">” method. </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;font-family:wingdings;"><span>þ</span></span></strong></span><span style="font-family:batang;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;"> </span></strong></span><span class="DO1"><strong><span style="text-decoration:underline;"><span style="font-size:11pt;">Consider</span></span></strong></span></span><span style="font-size:11pt;"> redefining the methods in the LINQ pattern on new types implementing </span><span style="font-size:11pt;">IEnumerable&lt;T&gt;</span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">, if it is desirable to override the default implementation – e.g. for optimization. It is preferred that one redefines them as type members, rather than extension methods. </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;">
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">For example, rather than: </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;">public class MyDataSet&lt;T&gt;:IEnumerable&lt;T&gt;{…} </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;">… </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;">public static class MyDataSetExtensions{ </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;"><span> </span>public static MyDataSet&lt;T&gt; Where(this MyDataSet&lt;T&gt; o,Func&lt;T,bool&gt; f){…} </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;">}; </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;">
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">Opt for this: </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;">public class MyDataSet&lt;T&gt;:IEnumerable&lt;T&gt;{ </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;"><span> </span>public MyDataSet&lt;T&gt; Where(Func&lt;T,bool&gt; f){…} </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;">… </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;">} </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;font-family:wingdings;"><span>þ</span></span></strong></span><span style="font-family:batang;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;"> </span></strong></span><span class="DO1"><strong><span style="text-decoration:underline;"><span style="font-size:11pt;">Consider</span></span></strong></span></span><span style="font-size:11pt;"> implementing </span><span style="font-size:11pt;">ICollection&lt;T&gt;</span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">to improve performance of query operators. </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">For example, the </span><span style="font-size:11pt;">Count&lt;&gt;</span><span style="font-size:11pt;"> method default behavior (as defined in </span><span style="font-size:11pt;">System.Linq</span><span style="font-size:11pt;">) is to simply walk the </span><span style="font-size:11pt;">IEnumerable</span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">. Collection types can optimize their implementation of this method, since they typically offer an <em>O(1)</em> &#8211; complexity mechanism for finding the size of the collection. </span></div>
<p><span style="font-size:11pt;"> </span></p>
<h3 style="margin:10pt 0 0;"><span style="font-size:small;color:#4f81bd;font-family:cambria;">Extending IQueryable&lt;&gt;</span></h3>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;font-family:wingdings;"><span>þ</span></span></strong></span><span style="font-family:batang;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;"> </span></strong></span><span class="DO1"><strong><span style="text-decoration:underline;"><span style="font-size:11pt;">Consider</span></span></strong></span></span><span style="font-size:11pt;"> implementing </span><span style="font-size:11pt;">IQueryable&lt;T&gt;</span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">when access to the query expression is necessary. For example, this applies for types representing potentially large data sets generated by remote processes, or for certain optimizations. An example of such a dataset is a database, the filesystem, or an in-memory dictionary that needs to be optimized for searching<span> </span>for values (rather than keys). </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;">
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">The following guidelines detail this further: </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="DO" style="margin:12pt 0 6pt 12.25pt;"><span class="DO1"><span style="font-size:11pt;color:#ff0000;font-family:wingdings;"><span>ý</span></span></span><span style="font-family:batang;"><span class="DO1"><span style="font-size:11pt;color:#ff0000;"> </span></span><span class="DO1"><strong><span style="text-decoration:underline;"><span style="font-size:11pt;">Do not</span></span></strong></span><span style="font-size:11pt;"> implement </span></span><span style="font-size:11pt;">IQueryable&lt;T&gt;</span></p>
<div class="DO" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;"><span style="font-family:batang;">without understanding all the performance tradeoffs. </span></span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="DO" style="text-indent:-.25in;margin:12pt 0 6pt .5in;"><span style="font-size:11pt;font-family:symbol;"><span>·<span> </span></span></span><span style="font-size:11pt;"><span style="font-family:batang;">Building and parsing expression trees is expensive and many queries can actually get slower when </span></span><span style="font-size:11pt;">IQueryable&lt;T&gt;</span></p>
<div class="DO" style="text-indent:-.25in;margin:12pt 0 6pt .5in;"><span style="font-size:11pt;"><span style="font-family:batang;">is implemented. </span></span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="DO" style="text-indent:-.25in;margin:12pt 0 6pt .5in;"><span style="font-size:11pt;font-family:symbol;"><span>·<span> </span></span></span></p>
<div class="DO" style="text-indent:-.25in;margin:12pt 0 6pt .5in;"><span style="font-family:batang;"><span style="font-size:11pt;">The trade-off is acceptable in the LINQ to SQL case, since the alternative overhead of performing queries in memory would have been far greater than the transformation of the expression to an SQL statement and the delegation of the query processing to the database server</span>.</p>
<p></span></div>
<p><span style="font-family:batang;"><span style="font-size:11pt;"> </span></span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;font-family:wingdings;"><span>þ</span></span></strong></span><span style="font-family:batang;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;"> </span></strong></span><span class="DO1"><strong><span style="text-decoration:underline;"><span style="font-size:11pt;">Do</span></span></strong></span></span><span style="font-size:11pt;"> throw </span><span style="font-size:11pt;">NotSupportedException</span><span style="font-size:11pt;"> from </span><span style="font-size:11pt;">IQueryable&lt;T&gt;</span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">methods that cannot be logically supported by your data source. </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">For example, imagine representing a media stream (like internet radio) as an </span><span style="font-size:11pt;">IQueryable&lt;&gt;</span><span style="font-size:11pt;">. The </span><span style="font-size:11pt;">Count</span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">method is not logically supported – the stream can be considered as infinite. </span></div>
<p><span style="font-size:11pt;"> </span></p>
<h3 style="margin:10pt 0 0;"><span style="font-size:small;color:#4f81bd;font-family:cambria;">Implementing the Query Pattern</span></h3>
<p class="BodyFirst" style="margin:10pt 0 0;"><span style="font-family:batang;"><span style="font-size:11pt;">The Query Pattern refers to defining the methods in </span>Figure <span>1</span><span style="font-size:11pt;"> without implemeting the </span></span><span style="font-size:11pt;">IEnumerable&lt;&gt;</span><span style="font-size:11pt;"><span style="font-family:batang;"> or </span></span><span style="font-size:11pt;">IQueryable&lt;&gt;</span></p>
<div class="BodyFirst" style="margin:10pt 0 0;"><span style="font-size:11pt;"><span style="font-family:batang;">interfaces. </span></span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;font-family:wingdings;"><span>þ</span></span></strong></span><span style="font-family:batang;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;"> </span></strong></span><span class="DO1"><strong><span style="text-decoration:underline;"><span style="font-size:11pt;">Do</span></span></strong></span></span><span style="font-size:11pt;"> implement at least the enumerable pattern (i.e. provide a </span><span style="font-size:11pt;">GetEnumerator</span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">method) for types representing collections of data. This is because the expectation is that the result of the query methods be foreach-able. </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;font-family:wingdings;"><span>þ</span></span></strong></span><span style="font-family:batang;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;"> </span></strong></span><span class="DO1"><strong><span style="text-decoration:underline;"><span style="font-size:11pt;">Do</span></span></strong></span></span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">implement the Query Pattern as instance members on the new type, if the members make sense on the type even outside of the context of LINQ. Otherwise, use extension methods. </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;font-family:wingdings;"><span>þ</span></span></strong></span><span style="font-family:batang;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;"> </span></strong></span><span class="DO1"><strong><span style="text-decoration:underline;"><span style="font-size:11pt;">Do</span></span></strong></span></span><span style="font-size:11pt;"> represent ordered sequences as a separate type. Define on this type the “</span><span style="font-size:11pt;">ThenBy</span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">” method. </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">This follows the current pattern in the LINQ-to objects implementation, as well as allows for early (compile-time) detection of errors such as applying “</span><span style="font-size:11pt;">ThenBy</span><span style="font-size:11pt;">” to a not “</span><span style="font-size:11pt;">OrderBy</span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">”-ed sequence. </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">For <span> </span>example, the framework provides the </span><span style="font-size:11pt;">IOrderedEnumerable&lt;&gt; </span><span style="font-size:11pt;">type, which is returned by “</span><span style="font-size:11pt;">OrderBy</span><span style="font-size:11pt;">”. The “</span><span style="font-size:11pt;">ThenBy</span><span style="font-size:11pt;">” extension method is defined for this type, and not for </span><span style="font-size:11pt;">IEnumerable&lt;&gt;</span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">. </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;font-family:wingdings;"><span>þ</span></span></strong></span><span style="font-family:batang;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;"> </span></strong></span><span class="DO1"><strong><span style="text-decoration:underline;"><span style="font-size:11pt;">Consider</span></span></strong></span></span><span style="font-size:11pt;"> designing the LINQ operators to return specific enumerable types for domains that should be restricted. Essentially, one is free to return anything from a </span><span style="font-size:11pt;">Select</span><span style="font-size:11pt;"> query method, however, the expectation is that the query result type should be at least enumerable in a </span><span style="font-size:11pt;">foreach</span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">loop &#8211; see the example below, as well as the next guideline: </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;">var set1=… </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;">var set2=set1.Select(x=&gt;x.SomeIntProperty); </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;">foreach(int i in set2){…} </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;font-family:wingdings;"><span>þ</span></span></strong></span><span style="font-family:batang;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;"> </span></strong></span><span class="DO1"><strong><span style="text-decoration:underline;"><span style="font-size:11pt;">Do</span></span></strong></span></span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">defer execution of query operator implementations. The expected behavior of most of the Query Pattern members is that they simply construct a new object which, upon enumeration, produces the elements of the set which match the query. The evaluation time is, then, at enumeration. </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">The following methods are exception from this rule: </span><span style="font-size:11pt;">All, Any, Average, Contains, Count, ElementAt, Empty, First, FirstOrDefault, Last, LastOrDefault, Max, Min, Single, Sum.</span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;"> </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">In the example above, the expectation is that the time necessary for evaluating the second line be be independent from the size or nature (e.g. in-memory or remote server) of </span><span style="font-size:11pt;">set1</span><span style="font-size:11pt;">. The general expectation is that this line simply prepares </span><span style="font-size:11pt;">set2</span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">, delaying the determination of its composition to the time of its enumeration. </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="Body" style="margin:10pt 0 6pt;"><span style="font-family:batang;"> </span></p>
<p class="DO" style="margin:12pt 0 6pt 12.25pt;"><span><span><span style="font-family:batang;"> </span></span></span><span class="DO1"><span style="font-size:11pt;color:#ff0000;font-family:wingdings;"><span>ý</span></span></span><span style="font-family:batang;"><span class="DO1"><span style="font-size:11pt;color:#ff0000;"> </span></span><span class="DO1"><strong><span style="text-decoration:underline;"><span style="font-size:11pt;">Avoid</span></span></strong></span><span style="font-size:11pt;"> implementing just a part of the Query Pattern, if fallback to the basic </span></span><span style="font-size:11pt;">IEnumerable&lt;T&gt;</span></p>
<div class="DO" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;"><span style="font-family:batang;">implementations is undesirable. </span></span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="DO" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;"><span style="font-family:batang;">For example, consider a user-defined type T, which implements </span></span><span style="font-size:11pt;">IEnumerable&lt;&gt;</span><span style="font-size:11pt;"><span style="font-family:batang;">. T has an override for </span></span><span style="font-size:11pt;">Count</span><span style="font-size:11pt;"><span style="font-family:batang;">, but not for </span></span><span style="font-size:11pt;">Where</span></p>
<div class="DO" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;"><span style="font-family:batang;">. Consider then the following example: </span></span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;font-family:courier;">var query=someT.Where(f2).Count(); </span></div>
<p><span style="font-size:8pt;font-family:courier;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;"><span style="font-family:batang;"> </span></p>
<p class="NL" style="text-indent:0;margin:2pt 0 0;"><span style="font-size:11pt;"><span style="font-family:batang;">In this example, any opportunities for optimization are lost after the </span></span><span style="font-size:11pt;">Where </span><span style="font-size:11pt;"><span style="font-family:batang;">call. The </span></span><span style="font-size:11pt;">Count </span><span style="font-size:11pt;"><span style="font-family:batang;">version used is the one defined for </span></span><span style="font-size:11pt;">IEnumerable&lt;&gt;</span><span style="font-size:11pt;"><span style="font-family:batang;">.</span></span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;font-family:wingdings;"><span>þ</span></span></strong></span><span style="font-family:batang;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;"> </span></strong></span><span class="DO1"><strong><span style="text-decoration:underline;"><span style="font-size:11pt;">Do</span></span></strong></span></span><span style="font-size:11pt;"> place query extensions methods in a “</span><span style="font-size:11pt;">Linq</span><span style="font-size:11pt;">” sub-namespace of the main namespace. For example, extension methods for </span><span style="font-size:11pt;">System.Data</span><span style="font-size:11pt;"> features reside in </span><span style="font-size:11pt;">System.Data.Linq</span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">namespace. </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;font-family:wingdings;"><span>þ</span></span></strong></span><span style="font-family:batang;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;"> </span></strong></span><span class="DO1"><strong><span style="text-decoration:underline;"><span style="font-size:11pt;">Do</span></span></strong></span></span><span style="font-size:11pt;"> use </span><span style="font-size:11pt;">Expression&lt;Func&lt;&gt;&gt;</span><span style="font-size:11pt;"> as a parameter instead of </span><span style="font-size:11pt;">Func&lt;&gt;</span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">when it is necessary to inspect the query. </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">As it was discussed, interacting with an SQL database is already done through </span><span style="font-size:11pt;">IQueryable&lt;T&gt;</span><span style="font-size:11pt;"> rather than </span><span style="font-size:11pt;">IEnumerable&lt;T&gt;</span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">, since this gives an opportunity to translate lambda expressions to SQL expressions. </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="MsoNormal" style="margin:0 0 10pt;"><span style="font-size:11pt;line-height:115%;">An alternative reason for implementing </span><span style="font-size:11pt;line-height:115%;">IQueryable&lt;T&gt;</span><span style="font-size:11pt;line-height:115%;"> is performing optimizations. For example, a sorted list can implement lookup (“</span><span style="font-size:11pt;line-height:115%;">Where</span><span style="font-size:11pt;line-height:115%;">” clauses) with binary search, which can be much more efficient than the standard </span><span style="font-size:11pt;line-height:115%;">IEnumerable&lt;T&gt;</span><span style="font-size:11pt;line-height:115%;"> or </span><span style="font-size:11pt;line-height:115%;">IQueryable&lt;T&gt;</span><span style="font-size:11pt;line-height:115%;"> implementations.</span></p>
<p class="MsoNormal" style="margin:0 0 10pt;">
<div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:dbb41ede-8f5a-4b8f-8c8e-3de592784595" class="wlWriterSmartContent" style="display:inline;float:none;margin:0;padding:0;">Technorati Tags: <a rel="tag" href="http://technorati.com/tags/Linq">Linq</a>,<a rel="tag" href="http://technorati.com/tags/Fluent+API">Fluent API</a>,<a rel="tag" href="http://technorati.com/tags/Frawork+Design">Frawork Design</a>,<a rel="tag" href="http://technorati.com/tags/Adaptable+Software">Adaptable Software</a>,<a rel="tag" href="http://technorati.com/tags/DSLs">DSLs</a>,<a rel="tag" href="http://technorati.com/tags/C%23+3.0">C# 3.0</a></div>
<div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:a166856f-521d-414d-9627-046f41895c0d" class="wlWriterSmartContent" style="display:inline;float:none;margin:0;padding:0;">del.icio.us Tags: <a rel="tag" href="http://del.icio.us/popular/Linq">Linq</a>,<a rel="tag" href="http://del.icio.us/popular/Fluent+API">Fluent API</a>,<a rel="tag" href="http://del.icio.us/popular/Frawork+Design">Frawork Design</a>,<a rel="tag" href="http://del.icio.us/popular/Adaptable+Software">Adaptable Software</a>,<a rel="tag" href="http://del.icio.us/popular/DSLs">DSLs</a>,<a rel="tag" href="http://del.icio.us/popular/C%23+3.0">C# 3.0</a></div>
<div class="wlWriterHeaderFooter" style="text-align:right;margin:0;padding:4px 0;"><a href="http://digg.com/submit?url=http%3a%2f%2fdcarr.wordpress.com%2f2008%2f07%2f27%2flinq-framework-design-guidelines-great-content-from-the-upcoming-book%2f&amp;title=Linq+Framework+Design+Guidelines+%3a+don%e2%80%99t+wait+for+the+book+update"><img style="border:0;" src="http://digg.com/img/badges/100x20-digg-button.png" border="0" alt="Digg This" width="100" height="20" /></a></div>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/dcarr.wordpress.com/557/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/dcarr.wordpress.com/557/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dcarr.wordpress.com/557/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dcarr.wordpress.com/557/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dcarr.wordpress.com/557/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dcarr.wordpress.com/557/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dcarr.wordpress.com/557/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dcarr.wordpress.com/557/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dcarr.wordpress.com/557/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dcarr.wordpress.com/557/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dcarr.wordpress.com/557/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dcarr.wordpress.com/557/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=557&subd=dcarr&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://team.pushbomb.com/2008/07/27/linq-framework-design-guidelines-great-content-from-the-upcoming-book/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7b572cbcda5a17fe984e7dd1ddc9c3d6?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">pushbomb</media:title>
		</media:content>

		<media:content url="http://digg.com/img/badges/100x20-digg-button.png" medium="image">
			<media:title type="html">Digg This</media:title>
		</media:content>
	</item>
		<item>
		<title>Update! CruiseControl.net Advanced Metrics &#8211; RC1 1.4 Build</title>
		<link>http://team.pushbomb.com/2008/06/19/open-source-project-updated-cruise-controlnet-advanced-metrics/</link>
		<comments>http://team.pushbomb.com/2008/06/19/open-source-project-updated-cruise-controlnet-advanced-metrics/#comments</comments>
		<pubDate>Thu, 19 Jun 2008 16:25:11 +0000</pubDate>
		<dc:creator>Damon Wilder Carr</dc:creator>
				<category><![CDATA[C# 3.0 Enhancements]]></category>
		<category><![CDATA[C# 3.0 for Internal DSL]]></category>
		<category><![CDATA[Framework Design]]></category>
		<category><![CDATA[Proof Driven Development]]></category>
		<category><![CDATA[Software Futures]]></category>
		<category><![CDATA[agile practices]]></category>
		<category><![CDATA[CC.NET]]></category>
		<category><![CDATA[CCStatistics]]></category>
		<category><![CDATA[Continuous Integration]]></category>

		<guid isPermaLink="false">http://dcarr.wordpress.com/?p=267</guid>
		<description><![CDATA[I finally had time to perform some much needed upgrades to the code base for the qualitative and quantitative metrics for Cruise Control.net continuous integration (a must have in my opinion).

I'll be speaking more about it but here is the 'smoke mock/regression test' I just got running, and which all further regression-driven/verification-driven development will occur (not sure which I like better as a phrase but test-driven has got to go... It is so universally misunderstood, misapplied, and misconstrued. Can I get a witness?)...

Anyway here's the framework API for now. This will evolve into a full Linq provider (I hope)...<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=267&subd=dcarr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>We finally had time to perform some much needed upgrades to the code base for the qualitative and quantitative metrics produced by our addin to CruiseControl.net continuous integration system</p>
<p>Anyway here&#8217;s an idea of how the framework API is shaping up. Expect this to move dramatically toward&#8217;s Fowler&#8217;s fantastic coverage of <a href="http://www.martinfowler.com/dslwip/ExpressionBuilder.html">&#8216;Expression Builder&#8217;</a>.</p>
<p><a href="http://www.ayende.com/projects/rhino-mocks/downloads.aspx"><img class="size-full wp-image-274 alignleft" style="margin:0 20px 0 0;" src="http://dcarr.files.wordpress.com/2008/06/rhinomocks-120x90.png?w=104&#038;h=78" alt="dont mock around" width="104" height="78" /></a></p>
<p>We hope that this will evolve into a full Linq provider, and due to the XML foundation this is not all that unrealistic a goal.<br />
 </p>
<p> </p>
<p> </p>
<pre><span style="background:black;color:#bbfdcc;">namespace </span><span style="background:black;color:#ffffff;">CCStatisticsTDD
{
    </span><span style="background:black;color:#bbfdcc;">using </span><span style="background:black;color:#ffffff;">System;
    </span><span style="background:black;color:#bbfdcc;">using </span><span style="background:black;color:#ffffff;">System.Collections.Generic;
    </span><span style="background:black;color:#bbfdcc;">using </span><span style="background:black;color:#ffffff;">System.Linq;
    </span><span style="background:black;color:#bbfdcc;">using </span><span style="background:black;color:#ffffff;">CCStatistics.Domain.Api;
    </span><span style="background:black;color:#bbfdcc;">using </span><span style="background:black;color:#ffffff;">CCStatistics.Domain.Api.Interfaces;
    </span><span style="background:black;color:#bbfdcc;">using </span><span style="background:black;color:#ffffff;">NUnit.Framework;
    </span><span style="background:black;color:#bbfdcc;">using </span><span style="background:black;color:#ffffff;">Rhino.Mocks;
    </span><span style="background:black;color:#bbfdcc;">using </span><span style="background:black;color:#ffffff;">TDDViewOutputStatus;
    </span><span style="background:black;color:#bbfdcc;">using </span><span style="background:black;color:#ffffff;">ThoughtWorks.CruiseControl.Core;

    </span><span style="background:black;color:#808080;">/// &lt;summary&gt;
    /// </span><span style="background:black;color:#008000;">This is a monolitic 'Smoke Test'. There are many fine grained tests to be writtem!
    </span><span style="background:black;color:#808080;">/// &lt;/summary&gt;
    </span><span style="background:black;color:#ffffff;">[</span><span style="background:black;color:#2b91af;">TestFixture</span><span style="background:black;color:#ffffff;">]
    </span><span style="background:black;color:#bbfdcc;">public class </span><span style="background:black;color:#2b91af;">MainTestFixtureBaselineSmokes </span><span style="background:black;color:#ffffff;">: </span><span style="background:black;color:#2b91af;">TestBase
    </span><span style="background:black;color:#ffffff;">{
        </span><span style="background:black;color:#808080;">/// &lt;summary&gt;
        /// </span><span style="background:black;color:#008000;">Gets the mock list.
        </span><span style="background:black;color:#808080;">/// &lt;/summary&gt;
        /// &lt;param name="mockBuildName"&gt;</span><span style="background:black;color:#008000;">Name of the mock build.</span><span style="background:black;color:#808080;">&lt;/param&gt;
        /// &lt;param name="repositoryBuildCount"&gt;</span><span style="background:black;color:#008000;">The repository build count.</span><span style="background:black;color:#808080;">&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        /// </span><span style="background:black;color:#008000;">Documentation Created 6/23/2008
        </span><span style="background:black;color:#bbfdcc;">private static </span><span style="background:black;color:#2b91af;">List</span><span style="background:black;color:#ffffff;">&lt;</span><span style="background:black;color:#bbfdcc;">string</span><span style="background:black;color:#ffffff;">&gt; GetMockList(</span><span style="background:black;color:#bbfdcc;">string </span><span style="background:black;color:#ffffff;">mockBuildName, </span><span style="background:black;color:#bbfdcc;">int </span><span style="background:black;color:#ffffff;">repositoryBuildCount)
        {
            </span><span style="background:black;color:#008000;">// Add the build name to the array tht is expected to be available for ALL builds
            // from the repositoy. Here we use 10

            </span><span style="background:black;color:#bbfdcc;">return
                </span><span style="background:black;color:#2b91af;">Enumerable</span><span style="background:black;color:#ffffff;">.Repeat(mockBuildName + </span><span style="background:black;color:#a31515;">" {0}"</span><span style="background:black;color:#ffffff;">, repositoryBuildCount).Select(
                    s =&gt; </span><span style="background:black;color:#2b91af;">String</span><span style="background:black;color:#ffffff;">.Format(s, </span><span style="background:black;color:#2b91af;">DateTime</span><span style="background:black;color:#ffffff;">.Now.TimeOfDay.TotalMilliseconds/1000)).ToList();
        }

        </span><span style="background:black;color:#bbfdcc;">protected override </span><span style="background:black;color:#2b91af;">ICCStatsProject </span><span style="background:black;color:#ffffff;">Prepare()
        {
            </span><span style="background:black;color:#008000;">// We need a name for this project
            </span><span style="background:black;color:#bbfdcc;">const </span><span style="background:black;color:#2b91af;">String </span><span style="background:black;color:#ffffff;">mockBuildName = </span><span style="background:black;color:#a31515;">"CCStatisticsBuildMock"</span><span style="background:black;color:#ffffff;">;

            </span><span style="background:black;color:#008000;">// Simulate 100 legacy build results
            </span><span style="background:black;color:#bbfdcc;">const int </span><span style="background:black;color:#ffffff;">repositoryBuildCount = 100;

            </span><span style="background:black;color:#bbfdcc;">var </span><span style="background:black;color:#ffffff;">repository = mocks.Stub&lt;</span><span style="background:black;color:#2b91af;">IIntegrationRepository</span><span style="background:black;color:#ffffff;">&gt;();
            </span><span style="background:black;color:#bbfdcc;">var </span><span style="background:black;color:#ffffff;">buildNames = GetMockList(mockBuildName, repositoryBuildCount);

            </span><span style="background:black;color:#008000;">// OK set this up to return our builds
            </span><span style="background:black;color:#ffffff;">repository.Stub(x =&gt; x.GetBuildNames()).Return(buildNames.ToArray());

            </span><span style="background:black;color:#bbfdcc;">var </span><span style="background:black;color:#ffffff;">currentProject = mocks.Stub&lt;</span><span style="background:black;color:#2b91af;">ICCStatsProject</span><span style="background:black;color:#ffffff;">&gt;();

            currentProject.Stub(x =&gt; x.IntegrationRepository).Return(repository);
            currentProject.Stub(x =&gt; x.StatisticsForPublisher).Return(MockStats);

            currentProject.StubEx(x =&gt; x.Name, mockBuildName).
                StubEx(x =&gt; x.BuildLogDirectory, DefaultDirectory).
                StubEx(x =&gt; x.ArtifactDirectory, DefaultDirectory).
                StubEx(x =&gt; x.WorkingDirectory, DefaultDirectory).
                Stub(x =&gt; x.StatsPostPublisher).Return(InitializePublisher(currentProject));

            </span><span style="background:black;color:#bbfdcc;">return </span><span style="background:black;color:#ffffff;">currentProject;
        }

        </span><span style="background:black;color:#bbfdcc;">private </span><span style="background:black;color:#2b91af;">IMetricPublisher </span><span style="background:black;color:#ffffff;">InitializePublisher(</span><span style="background:black;color:#2b91af;">ICCStatsProject </span><span style="background:black;color:#ffffff;">project)
        {
            </span><span style="background:black;color:#008000;">// OK now it's interesting.. We have our own IMetricPublisher which is a stand-in for the
            // StattisticsPublisher concrete class in CruiseControl. We need to add a new overload
            // and obviously make this behave in ways it was not intended to (as we are doing all the legacy builds)
            </span><span style="background:black;color:#bbfdcc;">var </span><span style="background:black;color:#ffffff;">_statisticsPublisher = mocks.Stub&lt;</span><span style="background:black;color:#2b91af;">IMetricPublisher</span><span style="background:black;color:#ffffff;">&gt;();

            </span><span style="background:black;color:#008000;">// Here we use the mock array of stats created above. This is a duplicate of StatisticsForPublisher
            // Need to look into consolodating that.
            </span><span style="background:black;color:#ffffff;">_statisticsPublisher.Stub(x =&gt; x.ConfiguredStatistics).Return(MockStats);

            </span><span style="background:black;color:#008000;">// Core Validation is Below
            </span><span style="background:black;color:#ffffff;">_statisticsPublisher.Expect(x =&gt; x.ProcesLogFile(project.Name)).
                IgnoreArguments().Repeat.Times(project.BuildCount);

            </span><span style="background:black;color:#bbfdcc;">return </span><span style="background:black;color:#ffffff;">_statisticsPublisher;
        }

        </span><span style="background:black;color:#808080;">/// &lt;summary&gt;
        /// </span><span style="background:black;color:#008000;">NOTE: This is a FULL CYCLE Mock Smoke test. We need many more finely grained
        </span><span style="background:black;color:#808080;">/// </span><span style="background:black;color:#008000;">tests. This is just to ensure all is well in the application. Each subcomponent
        </span><span style="background:black;color:#808080;">/// </span><span style="background:black;color:#008000;">will need to have tests added as this evolves. In the mean time this works
        </span><span style="background:black;color:#808080;">/// </span><span style="background:black;color:#008000;">well to ensure we fundamentally work and this is called from OUR BuildServer
        </span><span style="background:black;color:#808080;">/// </span><span style="background:black;color:#008000;">(how META is that?) to ensure this is working.
        </span><span style="background:black;color:#808080;">/// </span><span style="background:black;color:#008000;">This should be your first stop to undersand this code
        </span><span style="background:black;color:#808080;">/// &lt;/summary&gt;
        </span><span style="background:black;color:#ffffff;">[</span><span style="background:black;color:#2b91af;">Test</span><span style="background:black;color:#ffffff;">]
        </span><span style="background:black;color:#bbfdcc;">public void </span><span style="background:black;color:#ffffff;">ShouldSmokeTestProjectAPI()
        {
            </span><span style="background:black;color:#bbfdcc;">using </span><span style="background:black;color:#ffffff;">(mocks.Record())
                </span><span style="background:black;color:#2b91af;">Assert</span><span style="background:black;color:#ffffff;">.IsTrue(</span><span style="background:black;color:#2b91af;">ForStatistics</span><span style="background:black;color:#ffffff;">.RefreshValues(</span><span style="background:black;color:#2b91af;">MockTDDView</span><span style="background:black;color:#ffffff;">.New, Prepare()));
        }
    }

    </span><span style="background:black;color:#bbfdcc;">public static class </span><span style="background:black;color:#2b91af;">MockExtensions
    </span><span style="background:black;color:#ffffff;">{
        </span><span style="background:black;color:#808080;">/// &lt;summary&gt;
        /// </span><span style="background:black;color:#008000;">Stubs the type defined
        </span><span style="background:black;color:#808080;">/// &lt;/summary&gt;
        /// &lt;typeparam name="TType"&gt;</span><span style="background:black;color:#008000;">The type of the type.</span><span style="background:black;color:#808080;">&lt;/typeparam&gt;
        /// &lt;param name="currentProject"&gt;</span><span style="background:black;color:#008000;">The current project.</span><span style="background:black;color:#808080;">&lt;/param&gt;
        /// &lt;param name="funcMock"&gt;</span><span style="background:black;color:#008000;">The func mock.</span><span style="background:black;color:#808080;">&lt;/param&gt;
        /// &lt;param name="returnString"&gt;</span><span style="background:black;color:#008000;">The return string.</span><span style="background:black;color:#808080;">&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        /// </span><span style="background:black;color:#008000;">Documentation Created 6/20/2008
        </span><span style="background:black;color:#bbfdcc;">public static </span><span style="background:black;color:#ffffff;">TType StubEx&lt;TType&gt;(</span><span style="background:black;color:#bbfdcc;">this </span><span style="background:black;color:#ffffff;">TType currentProject, </span><span style="background:black;color:#2b91af;">Func</span><span style="background:black;color:#ffffff;">&lt;TType, </span><span style="background:black;color:#2b91af;">String</span><span style="background:black;color:#ffffff;">&gt; funcMock,
                                          </span><span style="background:black;color:#2b91af;">String </span><span style="background:black;color:#ffffff;">returnString)
            </span><span style="background:black;color:#bbfdcc;">where </span><span style="background:black;color:#ffffff;">TType : </span><span style="background:black;color:#bbfdcc;">class</span><span style="background:black;color:#ffffff;">, </span><span style="background:black;color:#2b91af;">ICCStatsProject
        </span><span style="background:black;color:#ffffff;">{
            currentProject.Expect(funcMock).Return(returnString).Repeat.Any();
            </span><span style="background:black;color:#bbfdcc;">return </span><span style="background:black;color:#ffffff;">currentProject;
        }
    }
}</span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/dcarr.wordpress.com/267/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/dcarr.wordpress.com/267/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dcarr.wordpress.com/267/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dcarr.wordpress.com/267/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dcarr.wordpress.com/267/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dcarr.wordpress.com/267/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dcarr.wordpress.com/267/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dcarr.wordpress.com/267/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dcarr.wordpress.com/267/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dcarr.wordpress.com/267/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dcarr.wordpress.com/267/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dcarr.wordpress.com/267/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=267&subd=dcarr&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://team.pushbomb.com/2008/06/19/open-source-project-updated-cruise-controlnet-advanced-metrics/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7b572cbcda5a17fe984e7dd1ddc9c3d6?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">pushbomb</media:title>
		</media:content>

		<media:content url="http://dcarr.files.wordpress.com/2008/06/rhinomocks-120x90.png" medium="image">
			<media:title type="html">dont mock around</media:title>
		</media:content>
	</item>
		<item>
		<title>Advanced C# 3.0: Part 3 &#8211; New Language Features as &#8216;Domain Specific&#8217; as well as General Purpose Extensions</title>
		<link>http://team.pushbomb.com/2008/05/27/advanced-c-30-part-3-new-language-features-as-domain-specific-as-well-as-general-purpose-extensions/</link>
		<comments>http://team.pushbomb.com/2008/05/27/advanced-c-30-part-3-new-language-features-as-domain-specific-as-well-as-general-purpose-extensions/#comments</comments>
		<pubDate>Tue, 27 May 2008 22:42:46 +0000</pubDate>
		<dc:creator>Damon Wilder Carr</dc:creator>
				<category><![CDATA[C# 3.0 Enhancements]]></category>
		<category><![CDATA[C# 3.0 for Internal DSL]]></category>
		<category><![CDATA[Framework Design]]></category>
		<category><![CDATA[Proof Driven Development]]></category>
		<category><![CDATA[Software Design]]></category>
		<category><![CDATA[Software Futures]]></category>
		<category><![CDATA[agile practices]]></category>
		<category><![CDATA[reflection]]></category>
		<category><![CDATA[resharper]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[dsl]]></category>
		<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[GAT]]></category>
		<category><![CDATA[Resharper]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://dcarr.wordpress.com/2008/05/27/advanced-c-30-part-3-new-language-features-as-domain-specific-as-well-as-general-purpose-extensions/</guid>
		<description><![CDATA[One of the compelling directions beyond 'the basics' of domain-driven development is the advent and increasing use of 'DSL' (Domain Specific Language) technology in .NET. We have had a rich set of features since the 2005 release of Visual Studio in the Guidance Automation Toolkit and the DSL Toolkit and these have become even more compelling. However for some needs, the language now may provide enough for many smaller cases.

Now that new .NET 3.5 C# 3.0 features are allowing us to make the Framework API of .NET work in ways not present 'out of the box' the scope of what is possible can be deep and broad.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=238&subd=dcarr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>One of the compelling directions beyond &#8216;the basics&#8217; of domain-driven development is the advent and increasing use of &#8216;DSL&#8217; (Domain Specific Language) technology in .NET. We have had a rich set of features since the 2005 release of Visual Studio in the <a href="http://msdn.microsoft.com/en-us/vsx/default.aspx">Guidance Automation Toolkit</a> and the <a href="http://msdn.microsoft.com/en-us/library/bb126235.aspx">DSL Toolkit</a> and these have become even more compelling. I wrote about this back in January, 2006 <a href="http://www.developerland.com/DotNet/Design/444.aspx">as published here</a>. However for some needs, the language now may provide enough for many smaller cases.</p>
<blockquote><p align="center">Keep in mind, this post is not focused on DSL topics (one any developer cannot really afford to miss now), so one could debate the merits of the link I make. My argument is this:</p>
<p align="center">My definition of a DSL is very simply :</p>
</blockquote>
<p>A Domain Specific Language is a way, typically using a combination of visual and textual methods, or just textual, to solve a limited but typically non-trivial set of problems. It is typically a smaller stand-alone &#8216;language&#8217; or language-extension to a larger more horizontal language such as C# (the point I make here is C# has evolved to allow you to expand C# with DSLs you write in C#. This is very different the the DSL Toolkit and I have never had this opinion until I finally got to be immersed deeply in functional style programming enhancements to C# and the ease of extending just about any API with extensions..</p>
<p><a href="http://damon.agilefactor.com/domain-specific-languages-central-to-staying-relevant/">I continue the discussion of what a DSL is here.</a> I will be adding to this section of the site over time but if you just want the listed info, no need to go on a tangent now.</p>
<blockquote><p><strong>Now that new .NET 3.5 C# 3.0 features are allowing us to make the Framework API of .NET work in ways not present &#8216;out of the box&#8217; the scope of what is possible can be deep and broad.</strong></p>
</blockquote>
<h2>Part 1 : The DSL Perspective &#8211; A Real Example</h2>
<p>I&#8217;ll use a project we are working on now, which is quite specifically aimed to</p>
<ul>
<li>Minimize the configuration overhead of using an Inversion of Control container </li>
<li>Provide the benefit of &#8216;provider/container&#8217; independence </li>
<li>Allow the consumer to change &#8216;container provider&#8217; vendors with a simple change in &#8216;meta configuration&#8217; </li>
</ul>
<p>In other words, we are trying to create an abstraction on top of an abstraction, as we believe this particular area is now mature enough (and indeed this is how software engineering historically more then not progresses over time) to do so.</p>
<p>This project has no intention of BEING an inversion of control container nor a dependency injector, rather its aim is to allow people to make use of these critical concepts in much easier ways while eliminating hesitation related to provider lock-in.</p>
<p>It&#8217;s no secret we are massive fans of the work of the <a href="http://www.castleproject.org/">Castle Project</a> and they are indeed the first &#8216;plug-in&#8217; adapter we are on schedule to deliver. However the architecture (something this post is NOT trying to explain) of our solution models the DOMAIN of this area, and is not specific to any particular offering (although to be blunt I would say if any bias existed it would be from the conceptual framework that exists now in the <a href="http://www.castleproject.org/container/index.html">Windsor Container/MicroKernal trunk</a>).</p>
<h4>A domain specific example</h4>
<p>In the area of ASP.NET one technique for loading our solution into memory is via the IHttpModule implementation we provide. Here is what the custom global.asax.cs code looks like:</p>
<p><span style="background:black 0 50%;color:#9bdd22;">public abstract class </span><span style="background:black 0 50%;color:#8bcfe2;">IntegrationPoint </span><span style="background:black 0 50%;color:#feba1b;">: </span><span style="background:black 0 50%;color:#8bcfe2;">HttpApplication</span><span style="background:black 0 50%;color:#feba1b;">, </span><span style="background:black 0 50%;color:#2b91af;">IDomainApplication </span><span style="background:black 0 50%;color:#feba1b;">{ </span></p>
<p><span style="background:black 0 50%;color:#9bdd22;">private static </span><span style="background:black 0 50%;color:#2b91af;">IZeroConfigDI </span><span style="background:black 0 50%;color:#feba1b;">_container; </span></p>
<p><span style="background:black 0 50%;color:#808080;">/// &lt;summary&gt;      <br /></span><span style="background:black 0 50%;color:#808080;">/// </span><span style="background:black 0 50%;color:#008000;">Executes custom initialization code after      <br /></span><span style="background:black 0 50%;color:#808080;">/// </span><span style="background:black 0 50%;color:#008000;">all event handler      <br /></span><span style="background:black 0 50%;color:#808080;">/// </span><span style="background:black 0 50%;color:#008000;">modules have been added.      <br /></span><span style="background:black 0 50%;color:#808080;">/// </span><span style="background:black 0 50%;color:#008000;">Also acquire a reference to the HttpModule      <br /></span><span style="background:black 0 50%;color:#808080;">/// </span><span style="background:black 0 50%;color:#008000;">for IoC / DI if present as a module      <br /></span><span style="background:black 0 50%;color:#808080;">/// &lt;/summary&gt;      <br />&#160;</span><span style="background:black 0 50%;color:#9bdd22;">public override void </span><span style="background:black 0 50%;color:#feba1b;">Init() {<span style="background:black 0 50%;color:#feba1b;">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span></span></p>
<div><span style="background:black 0 50%;color:#feba1b;"><span style="background:black 0 50%;color:#feba1b;">&#160;&#160;&#160;&#160;&#160;&#160;&#160; _container = Modules.GetIoCModule(); </span></span></div>
<div><span style="background:black 0 50%;color:#feba1b;"><span style="background:black 0 50%;color:#feba1b;">&#160;&#160;&#160;&#160;&#160; </span></span><span style="background:black 0 50%;color:#9bdd22;">&#160;&#160;&#160; base</span><span style="background:black 0 50%;color:#feba1b;">.Init();</span></div>
<div><span style="background:black 0 50%;color:#feba1b;"></span></div>
<div><span style="background:black 0 50%;color:#feba1b;"><span style="background:black 0 50%;color:#feba1b;">} </span></span>
</p></div>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>The interesting areas which are not provided by Microsoft include:</p>
<ol>
<li>IDomainApplication interface </li>
<li>IZeriConfigDI Interface static reference </li>
<li>Modules.GetIoCModule() </li>
</ol>
<p>The first two have more to do with our solution then the topic of this post, so I&#8217;ll focus on #3.</p>
<p>As this code is inside the HttpApplication, we have access to the Modules property which is read-only. Here is the documentation:</p>
<p>&#160;</p>
<table cellspacing="10" cellpadding="10" width="648" border="1">
<tbody>
<tr>
<td valign="top" width="626">
<h2>System.Web.HttpModuleCollection Modules { get; }</h2>
<p> 
<p align="center"><font color="#ffffff"><span style="color:#6682ee;"><font color="#ffffff"><strong></strong>                  <br /></font></span></font></p>
<p align="left"><span style="color:#6682ee;"><font color="#ffffff"><font color="#ffffff"><span style="color:#6682ee;"><font color="#ffffff"><em>Member of System.Web.HttpApplication</em></font></span></font><span style="color:#6682ee;"><font color="#ffffff"> </font></span></font></span></p>
<p align="left"><span style="color:#6682ee;"><font color="#ffffff"><span style="color:#6682ee;"><font color="#ffffff">                   <br />Gets the collection of modules for the current application.</font></span><span style="color:#6682ee;"><font color="#ffffff">Returns:                    <br />An System.Web.HttpModuleCollection that contains the names of the modules for the application.                     <br /></font></span></font></span></p>
</td>
</tr>
</tbody>
</table>
<p><span style="color:#000000;"><a href="http://11011.net/software/vspaste"></a></span></p>
<p>Your first reaction if your familiar with this collection is that it does not have anything even close to the GetIoCModule() method we are calling above.</p>
<p>Indeed this is our &#8216;domain specific&#8217; extension to the .NET Framework API (one of many for this solution).</p>
<p>Here is the implementation of this &#8216;DSL&#8217; extension:</p>
<p><font color="#484848"><span style="background:black 0 50%;color:#808080;">/// &lt;summary&gt;        <br /></span><span style="background:black 0 50%;color:#808080;">/// </span></font><font color="#484848"><span style="background:black 0 50%;color:#008000;">Provides ‘DSL specific’ extensions to the ASP.NET environment for        <br /></span><span style="background:black 0 50%;color:#808080;">/// </span><span style="background:black 0 50%;color:#008000;">the IoC Zero Config environment which is not new (after all this becomes a static)</span></font><span style="background:black 0 50%;color:#008000;"><font color="#484848">        <br /></font></span><font color="#484848"><span style="background:black 0 50%;color:#808080;">/// &lt;/summary&gt;        <br /></span><span style="background:black 0 50%;color:#808080;">/// </span><span style="background:black 0 50%;color:#008000;">The entire point for extension methods is ‘Fluency in API’ as it allows ‘shorthand’ code</span></font></p>
<p><font color="#484848"><span style="background:black 0 50%;color:#9bdd22;">public static class </span><span style="background:black 0 50%;color:#8bcfe2;">ZeroConfigInstanceResolver </span><span style="background:black 0 50%;color:#feba1b;">{ </span></font></p>
<p><font color="#484848"><span style="background:black 0 50%;color:#9bdd22;">private const string </span><span style="background:black 0 50%;color:#feba1b;">ZeroConfigTypeString = </span><span style="background:black 0 50%;color:#a31515;">&quot;IoCConfigModule.IHttpModel&quot;</span><span style="background:black 0 50%;color:#feba1b;">;</span></font></p>
<p><span style="background:black 0 50%;color:#feba1b;"></span><span style="background:black 0 50%;color:#feba1b;"><font color="#484848">&#160;</font></span><font color="#484848"><span style="background:black 0 50%;color:#808080;">/// &lt;summary&gt;        <br /></span><span style="background:black 0 50%;color:#808080;">/// </span></font><font color="#484848"><span style="background:black 0 50%;color:#008000;">Gets the IZeroConfigDI reference        <br /></span><span style="background:black 0 50%;color:#808080;">/// </span></font><font color="#484848"><span style="background:black 0 50%;color:#008000;">(using domain specific logic and the&#160; <br /></span><span style="background:black 0 50%;color:#808080;">/// </span></font><span style="background:black 0 50%;color:#008000;"><font color="#484848">generic logic extending the container)        <br /></font></span><font color="#484848"><span style="background:black 0 50%;color:#808080;">/// &lt;/summary&gt;        <br /></span><span style="background:black 0 50%;color:#808080;">/// &lt;param name=&quot;container&quot;&gt;</span><span style="background:black 0 50%;color:#008000;">The container.</span></font><font color="#484848"><span style="background:black 0 50%;color:#808080;">&lt;/param&gt;        <br /></span><span style="background:black 0 50%;color:#808080;">/// &lt;returns&gt;&lt;/returns&gt; </span></font></p>
<p><font color="#484848"><span style="background:black 0 50%;color:#9bdd22;">public static </span><span style="background:black 0 50%;color:#2b91af;">IZeroConfigDI </span><span style="background:black 0 50%;color:#feba1b;">GetIoCModule(</span><span style="background:black 0 50%;color:#9bdd22;">this </span><span style="background:black 0 50%;color:#8bcfe2;">HttpModuleCollection </span><span style="background:black 0 50%;color:#feba1b;">container) {</span></font></p>
<p><span style="background:black 0 50%;color:#feba1b;"><font color="#484848">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><span style="background:black 0 50%;color:#9bdd22;"><font color="#484848">return        <br /></font></span><font color="#484848"><span style="background:black 0 50%;color:#feba1b;">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; container.FindInstance(        <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; () =&gt;         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; container.Get(ZeroConfigTypeString)         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span><span style="background:black 0 50%;color:#feba1b;">&#160;</span><span style="background:black 0 50%;color:#9bdd22;">as </span><span style="background:black 0 50%;color:#2b91af;">IZeroConfigDI</span><span style="background:black 0 50%;color:#feba1b;">); </span></font></p>
<p><span style="background:black 0 50%;color:#feba1b;"><font color="#484848">}</font></span></p>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>As you can see above we are very specific in our intent to add this to the HttpModuleCollection. There is nothing that interesting above except for the method call FindInstance(Func&lt;TResult&gt;) off the target &#8216;container&#8217;. This is a peek into the non-DSL related extension that represents. You might be aware that there is no such FindInstance available off the HttpModuleCollection.</p>
<p>One of our many goals in creating a fluent, easily used API is reducing complexity and providing very maintainable code. Here you can see the Lambada expression required to locate our service is hidden from the developer completely, yet this code is not a &#8216;one-off&#8217; as we have provided both a DSL level extension in concert with a far more generic extension.</p>
<h2>Part 2: Extending the Horizontal to Empower the Domain Specific</h2>
<p>In looking at the HttpModuleCollection, and in our desire to facilitate other sources of resolving our module, it inherits from the abstract parent NameObjectCollectionBase.</p>
<p>Here is the definition of what inherits from this abstract parent:</p>
<table cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td valign="top" width="400"> <br />
<h2>public abstract class NameObjectCollectionBase </h2>
<p>Member of System.Collections.SpecializedSummary:           </p>
<p><em>Provides the abstract base class for a collection of associated System.String keys and System.Object values that can be accessed either with the key or with the index.</em></td>
</tr>
</tbody>
</table>
<p><a href="http://dcarr.files.wordpress.com/2008/05/found.jpg"></a></p>
<p>The issue arises as this abstract base leaves it up to its concrete implementer to provide the indexer (or say Get() method) to access the object desired. Therefore a nice way to enhance this abstract type to work across all of the children is to literally pass in the method to resolve the object desired.</p>
<h2>Part 3 : The Generic Extension</h2>
<p>Here is the trivial extension method used to &#8216;open up&#8217; the NameObjectCollectionBase and which is used above:</p>
<p><span style="background:black 0 50%;color:#808080;">/// &lt;summary&gt;      <br />/// </span><span style="background:black 0 50%;color:#008000;">Finds the instance in the NameObjectCollectionBase      <br /></span><span style="background:black 0 50%;color:#808080;">/// </span><span style="background:black 0 50%;color:#008000;">using the Functor      <br /></span><span style="background:black 0 50%;color:#808080;">/// &lt;/summary&gt;      <br />/// &lt;typeparam name=&quot;TContainer&quot;&gt;</span><span style="background:black 0 50%;color:#008000;">The type of the container.</span><span style="background:black 0 50%;color:#808080;">&lt;/typeparam&gt;      <br />/// &lt;typeparam name=&quot;TResult&quot;&gt;</span><span style="background:black 0 50%;color:#008000;">The type of the result.</span><span style="background:black 0 50%;color:#808080;">&lt;/typeparam&gt;      <br />/// &lt;param name=&quot;container&quot;&gt;</span><span style="background:black 0 50%;color:#008000;">The container.</span><span style="background:black 0 50%;color:#808080;">&lt;/param&gt;      <br />/// &lt;param name=&quot;finder&quot;&gt;</span><span style="background:black 0 50%;color:#008000;">The finder.</span><span style="background:black 0 50%;color:#808080;">&lt;/param&gt;      <br />/// &lt;returns&gt;&lt;/returns&gt;       <br /></span><span style="background:black 0 50%;color:#9bdd22;">public static </span><span style="background:black 0 50%;color:#feba1b;">TResult FindInstance&lt;TContainer, TResult&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160; (</span><span style="background:black 0 50%;color:#9bdd22;">this </span><span style="background:black 0 50%;color:#feba1b;">TContainer container, </span><span style="background:black 0 50%;color:#2b91af;">Func</span><span style="background:black 0 50%;color:#feba1b;">&lt;TResult&gt; finder)      <br /></span><span style="background:black 0 50%;color:#9bdd22;">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; where </span><span style="background:black 0 50%;color:#feba1b;">TContainer : </span><span style="background:black 0 50%;color:#8bcfe2;">NameObjectCollectionBase </span><span style="background:black 0 50%;color:#9bdd22;">where </span><span style="background:black 0 50%;color:#feba1b;">TResult : </span><span style="background:black 0 50%;color:#9bdd22;">class </span><span style="background:black 0 50%;color:#feba1b;">{ </span></p>
<p><span style="background:black 0 50%;color:#feba1b;">     <br /></span><span style="background:black 0 50%;color:#9bdd22;">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return </span><span style="background:black 0 50%;color:#feba1b;">finder();      </p>
<p>} </span></p>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>Since we cannot abstract up the get method, we take a page from Functional Programming and literally pass in the code to execute (which we do above).</p>
<p>A common pattern is to expose methods like the above, but add additional versions that allow more parameters into the Func&lt;TResult&gt;. This is well covered well by many of the Linq references and books available.</p>
<h2>Part 4: How this allows us to embrace deep/wide change</h2>
<p>A simplistic example is supporting the acquisitions of our target reference (IZeroConfigDI) if it is set as ApplicationState or as an IHttpModule. We could make the design decision to allow our find method to reside literally as an extension method of our HttpApplication (and indeed this turns out to be a reasonable choice as the valid inheritors from NameObjectCollectionBase are sealed and therefore invalid as generic constraints). Here is one approach (not ideal and not our final code but this illustrates the point.) Why not offer your optimized solution?</p>
<p>CODE:</p>
<p><span style="background:black 0 50%;color:#9bdd22;">public abstract class </span><span style="background:black 0 50%;color:#8bcfe2;">IntegrationPoint </span><span style="background:black 0 50%;color:#feba1b;">: </span><span style="background:black 0 50%;color:#8bcfe2;">HttpApplication</span><span style="background:black 0 50%;color:#feba1b;">, </span><span style="background:black 0 50%;color:#2b91af;">IDomainApplication </span><span style="background:black 0 50%;color:#feba1b;">{</span> </p>
</p>
<p> <span style="background:black 0 50%;color:#9bdd22;">private static </span><span style="background:black 0 50%;color:#2b91af;">IZeroConfigDI </span><span style="background:black 0 50%;color:#feba1b;">_container;</span>
</p>
<p> <span style="background:black 0 50%;color:#808080;">/// &lt;summary&gt;    <br />/// </span><span style="background:black 0 50%;color:#008000;">Executes custom initialization code after    <br /></span><span style="background:black 0 50%;color:#808080;">/// </span><span style="background:black 0 50%;color:#008000;">all event handler    <br /></span><span style="background:black 0 50%;color:#808080;">/// </span><span style="background:black 0 50%;color:#008000;">modules have been added.    <br /></span><span style="background:black 0 50%;color:#808080;">/// </span><span style="background:black 0 50%;color:#008000;">Also acquire a reference to the HttpModule    <br /></span><span style="background:black 0 50%;color:#808080;">/// </span><span style="background:black 0 50%;color:#008000;">or Application State    <br /></span><span style="background:black 0 50%;color:#808080;">/// </span><span style="background:black 0 50%;color:#008000;">for IoC / DI if present    <br /></span><span style="background:black 0 50%;color:#808080;">/// &lt;/summary&gt;    <br /></span><span style="background:black 0 50%;color:#9bdd22;">public override void </span><span style="background:black 0 50%;color:#feba1b;">Init() { </span>
</p>
<p><span style="background:black 0 50%;color:#feba1b;">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; _container = </span><span style="background:black 0 50%;color:#9bdd22;">this</span><span style="background:black 0 50%;color:#feba1b;">.GetIoCModule(); </span><span style="background:black 0 50%;color:#9bdd22;">base</span><span style="background:black 0 50%;color:#feba1b;">.Init(); </span></p>
<p><span style="background:black 0 50%;color:#feba1b;">}</span></p>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>And the extension on HttpApplication:</p>
<p><span style="background:black 0 50%;color:#9bdd22;">public static class </span><span style="background:black 0 50%;color:#8bcfe2;">ZeroConfigInstanceResolver </span><span style="background:black 0 50%;color:#feba1b;">{</span> </p>
</p>
<p> <span style="background:black 0 50%;color:#9bdd22;">private const string </span><span style="background:black 0 50%;color:#feba1b;">ZeroConfigTypeString = </span><span style="background:black 0 50%;color:#a31515;">&quot;IoCConfigModule.IHttpModel&quot;</span><span style="background:black 0 50%;color:#feba1b;">;</span>
</p>
<p> <span style="background:black 0 50%;color:#808080;">/// &lt;summary&gt;    <br />/// </span><span style="background:black 0 50%;color:#008000;">Gets the IZeroConfigDI reference if possible (null if not found)    <br /></span><span style="background:black 0 50%;color:#808080;">/// </span><span style="background:black 0 50%;color:#008000;">using domain specific logic and the    <br /></span><span style="background:black 0 50%;color:#808080;">/// </span><span style="background:black 0 50%;color:#008000;">generic logic extending the container.    <br /></span><span style="background:black 0 50%;color:#808080;">/// &lt;/summary&gt;    <br />/// &lt;param name=&quot;container&quot;&gt;</span><span style="background:black 0 50%;color:#008000;">The container.</span><span style="background:black 0 50%;color:#808080;">&lt;/param&gt;    <br />/// &lt;returns&gt;&lt;/returns&gt;     <br /></span><span style="background:black 0 50%;color:#9bdd22;">public static </span><span style="background:black 0 50%;color:#2b91af;">IZeroConfigDI </span><span style="background:black 0 50%;color:#feba1b;">GetIoCModule(</span><span style="background:black 0 50%;color:#9bdd22;">this </span><span style="background:black 0 50%;color:#8bcfe2;">HttpApplication </span><span style="background:black 0 50%;color:#feba1b;">container) {</span>
</p>
<p><span style="background:black 0 50%;color:#9bdd22;">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var </span><span style="background:black 0 50%;color:#feba1b;">modules = container.Modules;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span><span style="background:black 0 50%;color:#9bdd22;">var </span><span style="background:black 0 50%;color:#feba1b;">applicationState = container.Application;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span></p>
<p><span style="background:black 0 50%;color:#feba1b;">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span><span style="background:black 0 50%;color:#9bdd22;">var </span><span style="background:black 0 50%;color:#feba1b;">resultVar = modules.ToInstance(      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; () =&gt; modules.Get(ZeroConfigTypeString)       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; )       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span><span style="background:black 0 50%;color:#feba1b;">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ??&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; applicationState.ToInstance(       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; () =&gt; </span><span style="background:black 0 50%;color:#feba1b;">applicationState.Get(ZeroConfigTypeString)      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; );</span> </p>
</p>
<p> <span style="background:black 0 50%;color:#9bdd22;">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return </span><span style="background:black 0 50%;color:#feba1b;">resultVar </span><span style="background:black 0 50%;color:#9bdd22;">as </span><span style="background:black 0 50%;color:#2b91af;">IZeroConfigDI</span><span style="background:black 0 50%;color:#feba1b;">;    </p>
<p>}</span>
</p>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>No change is required on the extension to the FindInstance extension.</p>
<p>Can you see how the above can be improved?</p>
<p>We expand this to make the ‘rule for finding the <span style="background:black 0 50%;color:#2b91af;">IZeroConfigDI</span> external. To be specific, above we have a business rule implemented that we typically would not want ‘hard coded’. In fact more then not all things considered we want this. So we do the4 following:</p>
<ul>
<li>Determine the Delegate signature for the business rule.      </li>
<li>For the above, we need as input (at a minimum) an <span style="background:black 0 50%;color:#8bcfe2;">HttpApplication </span>instance as that is the container for the models and state, and those two items lack a shared interface or base (or we could use that).       </li>
<li>The signature returns (in all cases) an instance cast where it implement <span style="background:black 0 50%;color:#2b91af;">IZeroConfigDI </span>to resolve this business rule.       </li>
<li>Therefore the business rule signature is <strong>Func&lt;<span style="background:black 0 50%;color:#8bcfe2;">HttpApplication </span>,<span style="background:black 0 50%;color:#2b91af;">IZeroConfigDI</span>&gt;</strong>       </li>
</ul>
<p><strong></strong></p>
<table cellspacing="0" cellpadding="2" width="355" border="1">
<tbody>
<tr>
<td valign="top" width="353">
<p><strong></strong></p>
<p>         <strong>
<p>&#160;</p>
<p>         </strong>
<ul>
<li>
<h3>It’s an essential skill to not only master generics at the deepest level, but to master all the intrinsic delegate types (Predicate, Func, Action, etc.) to be proficient in the state of the technology of Linq today </h3>
<p></li>
<li>
<h3>We wish it was easier to ‘extend’ Delegates by inheritance or to not be tasked with coding to each variant of a delegates possible type parameters, but this is different the Object Oriented in it’s domain. </h3>
<p></li>
<li>
<h3>We also wish the generic constraint language would be fundamentally focused on, extended and evolved to allow the full richness in constraint semantics as we have with Linq Expressions. </h3>
<p></li>
</ul>
</td>
</tr>
</tbody>
</table>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/dcarr.wordpress.com/238/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/dcarr.wordpress.com/238/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dcarr.wordpress.com/238/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dcarr.wordpress.com/238/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dcarr.wordpress.com/238/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dcarr.wordpress.com/238/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dcarr.wordpress.com/238/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dcarr.wordpress.com/238/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dcarr.wordpress.com/238/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dcarr.wordpress.com/238/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dcarr.wordpress.com/238/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dcarr.wordpress.com/238/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=238&subd=dcarr&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://team.pushbomb.com/2008/05/27/advanced-c-30-part-3-new-language-features-as-domain-specific-as-well-as-general-purpose-extensions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7b572cbcda5a17fe984e7dd1ddc9c3d6?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">pushbomb</media:title>
		</media:content>
	</item>
		<item>
		<title>Advanced C# 3.0 : Part 2 &#8211; Everyday Tasks with New Solutions</title>
		<link>http://team.pushbomb.com/2008/05/22/advanced-c-30-part-2-everyday-tasks-with-new-solutions/</link>
		<comments>http://team.pushbomb.com/2008/05/22/advanced-c-30-part-2-everyday-tasks-with-new-solutions/#comments</comments>
		<pubDate>Thu, 22 May 2008 19:31:10 +0000</pubDate>
		<dc:creator>Damon Wilder Carr</dc:creator>
				<category><![CDATA[C# 3.0 Enhancements]]></category>
		<category><![CDATA[C# 3.0 for Internal DSL]]></category>
		<category><![CDATA[Software Design]]></category>
		<category><![CDATA[Software Futures]]></category>
		<category><![CDATA[agile practices]]></category>
		<category><![CDATA[reflection]]></category>
		<category><![CDATA[Advanced C#]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Delegates]]></category>
		<category><![CDATA[Functional Programming]]></category>
		<category><![CDATA[Lambada]]></category>
		<category><![CDATA[Visual Studio 2008]]></category>

		<guid isPermaLink="false">http://dcarr.wordpress.com/2008/05/22/advanced-c-30-part-2-everyday-tasks-with-new-solutions/</guid>
		<description><![CDATA[In this post I'll be digging deeper into doing things I've always wanted to have in .NET yet didn't. For example, I know I am not alone in wanting an IList (be it an IList or a simple non-generic IList) to provide me a .foreach method as you get in a List). This is just one of many things we address here (and more).<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=232&subd=dcarr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<h3>Part 2 : Digging Deeper into Lambadas, Extension Methods, and Linq</h3>
<p>The world’s most common extension method and an attempt at a definitive version.</p>
<p>In this post I&#8217;ll be digging deeper into doing things I&#8217;ve always wanted to have in .NET yet didn&#8217;t. For example, I know I am not alone in wanting an IList (be it an IList&lt;T&gt; or a simple non-generic IList) to provide me a .foreach method as you get in a List&lt;T&gt;). This is just one of many things we address here (and more).</p>
<h1>From the concrete to the abstract</h1>
<p>I was having problems with entries in my path environmental variable, and I wanted an easy way to flag bad entries and also allow me to move the entries in the list up or down easily. This was made apparent by my use of a tool called &#8216;Dependency Walker&#8217;. It&#8217;s hard to live without but that&#8217;s another post. See the screen shot below:</p>
<p><a href="http://dcarr.files.wordpress.com/2008/05/image-0001.png"><img style="border-width:0;" alt="Image-0001" src="http://dcarr.files.wordpress.com/2008/05/image-0001-thumb.png?w=458&#038;h=316" width="458" height="316" /></a></p>
<p><a href="http://www.dependencywalker.com/">Click here to go to &#8216;Dependency Walker&#8217;</a></p>
<h1>Test to Code</h1>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>&#160;</p>
<pre class="code"><span style="background:#100d0c;color:#e1b04a;"><font size="1">    </font></span><span style="background:#100d0c;color:#a0a0a0;"><font size="1">/// &lt;summary&gt;
    /// </font></span><span style="background:#100d0c;color:#80ff00;"><font size="1">Unit Test to Validate that the logic related to     /// 'show combined extensions using paths' is functioning
    </font></span><span style="background:#100d0c;color:#a0a0a0;"><font size="1">/// &lt;/summary&gt;
    /// </font></span><font size="1"><span style="background:#100d0c;color:#80ff00;">Documentation Created 5/22/2008
    </span><span style="background:#100d0c;color:#e1b04a;">[</span><span style="background:#100d0c;color:#64b1ff;">Test</span></font><font size="1"><span style="background:#100d0c;color:#e1b04a;">]
    </span><span style="background:#100d0c;color:#8ac5ff;">public void </span></font><font size="1"><span style="background:#100d0c;color:#e1b04a;">shouldShowCombinedExtensionsUsingPaths()
    {
        </span><span style="background:#100d0c;color:#8ac5ff;">var </span><span style="background:#100d0c;color:#e1b04a;">_directoriesInPath </span><span style="background:#100d0c;color:silver;">= </span><span style="background:#100d0c;color:#d6adad;">EnvironmentVariableTarget</span></font><font size="1"><span style="background:#100d0c;color:silver;">.             </span><span style="background:#100d0c;color:#e1b04a;">Process</span><span style="background:#100d0c;color:silver;">.</span><span style="background:#100d0c;color:#e1b04a;">GetParsedValues(</span><span style="background:#100d0c;color:#ff8040;">&quot;PATH&quot;</span></font><font size="1"><span style="background:#100d0c;color:#e1b04a;">);

        </span><span style="background:#100d0c;color:#64b1ff;">Assert</span><span style="background:#100d0c;color:silver;">.</span><span style="background:#100d0c;color:#e1b04a;">That(_directoriesInPath, </span><span style="background:#100d0c;color:#64b1ff;">Is</span></font><font size="1"><span style="background:#100d0c;color:silver;">.                </span><span style="background:#100d0c;color:#e1b04a;">TypeOf(</span><span style="background:#100d0c;color:#8ac5ff;">typeof</span><span style="background:#100d0c;color:#e1b04a;">(</span><span style="background:#100d0c;color:#64b1ff;">String</span></font><font size="1"><span style="background:#100d0c;color:#e1b04a;">[])));
        </span><span style="background:#100d0c;color:#64b1ff;">Assert</span><span style="background:#100d0c;color:silver;">.</span><span style="background:#100d0c;color:#e1b04a;">IsTrue(</span><span style="background:#100d0c;color:silver;">!</span><span style="background:#100d0c;color:#e1b04a;">_directoriesInPath</span><span style="background:#100d0c;color:silver;">.</span></font><font size="1"><span style="background:#100d0c;color:#e1b04a;">IsNullOrEmpty());

        _directoriesInPath</span><span style="background:#100d0c;color:silver;">.</span></font><span style="background:#100d0c;color:#e1b04a;"><font size="1">ForEach(
            x </font></span><span style="background:#100d0c;color:silver;"><font size="1">=&gt;
            </font></span><font size="1"><span style="background:#100d0c;color:#e1b04a;">{
                </span><span style="background:#100d0c;color:#8ac5ff;">if </span><span style="background:#100d0c;color:#e1b04a;">(</span><span style="background:#100d0c;color:silver;">!</span><span style="background:#100d0c;color:#64b1ff;">Directory</span><span style="background:#100d0c;color:silver;">.</span></font><font size="1"><span style="background:#100d0c;color:#e1b04a;">Exists(x))
                    </span><span style="background:#100d0c;color:#64b1ff;">Console</span><span style="background:#100d0c;color:silver;">.</span><span style="background:#100d0c;color:#e1b04a;">WriteLine(</span><span style="background:#100d0c;color:#ff8040;">&quot;MIssing Directory! &quot; </span><span style="background:#100d0c;color:silver;">+ </span></font><span style="background:#100d0c;color:#e1b04a;"><font size="1">x);
            });
    }</font></span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>Above is the test (that also works). Before I launch into why this is interesting, what looks different?</p>
<p>1) EnvironmentVariableTarget : This is Microsoft&#8217;s type not mine. It&#8217;s the enum used to specify the target search on the environmentals.</p>
<p>2) _directoriesInPath : This is a string[] as you can see from the Assertion. But how does it support ForEach?</p>
<p>3) GetParsedValues() : What is that exactly?</p>
<blockquote>
<p>*** As this is so common I decided to try to craft a definitive version of ForEach that would work across non-generic collections, generic collection, and specific type specification on the targeted items in the collection for generics .&#160; ***</p>
</blockquote>
<p>In order to enable ForEach behavior I needed to this code which is by far the most common extension method in all the C# 3.0 code alive today.</p>
<p>&#160;</p>
<pre class="code">
<span style="background:#100d0c;color:#e1b04a;"><font size="1">    </font></span><span style="background:#100d0c;color:#a0a0a0;"><font size="1">/// &lt;summary&gt;
    /// </font></span><span style="background:#100d0c;color:#80ff00;"><font size="1">Requires generic IEnumerable and is most common now
    </font></span><font size="1"><span style="background:#100d0c;color:#a0a0a0;">/// &lt;/summary&gt;
    /// &lt;typeparam name=</span><span style="background:#100d0c;color:#919191;">&quot;TContainedType&quot;</span><span style="background:#100d0c;color:#a0a0a0;">&gt;</span><span style="background:#100d0c;color:#80ff00;">The type of the contained type.</span></font><font size="1"><span style="background:#100d0c;color:#a0a0a0;">&lt;/typeparam&gt;
    /// &lt;param name=</span><span style="background:#100d0c;color:#919191;">&quot;baseEnum&quot;</span><span style="background:#100d0c;color:#a0a0a0;">&gt;</span><span style="background:#100d0c;color:#80ff00;">The base enum.</span></font><font size="1"><span style="background:#100d0c;color:#a0a0a0;">&lt;/param&gt;
    /// &lt;param name=</span><span style="background:#100d0c;color:#919191;">&quot;actionPerform&quot;</span><span style="background:#100d0c;color:#a0a0a0;">&gt;</span><span style="background:#100d0c;color:#80ff00;">The action perform.</span></font><span style="background:#100d0c;color:#a0a0a0;"><font size="1">&lt;/param&gt;
    /// &lt;returns&gt;&lt;/returns&gt;
    /// </font></span><font size="1"><span style="background:#100d0c;color:#80ff00;">Documentation Created 7/20/2008
    </span><span style="background:#100d0c;color:#8ac5ff;">public static </span><span style="background:#100d0c;color:#ff6fb7;">IEnumerable</span><span style="background:#100d0c;color:silver;">&lt;</span><span style="background:#100d0c;color:#e1b04a;">TContainedType</span><span style="background:#100d0c;color:silver;">&gt; </span><span style="background:#100d0c;color:#e1b04a;">ForEach</span><span style="background:#100d0c;color:silver;">&lt;</span><span style="background:#100d0c;color:#e1b04a;">TContainedType</span><span style="background:#100d0c;color:silver;">&gt;</span></font><font size="1"><span style="background:#100d0c;color:#e1b04a;">(
           </span><span style="background:#100d0c;color:#8ac5ff;">this </span><span style="background:#100d0c;color:#ff6fb7;">IEnumerable</span><span style="background:#100d0c;color:silver;">&lt;</span><span style="background:#100d0c;color:#e1b04a;">TContainedType</span><span style="background:#100d0c;color:silver;">&gt; </span></font><font size="1"><span style="background:#100d0c;color:#e1b04a;">baseEnum,
               </span><span style="background:#100d0c;color:#ffaeff;">Action</span><span style="background:#100d0c;color:silver;">&lt;</span><span style="background:#100d0c;color:#e1b04a;">TContainedType</span><span style="background:#100d0c;color:silver;">&gt; </span></font><font size="1"><span style="background:#100d0c;color:#e1b04a;">actionPerform) {

        </span><span style="background:#100d0c;color:#8ac5ff;">return </span></font><span style="background:#100d0c;color:#e1b04a;"><font size="1">ForEachInner(baseEnum, actionPerform);
    }

    </font></span><span style="background:#100d0c;color:#a0a0a0;"><font size="1">/// &lt;summary&gt;
    /// </font></span><span style="background:#100d0c;color:#80ff00;"><font size="1">The most explicit case
    </font></span><font size="1"><span style="background:#100d0c;color:#a0a0a0;">/// &lt;/summary&gt;
    /// &lt;typeparam name=</span><span style="background:#100d0c;color:#919191;">&quot;TBase&quot;</span><span style="background:#100d0c;color:#a0a0a0;">&gt;</span><span style="background:#100d0c;color:#80ff00;">The type of the base.</span></font><font size="1"><span style="background:#100d0c;color:#a0a0a0;">&lt;/typeparam&gt;
    /// &lt;typeparam name=</span><span style="background:#100d0c;color:#919191;">&quot;TContainedType&quot;</span><span style="background:#100d0c;color:#a0a0a0;">&gt;</span><span style="background:#100d0c;color:#80ff00;">The type of the contained type.</span></font><font size="1"><span style="background:#100d0c;color:#a0a0a0;">&lt;/typeparam&gt;
    /// &lt;param name=</span><span style="background:#100d0c;color:#919191;">&quot;baselineEnumerable&quot;</span><span style="background:#100d0c;color:#a0a0a0;">&gt;</span><span style="background:#100d0c;color:#80ff00;">The baseline enumerable.</span></font><font size="1"><span style="background:#100d0c;color:#a0a0a0;">&lt;/param&gt;
    /// &lt;param name=</span><span style="background:#100d0c;color:#919191;">&quot;actionPerform&quot;</span><span style="background:#100d0c;color:#a0a0a0;">&gt;</span><span style="background:#100d0c;color:#80ff00;">The action perform.</span></font><span style="background:#100d0c;color:#a0a0a0;"><font size="1">&lt;/param&gt;
    /// &lt;returns&gt;&lt;/returns&gt;
    /// </font></span><font size="1"><span style="background:#100d0c;color:#80ff00;">Documentation Created 7/20/2008
    </span><span style="background:#100d0c;color:#8ac5ff;">public static </span><span style="background:#100d0c;color:#ff6fb7;">IEnumerable</span><span style="background:#100d0c;color:silver;">&lt;</span><span style="background:#100d0c;color:#e1b04a;">TContainedType</span><span style="background:#100d0c;color:silver;">&gt; </span><span style="background:#100d0c;color:#e1b04a;">ForEach</span><span style="background:#100d0c;color:silver;">&lt;</span><span style="background:#100d0c;color:#e1b04a;">TBase, TContainedType</span><span style="background:#100d0c;color:silver;">&gt;</span></font><font size="1"><span style="background:#100d0c;color:#e1b04a;">(
              </span><span style="background:#100d0c;color:#8ac5ff;">this </span><span style="background:#100d0c;color:#e1b04a;">TBase baselineEnumerable, </span><span style="background:#100d0c;color:#ffaeff;">Action</span><span style="background:#100d0c;color:silver;">&lt;</span><span style="background:#100d0c;color:#e1b04a;">TContainedType</span><span style="background:#100d0c;color:silver;">&gt; </span></font><font size="1"><span style="background:#100d0c;color:#e1b04a;">actionPerform)
                   </span><span style="background:#100d0c;color:#8ac5ff;">where </span><span style="background:#100d0c;color:#e1b04a;">TBase : </span><span style="background:#100d0c;color:#ff6fb7;">IEnumerable </span></font><font size="1"><span style="background:#100d0c;color:#e1b04a;">{

        </span><span style="background:#100d0c;color:#8ac5ff;">return </span><span style="background:#100d0c;color:#e1b04a;">ForEachInner(baselineEnumerable</span><span style="background:#100d0c;color:silver;">.</span><span style="background:#100d0c;color:#e1b04a;">OfType</span><span style="background:#100d0c;color:silver;">&lt;</span><span style="background:#100d0c;color:#e1b04a;">TContainedType</span><span style="background:#100d0c;color:silver;">&gt;</span></font><span style="background:#100d0c;color:#e1b04a;"><font size="1">(), actionPerform);
    }

    </font></span><span style="background:#100d0c;color:#a0a0a0;"><font size="1">/// &lt;summary&gt;
    /// </font></span><span style="background:#100d0c;color:#80ff00;"><font size="1">The least restrictive case
    </font></span><font size="1"><span style="background:#100d0c;color:#a0a0a0;">/// &lt;/summary&gt;
    /// &lt;param name=</span><span style="background:#100d0c;color:#919191;">&quot;baseEnum&quot;</span><span style="background:#100d0c;color:#a0a0a0;">&gt;</span><span style="background:#100d0c;color:#80ff00;">The base enum.</span></font><font size="1"><span style="background:#100d0c;color:#a0a0a0;">&lt;/param&gt;
    /// &lt;param name=</span><span style="background:#100d0c;color:#919191;">&quot;actionPerform&quot;</span><span style="background:#100d0c;color:#a0a0a0;">&gt;</span><span style="background:#100d0c;color:#80ff00;">The action perform.</span></font><span style="background:#100d0c;color:#a0a0a0;"><font size="1">&lt;/param&gt;
    /// &lt;returns&gt;&lt;/returns&gt;
    /// </font></span><font size="1"><span style="background:#100d0c;color:#80ff00;">Documentation Created 7/20/2008
    </span><span style="background:#100d0c;color:#8ac5ff;">public static </span><span style="background:#100d0c;color:#ff6fb7;">IEnumerable</span><span style="background:#100d0c;color:silver;">&lt;</span><span style="background:#100d0c;color:#64b1ff;">Object</span><span style="background:#100d0c;color:silver;">&gt; </span><span style="background:#100d0c;color:#e1b04a;">ForEach(</span><span style="background:#100d0c;color:#8ac5ff;">this </span><span style="background:#100d0c;color:#ff6fb7;">IEnumerable </span><span style="background:#100d0c;color:#e1b04a;">baseEnum,                </span><span style="background:#100d0c;color:#ffaeff;">Action</span><span style="background:#100d0c;color:silver;">&lt;</span><span style="background:#100d0c;color:#64b1ff;">Object</span></font><span style="background:#100d0c;color:silver;"><font size="1">&gt;  </font></span><font size="1"><span style="background:#100d0c;color:#e1b04a;">actionPerform) {

        </span><span style="background:#100d0c;color:#8ac5ff;">return </span><span style="background:#100d0c;color:#e1b04a;">ForEachInner(baseEnum</span><span style="background:#100d0c;color:silver;">.</span><span style="background:#100d0c;color:#e1b04a;">OfType</span><span style="background:#100d0c;color:silver;">&lt;</span><span style="background:#100d0c;color:#64b1ff;">Object</span><span style="background:#100d0c;color:silver;">&gt;</span></font><span style="background:#100d0c;color:#e1b04a;"><font size="1">(), actionPerform);
    }

    </font></span><span style="background:#100d0c;color:#a0a0a0;"><font size="1">/// &lt;summary&gt;
    /// </font></span><span style="background:#100d0c;color:#80ff00;"><font size="1">Do the actual work
    </font></span><font size="1"><span style="background:#100d0c;color:#a0a0a0;">/// &lt;/summary&gt;
    /// &lt;typeparam name=</span><span style="background:#100d0c;color:#919191;">&quot;TContainedType&quot;</span><span style="background:#100d0c;color:#a0a0a0;">&gt;</span><span style="background:#100d0c;color:#80ff00;">The type of the contained type.</span></font><font size="1"><span style="background:#100d0c;color:#a0a0a0;">&lt;/typeparam&gt;
    /// &lt;param name=</span><span style="background:#100d0c;color:#919191;">&quot;baseEnum&quot;</span><span style="background:#100d0c;color:#a0a0a0;">&gt;</span><span style="background:#100d0c;color:#80ff00;">The base enum.</span></font><font size="1"><span style="background:#100d0c;color:#a0a0a0;">&lt;/param&gt;
    /// &lt;param name=</span><span style="background:#100d0c;color:#919191;">&quot;actionPerform&quot;</span><span style="background:#100d0c;color:#a0a0a0;">&gt;</span><span style="background:#100d0c;color:#80ff00;">The action perform.</span></font><span style="background:#100d0c;color:#a0a0a0;"><font size="1">&lt;/param&gt;
    /// &lt;returns&gt;&lt;/returns&gt;
    /// </font></span><font size="1"><span style="background:#100d0c;color:#80ff00;">Documentation Created 7/20/2008
    </span><span style="background:#100d0c;color:#8ac5ff;">private static </span><span style="background:#100d0c;color:#ff6fb7;">IEnumerable</span><span style="background:#100d0c;color:silver;">&lt;</span><span style="background:#100d0c;color:#e1b04a;">TContainedType</span><span style="background:#100d0c;color:silver;">&gt; </span><span style="background:#100d0c;color:#e1b04a;">ForEachInner</span><span style="background:#100d0c;color:silver;">&lt;</span><span style="background:#100d0c;color:#e1b04a;">TContainedType</span><span style="background:#100d0c;color:silver;">&gt;</span></font><font size="1"><span style="background:#100d0c;color:#e1b04a;">(
        </span><span style="background:#100d0c;color:#ff6fb7;">IEnumerable</span><span style="background:#100d0c;color:silver;">&lt;</span><span style="background:#100d0c;color:#e1b04a;">TContainedType</span><span style="background:#100d0c;color:silver;">&gt; </span></font><font size="1"><span style="background:#100d0c;color:#e1b04a;">baseEnum,
                       </span><span style="background:#100d0c;color:#ffaeff;">Action</span><span style="background:#100d0c;color:silver;">&lt;</span><span style="background:#100d0c;color:#e1b04a;">TContainedType</span><span style="background:#100d0c;color:silver;">&gt; </span></font><font size="1"><span style="background:#100d0c;color:#e1b04a;">actionPerform) {

        </span><span style="background:#100d0c;color:#8ac5ff;">var </span><span style="background:#100d0c;color:#e1b04a;">getEnumerate </span><span style="background:#100d0c;color:silver;">= </span><span style="background:#100d0c;color:#e1b04a;">baseEnum</span><span style="background:#100d0c;color:silver;">.</span></font><font size="1"><span style="background:#100d0c;color:#e1b04a;">ToList();
        getEnumerate</span><span style="background:#100d0c;color:silver;">.</span></font><font size="1"><span style="background:#100d0c;color:#e1b04a;">ForEach(actionPerform);

        </span><span style="background:#100d0c;color:#8ac5ff;">return </span></font><span style="background:#100d0c;color:#e1b04a;"><font size="1">getEnumerate;
    }</font></span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>&#160;</p>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>&#160;</p>
<p>Notice that anything which implements IEnumerable is caught above, regardless of what the collection.</p>
<p>&#160;</p>
<div style="float:none;display:inline;margin:0;padding:0;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:eb68bac9-98d9-4f88-a664-8c985a219755" class="wlWriterSmartContent">del.icio.us Tags: <a href="http://del.icio.us/popular/Advanced+C%23" rel="tag">Advanced C#</a>,<a href="http://del.icio.us/popular/C%23" rel="tag">C#</a>,<a href="http://del.icio.us/popular/C%23+3.0+for+Internal+DSL" rel="tag">C# 3.0 for Internal DSL</a>,<a href="http://del.icio.us/popular/Delegates" rel="tag">Delegates</a>,<a href="http://del.icio.us/popular/Functional+Programming" rel="tag">Functional Programming</a>,<a href="http://del.icio.us/popular/Lambada" rel="tag">Lambada</a>,<a href="http://del.icio.us/popular/linq" rel="tag">linq</a>,<a href="http://del.icio.us/popular/Visual+Studio+2008" rel="tag">Visual Studio 2008</a></div>
</p>
</p>
</p>
<p><div style="float:none;display:inline;margin:0;padding:0;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:1e50a19d-51fa-4053-b31f-4ed321648963" class="wlWriterSmartContent">Technorati Tags: <a href="http://technorati.com/tags/Advanced+C%23" rel="tag">Advanced C#</a>,<a href="http://technorati.com/tags/C%23" rel="tag">C#</a>,<a href="http://technorati.com/tags/C%23+3.0+for+Internal+DSL" rel="tag">C# 3.0 for Internal DSL</a>,<a href="http://technorati.com/tags/Delegates" rel="tag">Delegates</a>,<a href="http://technorati.com/tags/Functional+Programming" rel="tag">Functional Programming</a>,<a href="http://technorati.com/tags/Lambada" rel="tag">Lambada</a>,<a href="http://technorati.com/tags/linq" rel="tag">linq</a>,<a href="http://technorati.com/tags/Visual+Studio+2008" rel="tag">Visual Studio 2008</a></div>
</p>
<div class="wlWriterHeaderFooter" style="text-align:right;margin:0;padding:4px 0;"><a href="http://digg.com/submit?url=http%3a%2f%2fdcarr.wordpress.com%2f2008%2f05%2f22%2fadvanced-c-30-part-2-everyday-tasks-with-new-solutions%2f&amp;title=Advanced+C%23+3.0+%3a+Part+2+-+Everyday+Tasks+with+New+Solutions"><img src="http://digg.com/img/badges/100x20-digg-button.png" width="100" height="20" alt="Digg This" border="0" style="border:0;" /></a></div>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/dcarr.wordpress.com/232/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/dcarr.wordpress.com/232/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dcarr.wordpress.com/232/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dcarr.wordpress.com/232/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dcarr.wordpress.com/232/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dcarr.wordpress.com/232/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dcarr.wordpress.com/232/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dcarr.wordpress.com/232/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dcarr.wordpress.com/232/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dcarr.wordpress.com/232/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dcarr.wordpress.com/232/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dcarr.wordpress.com/232/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=232&subd=dcarr&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://team.pushbomb.com/2008/05/22/advanced-c-30-part-2-everyday-tasks-with-new-solutions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7b572cbcda5a17fe984e7dd1ddc9c3d6?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">pushbomb</media:title>
		</media:content>

		<media:content url="http://dcarr.files.wordpress.com/2008/05/image-0001-thumb.png" medium="image">
			<media:title type="html">Image-0001</media:title>
		</media:content>

		<media:content url="http://digg.com/img/badges/100x20-digg-button.png" medium="image">
			<media:title type="html">Digg This</media:title>
		</media:content>
	</item>
		<item>
		<title>Framework API Development Best Practices using C# 3.0</title>
		<link>http://team.pushbomb.com/2008/05/15/domain-driven-framework-development-c-net-35-extension-methods-lambada-empowerment/</link>
		<comments>http://team.pushbomb.com/2008/05/15/domain-driven-framework-development-c-net-35-extension-methods-lambada-empowerment/#comments</comments>
		<pubDate>Thu, 15 May 2008 21:24:52 +0000</pubDate>
		<dc:creator>Damon Wilder Carr</dc:creator>
				<category><![CDATA[C# 3.0 Enhancements]]></category>
		<category><![CDATA[C# 3.0 for Internal DSL]]></category>
		<category><![CDATA[ORM]]></category>
		<category><![CDATA[Software Design]]></category>
		<category><![CDATA[Software Factories]]></category>
		<category><![CDATA[Software Futures]]></category>
		<category><![CDATA[agile practices]]></category>
		<category><![CDATA[resharper]]></category>
		<category><![CDATA[.NET 3.5]]></category>
		<category><![CDATA[API Design]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Extension Methods]]></category>
		<category><![CDATA[Framework Design]]></category>
		<category><![CDATA[Generics]]></category>
		<category><![CDATA[Lambada]]></category>

		<guid isPermaLink="false">http://dcarr.wordpress.com/2008/05/15/domain-driven-framework-development-c-net-35-extension-methods-lambada-empowerment/</guid>
		<description><![CDATA[This content assumes you understand the basics of the new C# 3.0 language features in .NET 3.5. I use a 'pretend pair programming' approach with continued refactoring as this is how I would discuss it if you were coding with me.

I'll start with a fairly trivial, yet important example (I use it every day). Many times when comparing Strings I want to ignore case and culture (the InvariantCulture). This is provided by an overload as such as you likely know:<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=188&subd=dcarr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<h2 style="text-align:left;">PART 1</h2>
<p style="text-align:left;"><a href="http://dcarr.files.wordpress.com/2008/05/image31.png"><img class="alignright" style="border-width:0;margin:5px;" src="http://dcarr.files.wordpress.com/2008/05/image3-thumb.png?w=1024&#038;h=220" alt="image" height="220" /></a></p>
<p style="text-align:left;">This content assumes you have an introductory knowledge of C# 3.0 language features in .NET 3.5 and mastery of legacy C# 2.0 Generics, Generic Type Constraints, Anonymous Delegates and related material.</p>
<p>I use a &#8216;pair programming&#8217; approach with continued refactoring as this is how I would discuss it if you were coding with me, with an unfortunate one-way delivery.</p>
<h3 style="text-align:left;">The Brief Strategic View</h3>
<p style="text-align:left;">Microsoft has slowly been moving C# in a very productive direction (this is not new, as these features existed in 2.0 although not nearly as well integrated) to provide &#8216;Functional Language&#8217; features. If you don&#8217;t know or care about language semantics, just know that Linq and especially Lambada Expressions are about empowering you to use executable code like a variable, aka to leverage the power of functional programming. For more on this, read this <a href="http://msdn.microsoft.com/en-us/magazine/cc507636.aspx">MSDN article</a> by <a href="http://msdn.microsoft.com/en-us/magazine/cc301175.aspx">Joel Pobar (former CLR Team)</a> or read the next set of posts (part 2 onward) as I will go into the depths of this.</p>
<table style="text-align:left;height:153px;" border="1" cellspacing="0" cellpadding="2" width="399">
<tbody>
<tr>
<td width="543" valign="top">
<p align="center">I think of Lambadas as an incredibly focused and powerful domain specific language for delegates.</p>
<p>In this sense they are quite similar to Regular Expressions in that they are really good at their focus area.</p>
<p align="center">What do I mean by good?</p>
<ul>
<li>
<div>Terse yet Understandable / Maintainable</div>
</li>
<li>
<div>Syntax tailored to the need, not the other way around.</div>
</li>
<li>
<div>Highly effective for problems that are orders of magnitude more difficult without them (a simple 10% improvement would not cut it)</div>
</li>
</ul>
</td>
</tr>
</tbody>
</table>
<h2 style="text-align:left;">Painless Intro</h2>
<p style="text-align:left;">I&#8217;ll start with a fairly trivial, yet important example (I use it every day). Many times when comparing Strings I want to ignore case and culture (the InvariantCulture). This is provided by an overload as such as you likely know:</p>
<p>[Test,Category("BaselineCore")]<br />
public void shouldAsserStringCloneInvokeEqual() {</p>
<p>var baselineString = &#8220;This is a TEST CASE to IgnOrE Casing&#8221;;</p>
<p>var stringUpper = baselineString.ToUpperInvariant();</p>
<p>Assert.IsTrue(baselineString.Equals(stringUpper,<br />
StringComparison.InvariantCultureIgnoreCase));</p>
<p style="text-align:left;">The test results are shown above. Pass. Ok so I really like short, concise code that is understandable at a glance. Also it&#8217;s a pain to always (even with ReSharper) use this (and I have seen people use RegEx for this! RegEx is awesome but overkill for this issue).</p>
<p style="text-align:left;">Refactoring</p>
<ul style="text-align:left;">
<li>Create an extension method on String</li>
<li>Decide on a good name for the method (this is SO important and for most an afterthought!)</li>
</ul>
<p style="text-align:left;">I&#8217;ve settled on calling this new method on String &#8216;EqualsCore&#8217; as that is what we are doing, making the conditions for a match &#8217;simpler&#8217; and seeing &#8216;just the core values&#8217; are the same (anyway it makes sense to me)., I suppose this could be &#8216;EqualsRelaxed&#8217; or whatever..</p>
<p style="text-align:left;">Here is the test case (no code yet):</p>
<p>[Test, Category("BaselineCore")]<br />
public void shouldAsserStringsEqualUsingExtension() {<br />
var baselineString = &#8220;This is a TEST CASE to IgnOrE Casing&#8221;;<br />
Assert.IsTrue(baselineString. EqualsSimple(baselineString.ToUpperInvariant())); }</p>
<p style="text-align:left;">Now we write the code. Here is the container for the extension method:</p>
<p>public static class StringExtensions {</p>
<p>public static bool EqualsSimple(this string sTarget, string compare) {</p>
<p>return sTarget.Equals(compare, StringComparison.InvariantCultureIgnoreCase); }</p>
<p>}</p>
<p style="text-align:left;">Indeed they both pass:</p>
<p style="text-align:left;"><a href="http://dcarr.files.wordpress.com/2008/05/image25.png"><img class="alignright" style="float:right;border-width:0;" src="http://dcarr.files.wordpress.com/2008/05/image25-thumb.png?w=455&#038;h=255" alt="image25" width="455" height="255" align="left" /></a></p>
<p style="text-align:left;">
<p style="text-align:left;">
<p style="text-align:left;">
<p style="text-align:left;">
<p style="text-align:left;">
<p style="text-align:left;">Since every type inherits from Object, and Equals is defined on Object, all instances should support this approach, and I could be early bound by using Generics&#8230;. Hmm&#8230;</p>
<p style="text-align:left;">I tried this (note: I gave it a new new &#8216;EqualsThis&#8217; to separate them.</p>
<p>public static bool EqualsThis&lt;TTarget&gt;(this TTarget sTarget, TTarget compare){</p>
<p>return sTarget.Equals(compare);</p>
<p>}</p>
<p style="text-align:left;">Functionally not that interesting at all, but a test. So I typed in the following and wow&#8230; It works from Intellisense&#8217;s view&#8230; Ok it compiled! Wait&#8230;..FAIL! But why:?</p>
<p style="text-align:left;">OK here is the new test:</p>
<p>[Test, Category("BaselineCore")]</p>
<p>public void shouldAsserANYTHINGEqualUsingExtension() {</p>
<p>const String baselineString =&#8221;This is a TEST CASE to IgnOrE Casing&#8221;;</p>
<p>var sb = new StringBuilder(baselineString);</p>
<p>Assert.IsTrue(sb.EqualsThis(new StringBuilder(sb.ToString())));</p>
<p>}</p>
<p style="text-align:left;">
<p style="text-align:left;">Interesting&#8230;</p>
<p style="text-align:left;">Here is the documentation for what Equals means by default from Microsoft:</p>
<table style="text-align:left;" border="1" cellspacing="0" cellpadding="2" width="396">
<tbody>
<tr>
<td width="394" valign="top">
<p align="center">Returns: true if objA is the same instance as objB or if both are null references or if objA.Equals(objB) returns true; otherwise, false.</p>
</td>
</tr>
</tbody>
</table>
<p style="text-align:left;">So our code fails using the extension yet this returns true:</p>
<p>[Test] public void shouldAssertStringBuilderExplicit() {</p>
<p>const String baselineString = &#8220;This is a TEST CASE to IgnOrE Casing&#8221;;</p>
<p>var sb = new StringBuilder(baselineString);</p>
<p>var sb2 = new StringBuilder(baselineString); Assert.IsTrue(sb.Equals(sb2));</p>
<p>}</p>
<p style="text-align:left;">So Reflector to the rescue once again. I could see in Reflector what I believed the issue was. Indeed the StringBuilder class has an overloaded Equals, and even making the extension method cast to the generic type directly was a no go.</p>
<table style="text-align:left;" border="1" cellspacing="0" cellpadding="2" width="400">
<tbody>
<tr>
<td width="400" valign="top">
<p align="center">So what do you think? Why would this compile fine with absolutely no problems (and that is correct it turns out), but FAIL at runtime on the assertion when the same line above passes? Skip ahead and reply with the answer if you know it&#8230;.</p>
</td>
</tr>
</tbody>
</table>
<p style="text-align:left;">This exposes one of the dangers that we must be incredibly careful with. It has always been poor design in my opinion to encourage developers to override common methods such as ToString() and Equals(object X) with their own behaviors as you force consumers of the API to understand IMPLEMENTATION. You cannot ensure your OK simply from a contract. This is known to be evil&#8230;.</p>
<p style="text-align:left;">Of course this is a legacy style and will be slowly phased out.</p>
<p style="text-align:left;">Spin up reflector and look at the code for the OVERLOAD that StringBuilder has:</p>
<div style="text-align:left;">public bool Equals(StringBuilder sb){if (sb == null) return false;</p>
<p>return (((this.Capacity == sb.Capacity) &amp;&amp; (this.MaxCapacity == sb.MaxCapacity))<br />
&amp;&amp;<br />
this.m_StringValue.Equals((string) sb.m_StringValue));</p>
<p>}</p></div>
<div style="text-align:left;">
<p style="text-align:left;">Of course! How else could a StringBuilder claim to be &#8216;Equal&#8217; to another&#8230; In fact it is perfectly reasonable but again shows the danger of late binding, making assumptions about how any &#8216;object&#8217; type will perform.</p>
</div>
<div style="text-align:left;">
<p style="text-align:left;">So there was no real way for our extension to call the &#8216;correct&#8217; equals. It called the base definition given above which is obvious now why it failed.</p>
<p style="text-align:left;">
<p style="text-align:left;">So how do we fix this for the general case?</p>
<div style="text-align:left;">
<p style="text-align:left;">Here is the test case which I got working.. If your not familiar with this style of code,</p>
</div>
<div style="text-align:left;">This is the foundation we build layer after layer on and illustrates the core of this post.</div>
<p>[Test] public void shouldAsserANYTHINGEqualUsingExtension() {</p>
<p>const String baselineString = &#8220;This is a TEST CASE to IgnOrE Casing&#8221;;</p>
<p>var sb = new StringBuilder(baselineString);</p>
<p>var sb2 = new StringBuilder(baselineString);</p>
<p>Assert.IsTrue(sb.EqualsThis(x =&gt; x.Equals(sb2)));</p>
<p>}</p>
<table style="text-align:left;" border="1" cellspacing="0" cellpadding="2" width="438">
<tbody>
<tr>
<td width="436" valign="top">
<p align="center">Lambadas are like an incredibly focused and powerful domain specific language for delegates. In this sense they are quite similar to Regular Expressions in that they are really good (and to quantify good, I mean clear yet precise, not overly verbose yet highly effective for problems that are more difficult without them).</p>
</td>
</tr>
</tbody>
</table>
<div style="text-align:left;">So what about the implementation? Here it is:</div>
<p>public static bool EqualsThis&lt;TTarget&gt;(this TTarget sTarget,</p>
<p>Predicate&lt;TTarget&gt; EqualsDelegate) {</p>
<p>return EqualsDelegate.Invoke(sTarget);</p>
<p>}</p>
<div style="text-align:left;">It&#8217;s all about Expressions! Think of them as varied ways to receive executable code that you can &#8216;invoke&#8217; literally, that must meet the contract you define.</div>
<div style="text-align:left;">This is so basic after we cover what the really useful applications are. However remember this has nothing to do with the examples, only the concepts they represent.</div>
<h1 style="text-align:left;"></h1>
<table style="text-align:left;" border="1" cellspacing="0" cellpadding="2" width="632">
<tbody>
<tr>
<td width="400" valign="top">
<div></div>
<ol>
<li>Combine Generics and Generic Constraints to your Extension Methods but BE CAREFUL and ensure you are covered by unit tests</li>
<li>Try to always think a level of abstraction above where your immediate need is to see if your solution indeed has wider and perhaps far more valuable contribution.</li>
<li>Hide complexity behind your Framework API, and focus on crafting work that others will easily consume.</li>
</ol>
</td>
</tr>
</tbody>
</table>
</div>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/dcarr.wordpress.com/188/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/dcarr.wordpress.com/188/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dcarr.wordpress.com/188/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dcarr.wordpress.com/188/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dcarr.wordpress.com/188/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dcarr.wordpress.com/188/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dcarr.wordpress.com/188/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dcarr.wordpress.com/188/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dcarr.wordpress.com/188/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dcarr.wordpress.com/188/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dcarr.wordpress.com/188/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dcarr.wordpress.com/188/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=188&subd=dcarr&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://team.pushbomb.com/2008/05/15/domain-driven-framework-development-c-net-35-extension-methods-lambada-empowerment/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7b572cbcda5a17fe984e7dd1ddc9c3d6?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">pushbomb</media:title>
		</media:content>

		<media:content url="http://dcarr.files.wordpress.com/2008/05/image3-thumb.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://dcarr.files.wordpress.com/2008/05/image25-thumb.png" medium="image">
			<media:title type="html">image25</media:title>
		</media:content>
	</item>
		<item>
		<title>Daniel Cazzulino&#8217;s Blog : Statically-typed reflection with LINQ</title>
		<link>http://team.pushbomb.com/2008/05/08/daniel-cazzulinos-blog-statically-typed-reflection-with-linq/</link>
		<comments>http://team.pushbomb.com/2008/05/08/daniel-cazzulinos-blog-statically-typed-reflection-with-linq/#comments</comments>
		<pubDate>Thu, 08 May 2008 06:11:24 +0000</pubDate>
		<dc:creator>Damon Wilder Carr</dc:creator>
				<category><![CDATA[C# 3.0 Enhancements]]></category>
		<category><![CDATA[Software Design]]></category>
		<category><![CDATA[Software Futures]]></category>
		<category><![CDATA[reflection]]></category>
		<category><![CDATA[Advanced .NET]]></category>
		<category><![CDATA[C# 3.0 for Internal DSL]]></category>

		<guid isPermaLink="false">http://dcarr.wordpress.com/2008/05/08/daniel-cazzulinos-blog-statically-typed-reflection-with-linq/</guid>
		<description><![CDATA[With .NET 3.5 and C# 3.0 released now, it was time for an update. As part of the update, I also improved the API a little bit. Usage now is:
MethodInfo toString = Reflect.GetMethod(x =&#62; x.ToString());The renamed Reflect class receives the type you want to reflect as a generic parameter. Then you can use GetMethod, GetField or GetProperty.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=183&subd=dcarr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>To quote Daniel&#8230; : &#8220;Quite some time ago I posted about <a href="http://www.clariusconsulting.net/blogs/kzu/archive/2006/07/06/TypedReflection.aspx">how to use LINQ to provide a strong-typed reflection API</a>. I used a very old LINQ preview back then.</p>
<p>With <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=333325fd-ae52-4e35-b531-508d977d32a6&amp;displaylang=en">.NET 3.5 and C# 3.0 released</a> now, it was time for an update. As part of the update, I also improved the API a little bit. Usage now is:</p>
<pre style="text-align:center;"><strong>MethodInfo toString = Reflect&lt;object&gt;.GetMethod(x =&gt; x.ToString());</strong></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>The renamed <code>Reflect&lt;TTarget&gt;</code> class receives the type you want to reflect as a generic parameter. Then you can use <code>GetMethod</code>, <code>GetField</code> or <code>GetProperty</code>.</p>
<p>Other examples:</p>
<pre style="text-align:center;">MethodInfo clone = Reflect&lt;ICloneable&gt;.GetMethod(x =&gt; x.Clone());
PropertyInfo prop = Reflect&lt;AppDomain&gt;.GetProperty(x =&gt; x.BaseDirectory);
FieldInfo field = Reflect&lt;Mock&gt;.GetField(x =&gt; x.PublicField);</pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>Working principle is the same: the lambda you pass to the methods is actually an expression</p>
<p>which I analyze to retrieve the underlying reflection object that is already exposed by the LINQ Expression API. For example, once you get to a <a href="http://msdn2.microsoft.com/en-us/library/system.linq.expressions.methodcallexpression.aspx">MethodCallExpression</a>, you can get the method being called through its <a href="http://msdn2.microsoft.com/en-us/library/bb340973.aspx">Method</a> property:</p>
<pre style="text-align:center;">((MethodCallExpression)lambda.Body).Method;</pre>
<p>It&#8217;s interesting to see how this works actually, and what&#8217;s the compiler generating for those lambda expressions invoking methods.</p>
<p>In Reflector, the following C# code:</p>
<p>MethodInfo clone = Reflect&lt;ICloneable&gt;.GetMethod(x =&gt; x.Clone());</p>
<p>is decompiled as (indented for readability):</p>
<pre style="text-align:center;">ParameterExpression CS$0$0000;
MethodInfo clone = Reflect&lt;ICloneable&gt;.GetMethod(
Expression.Lambda&lt;Action&lt;ICloneable&gt;&gt;(Expression.Call(CS$0$0000 =
Expression.Parameter(typeof(ICloneable), "x"),
 (MethodInfo) methodof(ICloneable.Clone), new Expression[0] ),
new ParameterExpression[] { CS$0$0000 }  ));</pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>Note how the MethodInfo is retrieved directly from the interface by using a <code>methodof</code> operator. It&#8217;s not a valid C# keyword, but given that <a href="http://www.aisto.com/roeder/">Lutz Roeder</a> works for Microsoft (not on the C# team, though), let&#8217;s hope it will get eventually in the language :).</p>
<p>That <code>methodof</code> translation is actually the conversion from the following two IL lines:</p>
<pre style="text-align:center;">L_0017: ldtoken instance object [mscorlib]System.ICloneable::Clone()L_001c: call class
 [mscorlib]System.Reflection.MethodBase</pre>
<pre style="text-align:center;">[mscorlib]System.Reflection.MethodBase::GetMethodFromHandle(valuetype</pre>
<pre style="text-align:center;">[mscorlib]System.RuntimeMethodHandle)</pre>
<p><code>ldtoken</code> is the key there, let&#8217;s hope it gets promoted to C# in some way eventually.</p>
<p>Anyway, since I wrote my original article, I realized through <a href="http://www.ayende.com/Blog/Default.aspx">Ayende&#8217;s blog</a> that you can also do <a href="http://www.ayende.com/Blog/archive/2005/10/29/8176.aspx">static reflection without LINQ</a>. It only works for methods though, and you cannot use the lambda syntax because it results in method infos that are actually from a compiler-generated type (the one that contains the closures too if any).</p>
<p>As I&#8217;m so in love with the lambda syntax, I&#8217;ll keep my implementation based on expression trees instead of delegates.</p>
<p>It&#8217;s released now as part of <a href="http://www.codeplex.com/clarius">Clarius Labs</a> projects. <a href="https://www.codeplex.com/Release/ProjectReleases.aspx?ProjectName=clarius&amp;ReleaseId=9495">Get the source</a> and have fun!&#8221;</p>
<p><a href="http://www.clariusconsulting.net/blogs/kzu/archive/2007/12/30/49063.aspx">Daniel Cazzulino&#8217;s Blog : Statically-typed reflection with LINQ</a></p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/dcarr.wordpress.com/183/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/dcarr.wordpress.com/183/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dcarr.wordpress.com/183/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dcarr.wordpress.com/183/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dcarr.wordpress.com/183/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dcarr.wordpress.com/183/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dcarr.wordpress.com/183/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dcarr.wordpress.com/183/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dcarr.wordpress.com/183/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dcarr.wordpress.com/183/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dcarr.wordpress.com/183/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dcarr.wordpress.com/183/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=183&subd=dcarr&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://team.pushbomb.com/2008/05/08/daniel-cazzulinos-blog-statically-typed-reflection-with-linq/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7b572cbcda5a17fe984e7dd1ddc9c3d6?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">pushbomb</media:title>
		</media:content>
	</item>
		<item>
		<title>ReSharper 4.0 EAP Notes &#8211; JetBrains.net</title>
		<link>http://team.pushbomb.com/2008/05/01/resharper-40-eap-notes-jetbrainsnet/</link>
		<comments>http://team.pushbomb.com/2008/05/01/resharper-40-eap-notes-jetbrainsnet/#comments</comments>
		<pubDate>Thu, 01 May 2008 15:33:16 +0000</pubDate>
		<dc:creator>Damon Wilder Carr</dc:creator>
				<category><![CDATA[C# 3.0 for Internal DSL]]></category>
		<category><![CDATA[Framework Design]]></category>
		<category><![CDATA[Proof Driven Development]]></category>
		<category><![CDATA[Software Design]]></category>
		<category><![CDATA[Software Futures]]></category>
		<category><![CDATA[resharper]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[EAP]]></category>
		<category><![CDATA[ReSharper 4.0]]></category>

		<guid isPermaLink="false">http://dcarr.wordpress.com/2008/05/01/resharper-40-eap-notes-jetbrainsnet/</guid>
		<description><![CDATA[
 From ReSharper&#8217;s EAP Site
I&#8217;ve been using the 4.0 EAP (pre-beta) since the first preview and it&#8217;s awesome&#8230; Rocky at times, but I&#8217;ve never lost any code (however you should use at your own risk!).
There is something very comforting in auto-creating an anonymous delegate and having it convert automagically to lambata syntax&#8230;.
For example, here is [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=182&subd=dcarr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<blockquote>
<h3><span style="color:#ffffff;"> From ReSharper&#8217;s EAP Site</span></h3>
<p>I&#8217;ve been using the 4.0 EAP (pre-beta) since the first preview and it&#8217;s awesome&#8230; Rocky at times, but I&#8217;ve never lost any code (however you should use at your own risk!).</p>
<p>There is something very comforting in auto-creating an anonymous delegate and having it convert automagically to lambata syntax&#8230;.</p>
<p>For example, here is a step by step from a real code sample:</p>
<h4><a name="ReSharper4.0EAPNotes-C#3.0support">C# 3.0 support</a></h4>
<p><a name="ReSharper4.0EAPNotes-Implicitlytypedlocalsandarrays">Implicitly typed locals and arrays</a></p>
<p>Fully supported, including suggestions to omit explicit type specification, Introduce Variable refactoring and context actions to convert to implicit or explicit form.<br />
<img src="http://www.jetbrains.net/confluence/download/attachments/31721/release_notes_use_var.png" border="0" alt="" align="absmiddle" /></p>
<p><a name="ReSharper4.0EAPNotes-ExtensionMethodssupport">Extension Methods support</a></p>
<p>Fully supported, with Import Symbol completion (previously known as Type Name completion) after dot which can import suitable extension method and insert appropriate using directive. Analysis will suggest converting invocations from static-like to instance-like form. Context action can convert it back, and there are refactorings to convert static method of static class to Extension Method and update all call sites. There is also reverse refactoring, of course.</p>
<p><a name="ReSharper4.0EAPNotes-Objectandcollectioninitializers">Object and collection initializers</a></p>
<p>Fully supported, with suggestions and context actions to fold series of statements to collection or object to initializer, if possible.<br />
<img src="http://www.jetbrains.net/confluence/download/attachments/31721/release_notes_use_object_initializer.png" border="0" alt="" align="absmiddle" /><br />
ReSharper also provides smart intellisense features in such places, like completing settable properies or displaying correct parameter information for Add method used in collection initializer.<br />
<img src="http://www.jetbrains.net/confluence/download/attachments/31721/release_notes_completion_in_initializer.png" border="0" alt="" align="absmiddle" /></p>
<p><a name="ReSharper4.0EAPNotes-Automaticproperties">Automatic properties</a></p>
<p>Fully supported, with context actions to convert to property with backing field and back. Analysis can show properties which are candidates for conversion. Code generation features may suggest creating automatic property in addition to property with backing field, if appropriate.<br />
<img src="http://www.jetbrains.net/confluence/download/attachments/31721/release_notes_convert_to_autoproperty.png" border="0" alt="" align="absmiddle" /></p>
<p><a name="ReSharper4.0EAPNotes-Anonymoustypes">Anonymous types</a></p>
<p>Fully supported. ReSharper can search for similar anonymous types throughout the project or solution, give a name to anonymous type and replace usages, rename properties, suggest reordering properties if two anonymous types look similar and more.<br />
<img src="http://www.jetbrains.net/confluence/download/attachments/31721/release_notes_sync_anonymous_types.png" border="0" alt="" align="absmiddle" /></p>
<p><a name="ReSharper4.0EAPNotes-Lambdas">Lambdas</a></p>
<p>Partially supported. By partially, it means that not all features we want there are ready. The code shouldn&#8217;t be red and intellisense should be working, but some context actions, quickfixes, analysis and such may be missing. We are actively working on those features, so as time passes ReSharper will be more and more smart about lambdas. We have conversion actions like delegate to lambda and back and some suggestions. Note, that not all features of ReSharper are lambda-aware yet, so they may fail when they happen to operate on lambdas.<br />
<img src="http://www.jetbrains.net/confluence/download/attachments/31721/release_notes_convert_to_lambda.png" border="0" alt="" align="absmiddle" /></p>
<p><a name="ReSharper4.0EAPNotes-LINQ">LINQ</a></p>
<p>Almost supported. We import appropriate extension methods, provide intellisense, a number quickfixes, our refactorings are aware of queries. We also provide special live templates.</p>
<p><a name="ReSharper4.0EAPNotes-Partialmethods">Partial methods</a></p>
<p>Not supported.</p>
<p><a name="ReSharper4.0EAPNotes-Newandupdatedfeatures">New and updated features</a></p>
<p><a name="ReSharper4.0EAPNotes-GotoType,File,SymbolandFindResults">Go to Type, File, Symbol and Find Results</a></p>
<p>You can now put results of &#8220;Go to&#8221; features to find results for browsing<br />
<img src="http://www.jetbrains.net/confluence/download/attachments/31721/GotoByNameResults.png" border="0" alt="" width="488" height="415" align="absmiddle" /></p>
<p><a name="ReSharper4.0EAPNotes-ExternalAnnotations">External Annotations</a></p>
<p>Ability to annotate external (non-source) symbols with ReSharper-specific attributes, like CanBeNull and NotNull. Note, that we standardized attribute names for better interoperability and less configuration hassle, so you may need to refactor you code a bit if you use these attributes.</p>
<p><a name="ReSharper4.0EAPNotes-CodeCleanup">Code Cleanup</a></p>
<p>Successor of Reformat Code, Optimize Usings and other code cleaning features &#8211; all in one interface with many more modules. Includes things like processing readonly fields, removing redundancies, updating file header, converting to automatic properties, replacing explicit types with vars and more. All in batch mode, so that you can instantly clean the whole project or even solution.<br />
<img src="http://www.jetbrains.net/confluence/download/attachments/31721/release_notes_code_cleanup.png" border="0" alt="" align="absmiddle" /></p>
<p><a name="ReSharper4.0EAPNotes-Plentyofnewanalyses">Plenty of new analyses</a></p>
<p>We added many more inspections in ReSharper 4. Some of them are related to C# 3.0 and deal with new language constructs. Also, there are new structure-related inspections, like &#8220;if&#8221; statement analysis, anonymous method closure analysis, and more. We also added new severity level for analysis results &#8211; Hint &#8211; which is a lot less intrusive. It does not participate in next/previous highlight navigation and is not shown on error stripe. It simply tells you: &#8220;Pssst! Take a look here, it can make your code look better.&#8221;</p>
<p><a name="ReSharper4.0EAPNotes-CompleteStatement">Complete Statement</a></p>
<p>Also known as Smart Enter, it inserts required syntax elements to complete the code you are writing. It can close parentheses as needed, add semicolon, complete constructs such as if, while, for and so on.</p>
<p><a name="ReSharper4.0EAPNotes-CompletionwithCamelHumps">Completion with CamelHumps</a></p>
<p>All kinds of code completion (Symbol completion, Import Symbol Completion and Smart Completion) now supports filtering by CamelHumps, which tremendously speeds things up. E.g. if you know you have D<em>efaultCodeCompletionManager</em> type somewhere you just type <em>DCCM</em> and invoke Import symbol completion. Full type name will be inserted and using directive will be added as needed.</p>
<p><a name="ReSharper4.0EAPNotes-Refactorings">Refactorings</a></p>
<p>There are new refactorings related to C# 3.0 features, like &#8220;Convert Property to Automatic Property&#8221; and back, &#8220;Convert Static Method to Extension Method&#8221; and back and &#8220;Name Anonymous Type&#8221;. &#8220;Introduce Variable&#8221; is now dialogless and this improves coding flow a lot! Another great new refactoring is &#8220;Inline Method&#8221;, which can replace method call with method body at specific point or all over your code. &#8220;Method to Indexer&#8221; is a nice addition to &#8220;Method to Property&#8221; refactoring. There are also improvements in almost all refactorings, both in usability and smartness.</p>
<p><a name="ReSharper4.0EAPNotes-RecentEdits">Recent Edits</a></p>
<p>In addition to Recent Files we created Recent Edits feature, which shows what you&#8217;ve been changing recently. If appropriate, it displays type and member the change occured in.<br />
<img src="http://www.jetbrains.net/confluence/download/attachments/31721/RecentEdits.png" border="0" alt="" width="495" height="175" align="absmiddle" /></p>
<p><a name="ReSharper4.0EAPNotes-Todoitemsonidentifiersandstringliterals">To-do items on identifiers and string literals</a></p>
<p>You can now configure ReSharper to search for specific patterns not only in comments, but also in string literals and identifiers. It is quite useful to set NotImplementedException pattern to have a quick access to code you have to write.<br />
<img src="http://www.jetbrains.net/confluence/download/attachments/31721/ToDoIdentifiers.png" border="0" alt="" align="absmiddle" /></p>
<p><a name="ReSharper4.0EAPNotes-Supportforsolutionsusingdifferenttargets">Support for solutions using different targets</a></p>
<p>ReSharper now fully supports solutions where different projects use different versions of CLR like .NET Compact Framework or Silverlight. You can now have e.g. Smart Device projects and normal projects in the same solution and all ReSharper features will work perfectly fine in this scenario.</p>
<p><a name="ReSharper4.0EAPNotes-ProjectReferences">Project References</a></p>
<p>This is more like preview of the feature which may or may not come into final bits of ReSharper 4. It can show dependencies between projects and libraries in terms of assembly references.</p>
<p><a name="ReSharper4.0EAPNotes-LiveTemplatesEditor">Live Templates Editor</a></p>
<p>We are improving usability of Live Templates editor and currently it is large work in progress. Be careful with it if you use custom templates.</p>
<p><a name="ReSharper4.0EAPNotes-Easiercreationofnewfoldersthroughgenerate(AltInsertshortcut)">Easier creation of new folders through generate (Alt+Insert shortcut)</a></p>
<p><img src="http://www.jetbrains.net/confluence/download/attachments/31721/release_notes_new_folder.png" border="0" alt="" align="absmiddle" /></p>
<p><a name="ReSharper4.0EAPNotes-Dozensofotherfeatures">Dozens of other features</a></p>
<p>We also have dozens of other minor features, keep track of</p>
<p><a href="http://www.jetbrains.net/jira/secure/IssueNavigator.jspa?reset=true&amp;&amp;type=2&amp;pid=10241&amp;resolution=1&amp;fixfor=11304&amp;sorter/field=issuekey&amp;sorter/order=DESC">this tracker query<sup><img src="http://www.jetbrains.net/confluence/images/icons/linkext7.gif" border="0" alt="" width="7" height="7" align="absmiddle" /></sup></a> for the current list.</p></blockquote>
<p><a href="http://www.jetbrains.net/confluence/display/ReSharper/ReSharper+4.0+EAP+Notes">ReSharper 4.0 EAP Notes &#8211; JetBrains.net</a></p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/dcarr.wordpress.com/182/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/dcarr.wordpress.com/182/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dcarr.wordpress.com/182/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dcarr.wordpress.com/182/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dcarr.wordpress.com/182/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dcarr.wordpress.com/182/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dcarr.wordpress.com/182/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dcarr.wordpress.com/182/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dcarr.wordpress.com/182/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dcarr.wordpress.com/182/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dcarr.wordpress.com/182/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dcarr.wordpress.com/182/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=182&subd=dcarr&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://team.pushbomb.com/2008/05/01/resharper-40-eap-notes-jetbrainsnet/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7b572cbcda5a17fe984e7dd1ddc9c3d6?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">pushbomb</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.net/confluence/download/attachments/31721/release_notes_use_var.png" medium="image" />

		<media:content url="http://www.jetbrains.net/confluence/download/attachments/31721/release_notes_use_object_initializer.png" medium="image" />

		<media:content url="http://www.jetbrains.net/confluence/download/attachments/31721/release_notes_completion_in_initializer.png" medium="image" />

		<media:content url="http://www.jetbrains.net/confluence/download/attachments/31721/release_notes_convert_to_autoproperty.png" medium="image" />

		<media:content url="http://www.jetbrains.net/confluence/download/attachments/31721/release_notes_sync_anonymous_types.png" medium="image" />

		<media:content url="http://www.jetbrains.net/confluence/download/attachments/31721/release_notes_convert_to_lambda.png" medium="image" />

		<media:content url="http://www.jetbrains.net/confluence/download/attachments/31721/GotoByNameResults.png" medium="image" />

		<media:content url="http://www.jetbrains.net/confluence/download/attachments/31721/release_notes_code_cleanup.png" medium="image" />

		<media:content url="http://www.jetbrains.net/confluence/download/attachments/31721/RecentEdits.png" medium="image" />

		<media:content url="http://www.jetbrains.net/confluence/download/attachments/31721/ToDoIdentifiers.png" medium="image" />

		<media:content url="http://www.jetbrains.net/confluence/download/attachments/31721/release_notes_new_folder.png" medium="image" />

		<media:content url="http://www.jetbrains.net/confluence/images/icons/linkext7.gif" medium="image" />
	</item>
		<item>
		<title>Software as a Service and Service Oriented Architecture &#8211; Why they fail to meet the hype in execution</title>
		<link>http://team.pushbomb.com/2007/10/01/software-as-a-service-its-all-about-the-words/</link>
		<comments>http://team.pushbomb.com/2007/10/01/software-as-a-service-its-all-about-the-words/#comments</comments>
		<pubDate>Mon, 01 Oct 2007 02:30:00 +0000</pubDate>
		<dc:creator>Damon Wilder Carr</dc:creator>
				<category><![CDATA[C# 3.0 for Internal DSL]]></category>
		<category><![CDATA[Framework Design]]></category>
		<category><![CDATA[Proof Driven Development]]></category>
		<category><![CDATA[Software Design]]></category>
		<category><![CDATA[Software Factories]]></category>
		<category><![CDATA[Software Futures]]></category>
		<category><![CDATA[agile practices]]></category>
		<category><![CDATA[.NET Web Services]]></category>
		<category><![CDATA[Communication Foundation]]></category>
		<category><![CDATA[Domain Model]]></category>
		<category><![CDATA[Entity Model]]></category>
		<category><![CDATA[Evolution of Software]]></category>
		<category><![CDATA[Philosophy]]></category>
		<category><![CDATA[SaaS]]></category>
		<category><![CDATA[Semantics]]></category>
		<category><![CDATA[Service Oriented Architecture]]></category>
		<category><![CDATA[SOA]]></category>
		<category><![CDATA[Softwre as a Service]]></category>
		<category><![CDATA[WCF]]></category>

		<guid isPermaLink="false">http://dcarr.wordpress.com/2007/10/01/software-as-a-service-its-all-about-the-words/</guid>
		<description><![CDATA[The hype factor has done it again. We are all left starting at each other for just what in the world we all mean by SOA. ENOUGH! It's not that hard, and consultants, (myself being one so I will not be overly critical), vendors, the media, etc. have DESTROYED yet again any meaning in language. N-Tier, Message Bus, etc. etc. it goes back 20 years! The pattern never ends..<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=90&subd=dcarr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>The hype factor has done it again. We are all left starting at each other for just what in the world we all mean by SOA. ENOUGH! It&#8217;s not that hard, and consultants, (myself being one so I will not be overly critical), vendors, the media, etc. have DESTROYED yet again any meaning in language. N-Tier, Message Bus, etc. etc. it goes back 20 years! The pattern never ends..</p>
<p>Not to be a terrible bore, but brush up on your <a href="http://en.wikipedia.org/wiki/Ludwig_Wittgenstein">Wittgenstein</a> lately?! Ok don&#8217;t go that far just yet&#8230;(grin).</p>
<p> First, a <a href="http://en.wikipedia.org/wiki/Pattern_language">Pattern Language</a> (P.L.) is not some academic concept, although many would like you to believe that.</p>
<p> </p>
<div>
<table border="0" cellspacing="0" cellpadding="2" width="262" align="right">
<tbody>
<tr>
<td width="77" align="right" valign="top"><a title="pdf-icon" href="http://www.flickr.com/photos/93223205@N00/1468114276/"><img src="http://static.flickr.com/1150/1468114276_f1d15541e6.jpg" border="0" alt="pdf-icon" width="31" height="31" /></a></td>
<td width="183" align="right" valign="top"><a href="http://www.agilefactor.com/SaasPatternLanguage.pdf">&#8216;Software as a Service &#8211; The Pattern Language Approach&#8217;</a></td>
</tr>
<tr>
<td width="77" align="right" valign="top"><a title="ie-icon" href="http://www.flickr.com/photos/93223205@N00/1468122752/"><img src="http://static.flickr.com/1196/1468122752_7267762646.jpg" border="0" alt="ie-icon" width="31" height="32" /></a></td>
<td width="183" align="right" valign="top"><a href="http://www.agilefactor.com/SaasPatternLanguage_files/fullscreen.htm#slide0001.htm">&#8216;Software as a Service &#8211; The Pattern Language Approach&#8217;</a></td>
</tr>
<tr>
<td width="77" align="right" valign="top"><a title="icon-set2-firefox" href="http://www.flickr.com/photos/93223205@N00/1468130216/"><img src="http://static.flickr.com/1259/1468130216_a701773dab.jpg" border="0" alt="icon-set2-firefox" width="31" height="31" /></a></td>
<td width="183" align="right" valign="top"><a href="http://www.agilefactor.com/SaasPatternLanguage.htm">&#8216;Software as a Service &#8211; The Pattern Language Approach&#8217;</a></td>
</tr>
</tbody>
</table>
</div>
<p><a title="SaaS" href="http://www.flickr.com/photos/93223205@N00/1465323619/"></a></p>
<p>NOTE: I take issue with the word design below&#8230; It should be far more broad in most cases, but it often gets boxed into the design aspect of a problem. I would say &#8216;best practices&#8217; which brings up its own semantic mess&#8230;</p>
<blockquote>
<p style="text-align:left;">A pattern language is a structured method of describing [best] good design practices within a field of expertise. It is characterized by</p>
<ol>
<li>Noticing and naming the common problems [and positively executed solutions proven over time] in a field of interest [domain in my words]</li>
<li>Describing the key characteristics of effective solutions for meeting [one or more] some stated goal[s], [Often patterns are combined and are multi-faceted]</li>
<li>Helping the designer [domain stakeholder] move from problem to problem [and challenge to challenge] in a logical way, [in an attempt to reduce and even eliminate ambiguity] and allowing for many different paths through the design process.</li>
</ol>
<p>- Wikipedia </p></blockquote>
<ol>
<li>This ties in perfectly with my claim that complex software engineering is a &#8216;wicked problem&#8217;. If you disagree then you can stop reading, as none of my assumptions will work. However, I would love to hear your arguments since only around 20-30% of all software projects &#8217;succeed&#8217;&#8230;. There is no doubt there is dreadful crisis which I know you know about so enough said.</li>
</ol>
<p>If the fundamental issue here is NOT that people cannot/will not see software engineering for what it is, then what?!</p>
<p><a href="http://en.wikipedia.org/wiki/Wicked_problems">Wicked Problem</a></p>
<p>FYI: This is also why your pretty much nuts to not be Agile at this point, with some critical exceptions.</p>
<p>OK just to get you started chew on these 10 basic characteristics and tell me how any of them and the failure of senior stakeholders to understand that indeed software fits these characteristics is likely a key systemic disaster which we see and live every day in this industry.<a href="http://damon.agilefactor.com/software-is-a-wicked-problem-2/"> Click here for more.</a></p>
<p> Before I was able to &#8216;take this deck on the road&#8217; which I have done now with success (and why I am revisiting this post to offer insights), I had to get the audience (I hate to call them that&#8230; The collaborators is better) knowing (for example) that SOA was not a damn bunch of web services! I had to get people understanding exactly how distributed objects and components ARE NOT THE SAME but are similar. etc. etc.</p>
<p>That ASMX pages in .NET are not even close to what you want to be doing, even with WSE 3.0 and &#8216;Contract First&#8217; techniques (most notably the WSCF add-in from the always amazing <a href="http://www.thinktecture.com/">thinktecture</a>).</p>
<blockquote><p>There is nothing more necessary than truth, and in comparison with it everything else has only secondary value.<br />
This absolute will to truth: what is it? Is it the will to not allow ourselves to be deceived? Is it the will not to deceive?<br />
One does not want to be deceived, under the supposition that it is injurious, dangerous, or fatal to be deceived.</p>
<p>Friedrich Nietzsche, 1890</p></blockquote>
<p>Thanks Herr Nietzsche&#8230; None of us want that. So &#8220;Listen for the speakers intended meaning, not your perceived definition&#8221;.</p>
<p>In this rather philosophical vein, I offer you here an attempt at the beginnings of a unified P.L. covering many best practices we have evolved in the SOA/SaaS space.</p>
<p>As stated, this presentation is born from necessity as it has become almost impossible to have a meaningful conversation on many topics in this domain due to &#8216;definition overloading&#8217;.</p>
<p>This presentation not only attacks that issue, it also brings together into a cohesive pattern language Object Orientation, Distributed Objects, Components and Services while being careful to not make overly broad generalizations that would harm any SaaS initiative.</p>
<p>For example, it is a best practice to evolve a Domain Driven API which is (at a minimum) the core APU which your services will use to fulfil their contracts.</p>
<p>The presentation is here and feedback is encouraged. This also assumes you have embraced either the SCA environment (for Java development) or WCF for .NET. These are (in our guidance to clients) the only relevant implementation frameworks for strategic large scale organizational transformations to SaaS.</p>
<p>Otherwise in real-world terms there are not resources (developers, or the dramatically increased effort with very little benefit) available to support other approaches. Many &#8216;purists to the extreme&#8217; might attempt a hand-crafted &#8216;build it all over again&#8217; approach with hand-crafted contracts (typically XSDs).</p>
<p>As these environments support full extensibility, indeed it is incredibly rare that one of these environments will not completely address your needs. Of course there are always exceptions, but this is addresses to 95% of the market.</p>
<p>Due to the immaturity of this space, it is alarming how many companies believe they are not part of that 95%!! Typically they are being driven by parties (internal or external) that have motivations not in line with the business drivers.</p>
<p> </p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/dcarr.wordpress.com/90/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/dcarr.wordpress.com/90/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dcarr.wordpress.com/90/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dcarr.wordpress.com/90/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dcarr.wordpress.com/90/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dcarr.wordpress.com/90/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dcarr.wordpress.com/90/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dcarr.wordpress.com/90/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dcarr.wordpress.com/90/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dcarr.wordpress.com/90/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dcarr.wordpress.com/90/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dcarr.wordpress.com/90/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=90&subd=dcarr&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://team.pushbomb.com/2007/10/01/software-as-a-service-its-all-about-the-words/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7b572cbcda5a17fe984e7dd1ddc9c3d6?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">pushbomb</media:title>
		</media:content>

		<media:content url="http://static.flickr.com/1150/1468114276_f1d15541e6.jpg" medium="image">
			<media:title type="html">pdf-icon</media:title>
		</media:content>

		<media:content url="http://static.flickr.com/1196/1468122752_7267762646.jpg" medium="image">
			<media:title type="html">ie-icon</media:title>
		</media:content>

		<media:content url="http://static.flickr.com/1259/1468130216_a701773dab.jpg" medium="image">
			<media:title type="html">icon-set2-firefox</media:title>
		</media:content>
	</item>
	</channel>
</rss>