<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://weblogs.asp.net/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Omer van Kloeten's .NET Zen : Orcas</title><link>http://weblogs.asp.net/okloeten/archive/tags/Orcas/default.aspx</link><description>Tags: Orcas</description><dc:language>en</dc:language><generator>CommunityServer 2007 SP1 (Build: 20510.895)</generator><item><title>Expression trees' ConstantExpression values</title><link>http://weblogs.asp.net/okloeten/archive/2007/10/03/4327290.aspx</link><pubDate>Thu, 04 Oct 2007 00:25:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:4327290</guid><dc:creator>Omer van Kloeten</dc:creator><author>Omer van Kloeten</author><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/okloeten/rsscomments.aspx?PostID=4327290</wfw:commentRss><comments>http://weblogs.asp.net/okloeten/archive/2007/10/03/4327290.aspx#comments</comments><description>&lt;p&gt;After reading &lt;a href="http://themechanicalbride.blogspot.com/" mce_href="http://themechanicalbride.blogspot.com/" target="_blank"&gt;Jafar Husain&lt;/a&gt;'s posts (&lt;a href="http://themechanicalbride.blogspot.com/2007/03/symbols-on-steroids-in-c.html" mce_href="http://themechanicalbride.blogspot.com/2007/03/symbols-on-steroids-in-c.html" target="_blank"&gt;1&lt;/a&gt;, &lt;a href="http://themechanicalbride.blogspot.com/2007/03/symbols-in-c-30-reloaded.html" mce_href="http://themechanicalbride.blogspot.com/2007/03/symbols-in-c-30-reloaded.html" target="_blank"&gt;2&lt;/a&gt; and &lt;a href="http://blogs.microsoft.co.il/blogs/dorony/archive/2007/08/31/WPF-Binding_2C00_-INotifyPropertyChanged-and-Linq.aspx" mce_href="http://blogs.microsoft.co.il/blogs/dorony/archive/2007/08/31/WPF-Binding_2C00_-INotifyPropertyChanged-and-Linq.aspx" target="_blank"&gt;bonus&lt;/a&gt; by Doron Yaacoby), I started thinking about being able to strong type names using the &lt;code&gt;Expression&lt;/code&gt; classes.&lt;/p&gt; &lt;p&gt;One of the things I came up with is creating a tracing framework where &lt;code&gt;Expression&lt;/code&gt; is passed, instead of strings or other untyped methods.&lt;/p&gt;&lt;pre&gt;&lt;code&gt;[Conditional("&lt;span style="color: rgb(139, 0, 0);"&gt;DEBUG&lt;/span&gt;")]&lt;br&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;static&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;void&lt;/span&gt; TraceStart&amp;lt;T, R&amp;gt;(&lt;br&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;this&lt;/span&gt; T me, Expression&amp;lt;Func&amp;lt;T, R&amp;gt;&amp;gt; where) {&lt;br&gt;    &lt;span style="color: rgb(0, 128, 0);"&gt;// ...&lt;/span&gt;&lt;br&gt;}&lt;br&gt;&lt;br&gt;[Conditional("&lt;span style="color: rgb(139, 0, 0);"&gt;DEBUG&lt;/span&gt;")]&lt;br&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;static&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;void&lt;/span&gt; TraceEnd&amp;lt;T, R&amp;gt;(&lt;br&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;this&lt;/span&gt; T me, Expression&amp;lt;Func&amp;lt;T, R&amp;gt;&amp;gt; where, R returnValue) {&lt;br&gt;    &lt;span style="color: rgb(0, 128, 0);"&gt;// ...&lt;/span&gt;&lt;br&gt;}&lt;br&gt;&lt;br&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;class&lt;/span&gt; Foo&lt;br&gt;{&lt;br&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;bool&lt;/span&gt; Bar(&lt;span style="color: rgb(0, 0, 255);"&gt;int&lt;/span&gt; param)&lt;br&gt;    {&lt;br&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;this&lt;/span&gt;.TraceStart(o =&amp;gt; o.Bar(param));&lt;br&gt;&lt;br&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;this&lt;/span&gt;.TraceEnd(o =&amp;gt; o.Bar(param), &lt;span style="color: rgb(0, 0, 255);"&gt;false&lt;/span&gt;);&lt;br&gt;&lt;br&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;return&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;false&lt;/span&gt;;&lt;br&gt;    }&lt;br&gt;}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Since the &lt;code&gt;TraceStart&lt;/code&gt; and &lt;code&gt;TraceEnd&lt;/code&gt; methods are decorated with a &lt;code&gt;ConditionalAttribute&lt;/code&gt;, the &lt;code&gt;Expression&lt;/code&gt; objects will not even be created (since the calls will not be made).&lt;/p&gt;
&lt;p&gt;Nice idea, but the overhead during debugging might just be too much.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Here's where the interesting bit comes in: While I was fiddling with the idea, I tried to print the value of param, by reaching the expression tree's &lt;code&gt;ConstantExpression&lt;/code&gt; for it. However, the type in the expression's &lt;code&gt;Value&lt;/code&gt; property was of a type named: &lt;code&gt;&lt;b&gt;Namespace.Foo+&amp;lt;&amp;gt;c__DisplayClass0&lt;/b&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;OK, so where do I get the value from? Apparently, &lt;code&gt;&lt;b&gt;Namespace.Foo+&amp;lt;&amp;gt;c__DisplayClass0&lt;/b&gt;&lt;/code&gt; has a public field named &lt;code&gt;value&lt;/code&gt;. That's where. Oh, but wait. You can't get it - since it's a field, you can't get it using polymorphism, but even if it was a property, &lt;code&gt;&lt;b&gt;Namespace.Foo+&amp;lt;&amp;gt;c__DisplayClass0&lt;/b&gt;&lt;/code&gt; doesn't inherit or implement anything.&lt;/p&gt;
&lt;p&gt;Resorting to reflection seems like a terrible solution. I just hope that this will change until C# 3.0 RTMs.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=4327290" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/okloeten/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/okloeten/archive/tags/Orcas/default.aspx">Orcas</category></item><item><title>Extension Methods and Trust</title><link>http://weblogs.asp.net/okloeten/archive/2007/04/14/2239689.aspx</link><pubDate>Sat, 14 Apr 2007 18:52:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:2239689</guid><dc:creator>Omer van Kloeten</dc:creator><author>Omer van Kloeten</author><slash:comments>10</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/okloeten/rsscomments.aspx?PostID=2239689</wfw:commentRss><comments>http://weblogs.asp.net/okloeten/archive/2007/04/14/2239689.aspx#comments</comments><description>&lt;p&gt;As much as&amp;nbsp;I &lt;a href="http://weblogs.asp.net/okloeten/archive/2007/04/12/2222019.aspx" target="_blank"&gt;love the idea behind extension methods&lt;/a&gt;, I can't help but start to think about how it could be used for malicious purposes.&lt;/p&gt; &lt;p&gt;Take this scenario:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;You're a disgruntled employee of Evil Inc., the makers of the well known library VeryUsefulAssemblies.NET.  &lt;li&gt;I'm a developer at Good &amp;amp; co.,&amp;nbsp;using your &lt;code&gt;Tree&amp;lt;T&amp;gt;&lt;/code&gt; class in an assembly called Evil.UsefulAssembly.  &lt;li&gt;Before quitting your job, you decide to add an extension method, &lt;code&gt;System.String.Format(params object[] args)&lt;/code&gt;, that sends sensitive information back to you and then calls &lt;code&gt;System.String.Format(string format, params object[] args)&lt;/code&gt; so no one notices.  &lt;li&gt;&lt;strong&gt;I have now unwillingly compromised all of my clients and could never know it&lt;/strong&gt;, unless I manually check my IL or use a sniffer.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;But wait! There's more:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;A fellow developer in my company, Norman I. Huntington, decides to write his own &lt;code&gt;Tree&amp;lt;T&amp;gt;&lt;/code&gt; and replace all of the references to your &lt;font face="Courier New"&gt;Tree&amp;lt;T&amp;gt;&lt;/font&gt;, but he forgets to remove the reference to your assembly.  &lt;li&gt;Now &lt;strong&gt;my application &lt;u&gt;doesn't even use your assembly&lt;/u&gt;, but is still hijacked!&lt;/strong&gt;&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;Problem? I think so.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=2239689" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/okloeten/archive/tags/Karma/default.aspx">Karma</category><category domain="http://weblogs.asp.net/okloeten/archive/tags/2+_5B21_s/default.aspx">2 ⅛s</category><category domain="http://weblogs.asp.net/okloeten/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/okloeten/archive/tags/Orcas/default.aspx">Orcas</category></item><item><title>Generic Windows Forms Controls</title><link>http://weblogs.asp.net/okloeten/archive/2007/03/08/1968596.aspx</link><pubDate>Thu, 08 Mar 2007 22:13:47 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:1968596</guid><dc:creator>Omer van Kloeten</dc:creator><author>Omer van Kloeten</author><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/okloeten/rsscomments.aspx?PostID=1968596</wfw:commentRss><comments>http://weblogs.asp.net/okloeten/archive/2007/03/08/1968596.aspx#comments</comments><description>&lt;p&gt;Today I discovered that the Windows Forms Designer in Visual Studio 2005 doesn't know how to handle generics. For instance, the following example:&lt;/p&gt;&lt;pre&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; MyControl&amp;lt;T&amp;gt; : System.Windows.Forms.Control
{
}&lt;/pre&gt;
&lt;p&gt;could not be dropped in a Windows Forms designer (more on that in a little bit). If you go and decide to be a smart ass (like I usually am) and cheat the designer, you could drop a &lt;code&gt;Panel&lt;/code&gt; (or any other control and manually edit the code in the &lt;code&gt;InitializeComponent&lt;/code&gt; method and the &lt;code&gt;Form.Designer.cs&lt;/code&gt; file to the class you want like so:&lt;pre&gt;#region Windows Form Designer generated code

&lt;span style="color: #808080"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
&lt;span style="color: #808080"&gt;/// Required method for Designer support - do not modify&lt;/span&gt;
&lt;span style="color: #808080"&gt;/// the contents of this method with the code editor.&lt;/span&gt;
&lt;span style="color: #808080"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; InitializeComponent()
{
    &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.panel1 = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; MyControl&amp;lt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&amp;gt;();

    &lt;span style="color: #008000"&gt;// ...&lt;/span&gt;
}

#endregion

&lt;span style="color: #0000ff"&gt;private&lt;/span&gt; MyControl&amp;lt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&amp;gt; panel1;
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;This would throw the designer into a hissy fit:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/okloeten/WindowsLiveWriter/GenericWindowsFormsControls_0/vserror%5B18%5D.png" atomicselection="true"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="216" src="http://weblogs.asp.net/blogs/okloeten/WindowsLiveWriter/GenericWindowsFormsControls_0/vserror_thumb%5B11%5D.png" width="523" border="0"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The solution? Here are my suggestions for the VS Team:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Dropping a generic control&lt;/strong&gt; - My suggestion is that when a generic control is dropped, each type parameter will have a default value (can be decided on by using attributes, much like the &lt;code&gt;DefaultValueAttribute&lt;/code&gt;) and will be editable in the property grid with a specialized designer. 
&lt;li&gt;&lt;strong&gt;Having a generic control on a Form&lt;/strong&gt;&amp;nbsp;- It's a bug and should be fixed. I know for certain that I am not the &lt;a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=396762&amp;amp;SiteID=1" target="_blank"&gt;first&lt;/a&gt; &lt;a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=433073&amp;amp;SiteID=1" target="_blank"&gt;person&lt;/a&gt; to come across this problem and that there is a workaround, but this is just annoying.&lt;/li&gt;&lt;/ol&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=1968596" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/okloeten/archive/tags/Windows+Forms/default.aspx">Windows Forms</category><category domain="http://weblogs.asp.net/okloeten/archive/tags/Orcas/default.aspx">Orcas</category><category domain="http://weblogs.asp.net/okloeten/archive/tags/Visual+Studio/default.aspx">Visual Studio</category></item><item><title>Linq Extensions Beta 1 Now On CodePlex</title><link>http://weblogs.asp.net/okloeten/archive/2006/10/14/662475.aspx</link><pubDate>Sat, 14 Oct 2006 12:03:35 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:662475</guid><dc:creator>Omer van Kloeten</dc:creator><author>Omer van Kloeten</author><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/okloeten/rsscomments.aspx?PostID=662475</wfw:commentRss><comments>http://weblogs.asp.net/okloeten/archive/2006/10/14/662475.aspx#comments</comments><description>&lt;p&gt;&lt;img src="http://www.codeplex.com/Project/FileDownload.aspx?ProjectName=CodePlex&amp;amp;DownloadId=1744" align="right"&gt;My new Linq Extensions project for the &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=1e902c21-340c-4d13-9f04-70eb5e3dceea&amp;amp;displaylang=en" target="_blank"&gt;Linq May CTP&lt;/a&gt;&amp;nbsp;is now &lt;a href="http://www.codeplex.com/Wiki/View.aspx?ProjectName=linqext" target="_blank"&gt;up on CodePlex&lt;/a&gt; and I've released beta 1 (numbered 0.1).&lt;/p&gt; &lt;p&gt;It took me a while to understand how to work with it and the connection to the Team Foundation Server wasn't as fast as I had hoped, but now it's ready for use.&lt;/p&gt; &lt;p&gt;Currently implemented are the following:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://weblogs.asp.net/okloeten/archive/2006/07/09/Hierarchical-Linq-Queries.aspx" target="_blank"&gt;Hierarchy&lt;/a&gt;&lt;/li&gt; &lt;li&gt;Reverse Hierarchy &lt;li&gt;Binary Tree &lt;ul&gt; &lt;li&gt;Infix Traversal &lt;li&gt;Prefix Traversal &lt;li&gt;Postfix Traversal&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;Graphs &lt;ul&gt; &lt;li&gt;Breadth-First Traversal &lt;li&gt;Depth-First Traversal&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;In&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;A FAQ and examples will be written soon, but it's pretty straight forward. You can open bugs and feature requests using the &lt;a href="http://www.codeplex.com/WorkItem/List.aspx?ProjectName=linqext" target="_blank"&gt;Issue Tracker&lt;/a&gt;. The release is downloadable &lt;a href="http://www.codeplex.com/Release/ProjectReleases.aspx?ProjectName=linqext&amp;amp;ReleaseId=773" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;PS: Since the System.Query assembly is not signed, which I'm guessing is because this is only a CTP, so&amp;nbsp;the DotNetZen.Query&amp;nbsp;assembly is not signed.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=662475" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/okloeten/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/okloeten/archive/tags/Orcas/default.aspx">Orcas</category><category domain="http://weblogs.asp.net/okloeten/archive/tags/Tools_3A00_+Linq+Extensions/default.aspx">Tools: Linq Extensions</category></item><item><title>Should Humans Be Called Ape2?</title><link>http://weblogs.asp.net/okloeten/archive/2006/10/10/Should-Humans-Be-Called-Ape2_3F00_.aspx</link><pubDate>Wed, 11 Oct 2006 03:17:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:648196</guid><dc:creator>Omer van Kloeten</dc:creator><author>Omer van Kloeten</author><slash:comments>11</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/okloeten/rsscomments.aspx?PostID=648196</wfw:commentRss><comments>http://weblogs.asp.net/okloeten/archive/2006/10/10/Should-Humans-Be-Called-Ape2_3F00_.aspx#comments</comments><description>&lt;p&gt;Ever since Kathy Kam &lt;a href="http://blogs.msdn.com/kathykam/archive/2006/09/28/776411.aspx" target="_blank"&gt;announced&lt;/a&gt; on her weblog that a new type named TimeZone2 will be introduced into the Orcas release of .NET, the community has been in an uproar, claiming the new name is horrible and that we&amp;#39;re going back to the days of Win32 and COM with types like TimeZone3 and DateTimeEx not far down the line.&lt;/p&gt;&lt;p&gt;TimeZone2 comes to replace TimeZone in order to support &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/dynamic_time_zone_information.asp" target="_blank"&gt;Vista&amp;#39;s Dynamic Time Zone APIs&lt;/a&gt;&amp;nbsp;and offer some other new functionality.&lt;br /&gt;According to &lt;a href="http://blogs.msdn.com/kcwalina/archive/2006/10/06/TimeZone2Naming.aspx" target="_blank"&gt;Krzysztof&lt;/a&gt;, the team had several options:&lt;/p&gt;&lt;ol start="1"&gt;&lt;li&gt;Deprecate the current TimeZone using ObsoleteAttribute and use the same type for the new functionality, but this, according to Krzysztof,&amp;nbsp;will simply not happen. &lt;/li&gt;&lt;li&gt;Use a new namespace, but this will cause confusion, since the type name would have to be fully qualified. &lt;/li&gt;&lt;li&gt;Find a better name, yet no one has been able to come up with one that would satisfy the team. &lt;/li&gt;&lt;li&gt;Call it TimeZone2.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Unfortunately, they decided on the last option, backed by an invocation of a&amp;nbsp;Design Guideline (And none other than one of the very few guidelines I wholeheartedly disagree with).&lt;/p&gt;&lt;p&gt;I, personally, am with the Break Camp: Simply take the old functionality and deprecate it or just remove it altogether. The Orcas framework is to be released at version 3.* (a change of&amp;nbsp;the major version since the last release), which means to users that &lt;strong&gt;breaking changes are acceptable and even&amp;nbsp;expected&lt;/strong&gt;. I have never heard known of a single serious software developer that has taken for granted that their applications will simply work when moving from .NET 1.0 to .NET 2.0 and I don&amp;#39;t think I&amp;#39;ll ever hear of one blindly moving to .NET 3.0.&lt;br /&gt;Want to make it easier on your customers? Create an automatic tool (maybe as part of Visual Studio Orcas) that translates current behaviour to 3.0 behaviour.&lt;/p&gt;&lt;p&gt;Invoking the Red-Bits-In-Place-Service-Pack excuse is moot here, since it was &lt;a href="http://blogs.msdn.com/somasegar/archive/2006/05/18/601354.aspx" target="_blank"&gt;the wrong call to make&lt;/a&gt; in the first place. Backwards compatability is not the Holy Grail.&lt;/p&gt;&lt;p&gt;This is the very first step on the road to making the .NET Framework an unusable patch-work. Just imagine a developer new to .NET which starts with version 3.0 and sees TimeZone and TimeZone2.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;The CLR Team&amp;#39;s posts about this&amp;nbsp;in chronological order:&lt;/p&gt;&lt;p&gt;&lt;a href="http://blogs.msdn.com/kathykam/archive/2006/09/28/776411.aspx"&gt;Orcas September CTP available... Hello &amp;quot;System.TimeZone2&amp;quot;!&lt;/a&gt; &lt;br /&gt;&lt;a href="http://blogs.msdn.com/bclteam/archive/2006/10/03/System.TimeZone2-Starter-Guide-_5B00_Kathy-Kam_5D00_.aspx"&gt;System.TimeZone2 Starter Guide [Kathy Kam]&lt;/a&gt;&lt;br /&gt;&lt;a href="http://blogs.msdn.com/kathykam/archive/2006/10/03/Designing-System.TimeZone2-_2D00_-Part-1-_2800_API-naming-and-new-class-or-not_2900_-.aspx"&gt;Designing System.TimeZone2 - Part 1 (API naming and new class or not) &lt;/a&gt;&lt;br /&gt;&lt;a href="http://blogs.msdn.com/kathykam/archive/2006/10/05/Designing-System.TimeZone2-_2D00_-Part-2-_2800_Dynamic-Time-Zone-support_2900_.aspx"&gt;Designing System.TimeZone2 - Part 2 (Dynamic Time Zone support)&lt;/a&gt;&lt;br /&gt;&lt;a href="http://blogs.msdn.com/kcwalina/archive/2006/10/06/TimeZone2Naming.aspx"&gt;System.TimeZone2 Naming ... and related design guidelines &lt;/a&gt;&lt;br /&gt;&lt;a href="http://blogs.msdn.com/kathykam/archive/2006/10/06/Naming-Guideline-Discussion.aspx"&gt;Naming Guideline Discussion&lt;/a&gt;&lt;br /&gt;&lt;a href="http://blogs.msdn.com/brada/archive/2006/10/10/When-there-is-no-good-name_2E002E002E00_.aspx"&gt;When there is no good name...&lt;/a&gt;&lt;/p&gt;&lt;p&gt;[Update: The team &lt;a href="http://blogs.msdn.com/kathykam/archive/2007/03/28/bye-bye-system-timezone2-hello-system-timezoneinfo.aspx" target="_blank"&gt;went back to the whiteboard and renamed it TimeZoneInfo&lt;/a&gt;.]&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=648196" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/okloeten/archive/tags/Karma/default.aspx">Karma</category><category domain="http://weblogs.asp.net/okloeten/archive/tags/2+_5B21_s/default.aspx">2 ⅛s</category><category domain="http://weblogs.asp.net/okloeten/archive/tags/Community/default.aspx">Community</category><category domain="http://weblogs.asp.net/okloeten/archive/tags/Orcas/default.aspx">Orcas</category></item><item><title>Lambda Expressions, Anonymous Methods and Methods</title><link>http://weblogs.asp.net/okloeten/archive/2006/07/10/Lambda-Expressions_2C00_-Anonymous-Methods-and-Methods.aspx</link><pubDate>Sun, 09 Jul 2006 21:47:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:456030</guid><dc:creator>Omer van Kloeten</dc:creator><author>Omer van Kloeten</author><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/okloeten/rsscomments.aspx?PostID=456030</wfw:commentRss><comments>http://weblogs.asp.net/okloeten/archive/2006/07/10/Lambda-Expressions_2C00_-Anonymous-Methods-and-Methods.aspx#comments</comments><description>I really think &lt;a href="http://blogs.msdn.com/kcwalina/default.aspx"&gt;Krzysztof&lt;/a&gt; and &lt;a href="http://blogs.msdn.com/bclteam/default.aspx"&gt;friends&lt;/a&gt; should post some guidelines in the spirit of The Framework Design Guidelines (&lt;i&gt;read: &lt;a href="http://blogs.msdn.com/kcwalina/archive/2005/09/30/475864.aspx"&gt;The Book You Must Read&lt;/a&gt;&lt;/i&gt;) for lambda expressions, anonymous methods and methods, so there won't be any mixup as to what should be used. I'd hate to see people start writing long anonymous method in the middle of their code - they really disturb the flow.&lt;br&gt;&lt;br&gt;My suggestion:&lt;b&gt;&lt;br&gt;&lt;/b&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Do&lt;/b&gt; use a lambda expression if it consists of only one expression. This is what they're there for.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Avoid &lt;/b&gt;using a lambda expression if the types of parameters and return value are not obvious.&lt;br&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Do&lt;/b&gt; use an anonymous method if it consists of between 1 and 4 lines of code.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Consider &lt;/b&gt;a method instead if an anonymous method if it looks unreadable in the context of the code around it.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Do Not&lt;/b&gt; use an anonymous method if the code contained in it needs to be re-used.&lt;/li&gt;&lt;/ul&gt;And also:&lt;br&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Do&lt;/b&gt; match the names of parameters from the delegate's declaration when declaring them in a lambda expression or an anonymous method.&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;

Again, this is my opinion and the principles I try to follow in my code. I'd love to hear your ideas too.&lt;br&gt;&lt;br&gt;I'd also love to see a refactoring feature in Orcas that lets you refactor between lambda expressions, anonymous methods and methods.&lt;br&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=456030" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/okloeten/archive/tags/Advices/default.aspx">Advices</category><category domain="http://weblogs.asp.net/okloeten/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/okloeten/archive/tags/Orcas/default.aspx">Orcas</category></item><item><title>Hierarchical Linq Queries</title><link>http://weblogs.asp.net/okloeten/archive/2006/07/09/Hierarchical-Linq-Queries.aspx</link><pubDate>Sun, 09 Jul 2006 14:24:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:455988</guid><dc:creator>Omer van Kloeten</dc:creator><author>Omer van Kloeten</author><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/okloeten/rsscomments.aspx?PostID=455988</wfw:commentRss><comments>http://weblogs.asp.net/okloeten/archive/2006/07/09/Hierarchical-Linq-Queries.aspx#comments</comments><description>After reading &lt;a href="http://www.srtsolutions.com/public/blog/20574?model=user/myst/user-srt-corporate-comments&amp;amp;style=user/myst/srt-corporate&amp;amp;scheme=gray"&gt;Bill Wagner's excellent introduction to Linq&lt;/a&gt;, I really liked what I saw and decided that I wanted to create an extension method as an exercise. I sat and thought what I would have wanted from Linq and decided I wanted to write a method that lets you &lt;a href="http://www.adp-gmbh.ch/ora/sql/connect_by.html"&gt;select hierarchical data&lt;/a&gt;.&lt;br&gt;&lt;br&gt;Here's a mockup of how a query would look like:&lt;pre&gt;&lt;span style="color: blue;"&gt;from&lt;/span&gt;   node &lt;span style="color: blue;"&gt;in&lt;/span&gt; tree.ByHierarchy&lt;span style="color: teal;"&gt;&amp;lt;HierarchicalData&lt;/span&gt;&amp;gt;(startWith, connectBy)&lt;br&gt;&lt;span style="color: blue;"&gt;select&lt;/span&gt; node;&lt;/pre&gt;Each 'node' in the query will be an object holding the original item, its level of depth in the hierarchy and its parent (for convenience's sake):&lt;br&gt;&lt;pre&gt;&lt;span style=""&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: teal;"&gt;Node&lt;/span&gt;&amp;lt;T&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;{&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&lt;/span&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;int&lt;/span&gt; Level;&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: teal;"&gt;Node&lt;/span&gt;&amp;lt;T&amp;gt; Parent;&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; T Item;&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;}&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&lt;/span&gt;&lt;/pre&gt;This node will be used to determine what the item is and where it's located.&lt;br&gt;Let's take an example:&lt;br&gt;&lt;pre&gt;&lt;span style="color: teal;"&gt;Tree&lt;/span&gt;&lt;span style=""&gt; t7 = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;Tree&lt;/span&gt; { Value = 7 };&lt;/span&gt;&lt;br&gt;&lt;span style="color: teal;"&gt;Tree&lt;/span&gt;&lt;span style=""&gt; t6 = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;Tree&lt;/span&gt; { Value = 6 };&lt;/span&gt;&lt;br&gt;&lt;span style="color: teal;"&gt;Tree&lt;/span&gt;&lt;span style=""&gt; t5 = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;Tree&lt;/span&gt; { Value = 5, Left = t6, Right = t7 };&lt;/span&gt;&lt;br&gt;&lt;span style="color: teal;"&gt;Tree&lt;/span&gt;&lt;span style=""&gt; t4 = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;Tree&lt;/span&gt; { Value = 4 };&lt;/span&gt;&lt;br&gt;&lt;span style="color: teal;"&gt;Tree&lt;/span&gt;&lt;span style=""&gt; t3 = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;Tree&lt;/span&gt; { Value = 3 };&lt;/span&gt;&lt;br&gt;&lt;span style="color: teal;"&gt;Tree&lt;/span&gt;&lt;span style=""&gt; t2 = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;Tree&lt;/span&gt; { Value = 2, Left = t3, Right = t4 };&lt;/span&gt;&lt;br&gt;&lt;span style="color: teal;"&gt;Tree&lt;/span&gt;&lt;span style=""&gt; t1 = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;Tree&lt;/span&gt; { Value = 1, Left = t2, Right = t5 };&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&lt;/span&gt;&lt;br&gt;&lt;span style="font-size: 10pt; color: teal;" lang="FR"&gt;Tree&lt;/span&gt;&lt;span style="" lang="FR"&gt;[] treeNodes = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;Tree&lt;/span&gt;[] { t1, t2, t3, t4, t5, t6, t7 };&lt;/span&gt;&lt;br&gt;&lt;span style="font-size: 10pt;" lang="FR"&gt;&amp;nbsp;&lt;/span&gt;&lt;br&gt;&lt;span style="color: blue;"&gt;var&lt;/span&gt;&lt;span style=""&gt; nodes = &lt;span style="color: blue;"&gt;from&lt;/span&gt;&amp;nbsp;&amp;nbsp; node &lt;span style="color: blue;"&gt;in&lt;/span&gt; treeNodes.ByHierarchy&amp;lt;&lt;span style="color: teal;"&gt;Tree&lt;/span&gt;&amp;gt;(&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; t =&amp;gt; t == t1,&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (parent, child) =&amp;gt; (parent.Left == child) ||&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (parent.Right == child))&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;select&lt;/span&gt; node;&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&lt;/span&gt;&lt;br&gt;&lt;span style="color: blue;"&gt;foreach&lt;/span&gt;&lt;span style=""&gt; (&lt;span style="color: teal;"&gt;LinqExtensions&lt;/span&gt;.&lt;span style="color: teal;"&gt;Node&lt;/span&gt;&amp;lt;&lt;span style="color: teal;"&gt;Tree&lt;/span&gt;&amp;gt; n &lt;span style="color: blue;"&gt;in&lt;/span&gt; nodes)&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;{&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;for&lt;/span&gt; (&lt;span style="color: blue;"&gt;int&lt;/span&gt; i = 0; i &amp;lt; n.Level; i++) &lt;span style="color: teal;"&gt;Console&lt;/span&gt;.Write(&lt;span style="color: maroon;"&gt;' '&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: teal;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: maroon;"&gt;"Node {0}, child of {1}."&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; n.Item.Value,&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (n.Parent != &lt;span style="color: blue;"&gt;null&lt;/span&gt; ? n.Parent.Item.Value.ToString() : &lt;span style="color: maroon;"&gt;"no one"&lt;/span&gt;));&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;}&lt;/span&gt;
&lt;/pre&gt;This example will walk on the tree (which so happens to be a three-tiered complete binary tree) and print it in the order of hierarchy:&lt;br&gt;&lt;pre&gt;Node 1, child of no one.&lt;br&gt; Node 2, child of 1.&lt;br&gt;  Node 3, child of 2.&lt;br&gt;  Node 4, child of 2.&lt;br&gt; Node 5, child of 1.&lt;br&gt;  Node 6, child of 5.&lt;br&gt;  Node 7, child of 5.&lt;/pre&gt;
And here's the code that does this:&lt;br&gt;&lt;pre&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt;&lt;span style=""&gt; System;&lt;/span&gt;&lt;br&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt;&lt;span style=""&gt; System.Collections.Generic;&lt;/span&gt;&lt;br&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt;&lt;span style=""&gt; System.Query;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color: blue;"&gt;namespace&lt;/span&gt;&lt;span style=""&gt; DotNetZen.Linq&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;{&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;partial&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: teal;"&gt;LinqExtensions&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: teal;"&gt;Node&lt;/span&gt;&amp;lt;T&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;internal&lt;/span&gt; Node()&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;int&lt;/span&gt; Level;&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: teal;"&gt;Node&lt;/span&gt;&amp;lt;T&amp;gt; Parent;&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; T Item;&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: teal;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: teal;"&gt;Node&lt;/span&gt;&amp;lt;T&amp;gt;&amp;gt; ByHierarchy&amp;lt;T&amp;gt;(&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt; &lt;span style="color: teal;"&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; source,&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: teal;"&gt;Func&lt;/span&gt;&amp;lt;T, &lt;span style="color: blue;"&gt;bool&lt;/span&gt;&amp;gt; startWith, &lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: teal;"&gt;Func&lt;/span&gt;&amp;lt;T, T, &lt;span style="color: blue;"&gt;bool&lt;/span&gt;&amp;gt; connectBy)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=""&gt;{&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; source.ByHierarchy&amp;lt;T&amp;gt;(startWith, connectBy, &lt;span style="color: blue;"&gt;null&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: teal;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: teal;"&gt;Node&lt;/span&gt;&amp;lt;T&amp;gt;&amp;gt; ByHierarchy&amp;lt;T&amp;gt;(&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt; &lt;span style="color: teal;"&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; source,&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: teal;"&gt;Func&lt;/span&gt;&amp;lt;T, &lt;span style="color: blue;"&gt;bool&lt;/span&gt;&amp;gt; startWith,&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: teal;"&gt;Func&lt;/span&gt;&amp;lt;T, T, &lt;span style="color: blue;"&gt;bool&lt;/span&gt;&amp;gt; connectBy,&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: teal;"&gt;Node&lt;/span&gt;&lt;span style=""&gt;&amp;lt;T&amp;gt; parent)&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;int&lt;/span&gt; level = (parent == &lt;span style="color: blue;"&gt;null&lt;/span&gt; ? &lt;/span&gt;&lt;span style=""&gt;0 : parent.Level + 1);&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (source == &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;throw&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color: maroon;"&gt;"source"&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (startWith == &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;throw&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color: maroon;"&gt;"startWith"&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (connectBy == &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;throw&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color: maroon;"&gt;"connectBy"&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (T value &lt;span style="color: blue;"&gt;in&lt;/span&gt; &lt;span style="color: blue;"&gt;from&lt;/span&gt;&amp;nbsp; &amp;nbsp;item &lt;span style="color: blue;"&gt;in&lt;/span&gt; source&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;where&lt;/span&gt; &amp;nbsp;startWith(item)&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;select&lt;/span&gt; item)&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: teal;"&gt;Node&lt;/span&gt;&amp;lt;T&amp;gt; newNode = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;Node&lt;/span&gt;&amp;lt;T&amp;gt; { Level = level, Parent = parent, Item = value };&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;yield&lt;/span&gt; &lt;span style="color: blue;"&gt;return&lt;/span&gt; newNode;&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: teal;"&gt;Node&lt;/span&gt;&amp;lt;T&amp;gt; subNode &lt;span style="color: blue;"&gt;in&lt;/span&gt; source.ByHierarchy&amp;lt;T&amp;gt;(possibleSub =&amp;gt; connectBy(value, possibleSub),&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;                       connectBy, newNode))&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;yield&lt;/span&gt; &lt;span style="color: blue;"&gt;return&lt;/span&gt; subNode;&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br&gt;&lt;span style=""&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=455988" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/okloeten/archive/tags/Ideas/default.aspx">Ideas</category><category domain="http://weblogs.asp.net/okloeten/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/okloeten/archive/tags/Orcas/default.aspx">Orcas</category><category domain="http://weblogs.asp.net/okloeten/archive/tags/Tools_3A00_+Linq+Extensions/default.aspx">Tools: Linq Extensions</category></item><item><title>Three Lines About Lambda Expressions</title><link>http://weblogs.asp.net/okloeten/archive/2006/07/07/Three-Lines-About-Lambda-Expressions.aspx</link><pubDate>Fri, 07 Jul 2006 14:09:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:455823</guid><dc:creator>Omer van Kloeten</dc:creator><author>Omer van Kloeten</author><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/okloeten/rsscomments.aspx?PostID=455823</wfw:commentRss><comments>http://weblogs.asp.net/okloeten/archive/2006/07/07/Three-Lines-About-Lambda-Expressions.aspx#comments</comments><description>&lt;pre&gt;myObject.ITakeACharReturningDelegate(delegate(&lt;font color="blue"&gt;int&lt;/font&gt; i, &lt;font color="blue"&gt;string&lt;/font&gt; s) { &lt;font color="blue"&gt;return&lt;/font&gt; s[i]; });&lt;br&gt;myObject.ITakeACharReturningDelegate((i, s) =&amp;gt; s[i]);&lt;/pre&gt;Both are the same. That's it, in a nutshell...&lt;br&gt;[&lt;b&gt;Update&lt;/b&gt;: The HTML was malformed in the post. Sorry about that.]&lt;br&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=455823" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/okloeten/archive/tags/Toys/default.aspx">Toys</category><category domain="http://weblogs.asp.net/okloeten/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/okloeten/archive/tags/Orcas/default.aspx">Orcas</category></item></channel></rss>