<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-30125454</id><updated>2011-07-28T05:35:34.234-07:00</updated><category term='visual studio'/><category term='ruby'/><category term='csharp'/><title type='text'>Jacob Carpenter's blogspot</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://jacobcarpenters.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30125454/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://jacobcarpenters.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Jacob</name><uri>http://www.blogger.com/profile/07300518452274773472</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>22</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-30125454.post-1360445227947928762</id><published>2007-11-16T11:12:00.001-08:00</published><updated>2007-11-16T11:14:12.746-08:00</updated><title type='text'>New blog</title><content type='html'>For no good reason, I installed Windows Live writer and started a new blog. You can check it out at &lt;a href="http://jacobcarpenter.wordpress.com/"&gt;http://jacobcarpenter.wordpress.com/&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30125454-1360445227947928762?l=jacobcarpenters.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacobcarpenters.blogspot.com/feeds/1360445227947928762/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30125454&amp;postID=1360445227947928762' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30125454/posts/default/1360445227947928762'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30125454/posts/default/1360445227947928762'/><link rel='alternate' type='text/html' href='http://jacobcarpenters.blogspot.com/2007/11/new-blog.html' title='New blog'/><author><name>Jacob</name><uri>http://www.blogger.com/profile/07300518452274773472</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30125454.post-9195247977871708408</id><published>2007-07-26T19:48:00.000-07:00</published><updated>2007-07-26T19:50:45.983-07:00</updated><title type='text'></title><content type='html'>&lt;p&gt;Program.cs:&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace HelloOrcas
{
    class Program
    {
        static void Main(string[] args)
        {
            "Hello, Orcas!".Print();
        }
    }

    public static class StringExtensions
    {
        public static void Print(this string message)
        {
            Console.WriteLine(message);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30125454-9195247977871708408?l=jacobcarpenters.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacobcarpenters.blogspot.com/feeds/9195247977871708408/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30125454&amp;postID=9195247977871708408' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30125454/posts/default/9195247977871708408'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30125454/posts/default/9195247977871708408'/><link rel='alternate' type='text/html' href='http://jacobcarpenters.blogspot.com/2007/07/using-system-using-system.html' title=''/><author><name>Jacob</name><uri>http://www.blogger.com/profile/07300518452274773472</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30125454.post-7625147656586635809</id><published>2007-04-04T17:33:00.001-07:00</published><updated>2007-04-04T17:33:53.537-07:00</updated><title type='text'></title><content type='html'>&lt;div style="font-family: Verdana; font-size: 10pt; color: black; background: white;"&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;7&lt;/span&gt;&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;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;CollectionHelper&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;{&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;9&lt;/span&gt;&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: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; Enumerate&amp;lt;T&amp;gt;(&lt;span style="color: blue;"&gt;params&lt;/span&gt; T[] args)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;10&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;11&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (args == &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;12&lt;/span&gt;&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: #2b91af;"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"args"&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;13&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;14&lt;/span&gt;&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 arg &lt;span style="color: blue;"&gt;in&lt;/span&gt; args)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;15&lt;/span&gt;&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; arg;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;16&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;17&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;18&lt;/span&gt;&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; T First&amp;lt;T&amp;gt;(&lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; source)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;19&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;20&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; First(source, ReturnTrue);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;21&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;22&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;23&lt;/span&gt;&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; T First&amp;lt;T&amp;gt;(&lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; source, &lt;span style="color: #2b91af;"&gt;Func&lt;/span&gt;&amp;lt;T, &lt;span style="color: blue;"&gt;bool&lt;/span&gt;&amp;gt; predicate)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;24&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;25&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; T result;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;26&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (!TryFindFirst(source, &lt;span style="color: blue;"&gt;out&lt;/span&gt; result, predicate))&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;27&lt;/span&gt;&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: #2b91af;"&gt;InvalidOperationException&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"Source sequence empty or no items satisfy predicate."&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;28&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;29&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; result;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;30&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;31&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;32&lt;/span&gt;&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; T FirstOrDefault&amp;lt;T&amp;gt;(&lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; source)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;33&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;34&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; FirstOrDefault(source, ReturnTrue);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;35&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;36&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;37&lt;/span&gt;&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; T FirstOrDefault&amp;lt;T&amp;gt;(&lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; source, &lt;span style="color: #2b91af;"&gt;Func&lt;/span&gt;&amp;lt;T, &lt;span style="color: blue;"&gt;bool&lt;/span&gt;&amp;gt; predicate)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;38&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;39&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; T result;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;40&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; TryFindFirst(source, &lt;span style="color: blue;"&gt;out&lt;/span&gt; result, predicate);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;41&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; result;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;42&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;43&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;44&lt;/span&gt;&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: blue;"&gt;bool&lt;/span&gt; TryFindFirst&amp;lt;T&amp;gt;(&lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; source, &lt;span style="color: blue;"&gt;out&lt;/span&gt; T result)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;45&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;46&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; TryFindFirst(source, &lt;span style="color: blue;"&gt;out&lt;/span&gt; result, ReturnTrue);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;47&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;48&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;49&lt;/span&gt;&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: blue;"&gt;bool&lt;/span&gt; TryFindFirst&amp;lt;T&amp;gt;(&lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; source, &lt;span style="color: blue;"&gt;out&lt;/span&gt; T result, &lt;span style="color: #2b91af;"&gt;Func&lt;/span&gt;&amp;lt;T, &lt;span style="color: blue;"&gt;bool&lt;/span&gt;&amp;gt; predicate)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;50&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;51&lt;/span&gt;&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;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;52&lt;/span&gt;&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: #2b91af;"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"source"&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;53&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (predicate == &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;54&lt;/span&gt;&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: #2b91af;"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"predicate"&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;55&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;56&lt;/span&gt;&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 item &lt;span style="color: blue;"&gt;in&lt;/span&gt; source)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;57&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;58&lt;/span&gt;&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; (predicate(item))&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;59&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;60&lt;/span&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; result = item;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;61&lt;/span&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; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;true&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;62&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;63&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;64&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;65&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; result = &lt;span style="color: blue;"&gt;default&lt;/span&gt;(T);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;66&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;false&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;67&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;68&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;69&lt;/span&gt;&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: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;TOut&amp;gt; Map&amp;lt;T, TOut&amp;gt;(&lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; source, &lt;span style="color: #2b91af;"&gt;Func&lt;/span&gt;&amp;lt;T, TOut&amp;gt; converter)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;70&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;71&lt;/span&gt;&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;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;72&lt;/span&gt;&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: #2b91af;"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"source"&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;73&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (converter == &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;74&lt;/span&gt;&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: #2b91af;"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"fn"&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;75&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;76&lt;/span&gt;&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 item &lt;span style="color: blue;"&gt;in&lt;/span&gt; source)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;77&lt;/span&gt;&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; converter(item);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;78&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;79&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;80&lt;/span&gt;&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: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;TOut&amp;gt; Zip&amp;lt;TLeft, TRight, TOut&amp;gt;(&lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;TLeft&amp;gt; left, &lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;TRight&amp;gt; right, &lt;span style="color: #2b91af;"&gt;Func&lt;/span&gt;&amp;lt;TLeft, TRight, TOut&amp;gt; fn)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;81&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;82&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (left == &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;83&lt;/span&gt;&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: #2b91af;"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"left"&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;84&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (right == &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;85&lt;/span&gt;&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: #2b91af;"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"right"&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;86&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (fn == &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;87&lt;/span&gt;&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: #2b91af;"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"fn"&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;88&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;89&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;using&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;IEnumerator&lt;/span&gt;&amp;lt;TLeft&amp;gt; leftEnumerator = left.GetEnumerator())&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;90&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;using&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;IEnumerator&lt;/span&gt;&amp;lt;TRight&amp;gt; rightEnumerator = right.GetEnumerator())&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;91&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;92&lt;/span&gt;&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;while&lt;/span&gt; (&lt;span style="color: blue;"&gt;true&lt;/span&gt;)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;93&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;94&lt;/span&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; &lt;span style="color: blue;"&gt;bool&lt;/span&gt; leftMoved = leftEnumerator.MoveNext();&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;95&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;96&lt;/span&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; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (!(leftMoved == rightEnumerator.MoveNext()))&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;97&lt;/span&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; &lt;span style="color: blue;"&gt;throw&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;InvalidOperationException&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"Sequences are of incompatible lengths."&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;98&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;99&lt;/span&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; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (!leftMoved)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;100&lt;/span&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; &lt;span style="color: blue;"&gt;break&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;101&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;102&lt;/span&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; &lt;span style="color: blue;"&gt;yield&lt;/span&gt; &lt;span style="color: blue;"&gt;return&lt;/span&gt; fn(leftEnumerator.Current, rightEnumerator.Current);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;103&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;104&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;105&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;106&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;107&lt;/span&gt;&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: blue;"&gt;bool&lt;/span&gt; ReturnTrue&amp;lt;T&amp;gt;(T ignored)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;108&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;109&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;true&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;110&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;111&lt;/span&gt;&amp;nbsp;}&lt;/pre&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30125454-7625147656586635809?l=jacobcarpenters.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacobcarpenters.blogspot.com/feeds/7625147656586635809/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30125454&amp;postID=7625147656586635809' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30125454/posts/default/7625147656586635809'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30125454/posts/default/7625147656586635809'/><link rel='alternate' type='text/html' href='http://jacobcarpenters.blogspot.com/2007/04/public-static-class-collectionhelper.html' title=''/><author><name>Jacob</name><uri>http://www.blogger.com/profile/07300518452274773472</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30125454.post-9060852066187798099</id><published>2006-11-14T18:08:00.000-08:00</published><updated>2006-11-14T18:26:06.893-08:00</updated><title type='text'>Single Raised EventHandler</title><content type='html'>&lt;p&gt;Earlier today, a friend described a scenario at his work where he needed to hook up an &lt;code&gt;EventHandler&lt;/code&gt; that was only raised once.&lt;/p&gt;
&lt;p&gt;A na&amp;#x00EF;ve solution could be to merely check whether the critical code had been executed within the handler; then set the state appropriately upon the first execution. Something like:&lt;/p&gt;
&lt;pre&gt;
public class TestClass
{
   public event EventHandler SimpleEvent;

   public void RaiseAll()
   {
      if (SimpleEvent != null)
         SimpleEvent(null, EventArgs.Empty);
   }
}

// elsewhere:

TestClass test = new TestClass();

bool raised = false;
test.SimpleEvent += delegate
{
   if (!raised)
   {
      // critical code:
      raised = true;
      Console.WriteLine("Hello world!");
   }
};

test.RaiseAll();
test.RaiseAll();
test.RaiseAll();

// output:
// Hello world!
&lt;/pre&gt;

&lt;p&gt;Okay, that's fine for an event on a simple, transient instance of an object. But what if, in the lifecycle of our application, we could potentially throw away hundered of &lt;code&gt;EventHandlers&lt;/code&gt;? And what if, further complicating the problem, the &lt;code&gt;event&lt;/code&gt; is &lt;code&gt;static&lt;/code&gt;? It sure would be nice if we could actually remove the &lt;code&gt;EventHandler&lt;/code&gt;, once it has been raised.&lt;/p&gt;
&lt;p&gt;Well, we can. There are two ways to achieve this: one is simple but requires duplication for reuse; the other is complicated but easily reusable.&lt;/p&gt;
&lt;p&gt;Let's look at the simple one first:&lt;/p&gt;
&lt;pre&gt;
TestClass test = new TestClass();

EventHandler handler = null; // avoid: error CS0165: Use of unassigned local variable 'handler'
test.SimpleEvent += handler = delegate
{
   test.SimpleEvent -= handler; // remove self before executing the critical code
   Console.WriteLine("Hello world!");
};

test.RaiseAll();
test.RaiseAll();
test.RaiseAll();

// output:
// Hello world!
&lt;/pre&gt;
&lt;p&gt;There are a couple of things to note here:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Since we know the type of &lt;code&gt;TestClass&lt;/code&gt;'s &lt;code&gt;SimpleEvent&lt;/code&gt;, we can declare a strongly typed &lt;code&gt;EventHandler&lt;/code&gt; and assign an anonymous method to it. Not knowing this type at compile-time is the source of much of the complication of the reusable solution below.&lt;/li&gt;
&lt;li&gt;Also, we temporarily assign &lt;code&gt;null&lt;/code&gt; to &lt;code&gt;handler&lt;/code&gt; before referring to &lt;code&gt;handler&lt;/code&gt; within the body of the anonymous method to avoid the noted compiler error. Then, we assign the anonymous method to &lt;code&gt;handler&lt;/code&gt; before attaching &lt;code&gt;handler&lt;/code&gt; to the &lt;code&gt;event&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;But, Jacob, this works fine. Why would we care about "improving" it?&lt;/p&gt;
&lt;p&gt;Well, for starters, it's not very extensible. The critical code is embedded into the anonymous method. So anytime we want to bring different functionality to this event, we'll need to repeat this pattern. Also, not only is the critical code not pluggable, but we've constrained ourselves to only &lt;code&gt;EventHandler&lt;/code&gt; events. There are other types of strongly typed event handling delegates with far more interesting &lt;code&gt;EventArgs&lt;/code&gt; (and how does the name "EventArgs" not violate the &lt;a href="http://www.amazon.com/Framework-Design-Guidelines-Conventions-Development/dp/0321246756"&gt;Framework Design Guidelines&lt;/a&gt;, anyway?). And lastly, &amp;#x2026; well&amp;#x2026; because we can:&lt;/p&gt;
&lt;p&gt;[At this point in the post, the author suddenly switches voices: the hand-holdy, instructive teacher is replaced with the programmer who has spent too much time with the material at hand and pastes in swaths of code assuming his audience will understand. Apologies for the lack of exposition to follow.]
&lt;pre&gt;
public static class EventUtility
{
   public static void AttachRaisedOnce&amp;lt;TTarget&amp;gt;(TTarget target, string eventName, EventHandler raisedOnce)
      where TTarget : class
   {
      AttachRaisedOnce&amp;lt;TTarget, EventArgs&amp;gt;(target, eventName, CastDelegate&amp;lt;EventHandler&amp;lt;EventArgs&amp;gt;&amp;gt;(raisedOnce));
   }

   public static void AttachRaisedOnce&amp;lt;TTarget, TEventArgs&amp;gt;(TTarget target, string eventName, EventHandler&amp;lt;TEventArgs&amp;gt; raisedOnce)
      where TTarget : class
      where TEventArgs : EventArgs
   {
      EventInfo eventTarget = typeof(TTarget).GetEvent(eventName);
      if (eventTarget == null)
         throw new ArgumentException(String.Format("Couldn't find event with name '{0}'", eventName), "eventName");

      Delegate self = null; // avoid unassigned local
      EventHandler&amp;lt;TEventArgs&amp;gt; localMethod = delegate(object sender, TEventArgs e)
      {
         eventTarget.RemoveEventHandler(target, self);
         raisedOnce(sender, e);
      };

      self = Delegate.CreateDelegate(eventTarget.EventHandlerType, localMethod.Target, localMethod.Method);
      eventTarget.AddEventHandler(target, self);
   }

   // see &lt;a href="http://jacobcarpenters.blogspot.com/2006/06/c-30-and-delegate-conversion.html"&gt;earlier post&lt;/a&gt;
   // also: belongs elsewhere; maybe a static DelegateUtility class
   private static T CastDelegate&amp;lt;T&amp;gt;(Delegate source)
      where T : class // CS0702: Constraint cannot be special class 'System.Delegate'
   {
      if (source == null)
         return null;

      Delegate[] delegates = source.GetInvocationList();
      if (delegates.Length == 1)
         return Delegate.CreateDelegate(typeof(T), delegates[0].Target, delegates[0].Method) as T;

      for (int i = 0; i &amp;lt; delegates.Length; i++)
         delegates[i] = Delegate.CreateDelegate(typeof(T), delegates[i].Target, delegates[i].Method);

      return Delegate.Combine(delegates) as T;
   }
}
&lt;/pre&gt;
&lt;p&gt;Calling code looks like:&lt;/p&gt;
&lt;pre&gt;
TestClass test = new TestClass();

EventUtility.AttachRaisedOnce(test, "SimpleEvent", delegate { Console.WriteLine("Hello world!"); });

test.RaiseAll();
test.RaiseAll();
test.RaiseAll();

// output:
// Hello world!
&lt;/pre&gt;
&lt;p&gt;For strongly typed EventHandlers, like the &lt;code&gt;System.Web.UI.ImageClickEventHandler&lt;/code&gt; delegate, the calling code looks a little weird:&lt;/p&gt;
&lt;pre&gt;
EventUtility.AttachRaisedOnce&amp;lt;ImageButton, ImageClickEventArgs&amp;gt;(button, "Click", delegate { Response.Write("Hello web!"); });
&lt;/pre&gt;
&lt;p&gt;Note that the second type argument is the type of the &lt;code&gt;EventArgs&lt;/code&gt;, not the type of the &lt;code&gt;EventHandler&lt;/code&gt; delegate itself. This is due to the inablity to apply a &lt;code&gt;Delegate&lt;/code&gt; constraint on a type argument, coupled with the need to assign an anonymous method to a local variable with the right type. We rely on the fact that we can convert from an &lt;code&gt;EventHandler&amp;lt;T&amp;gt;&lt;/code&gt; to the strongly typed &lt;code&gt;EventHandler&lt;/code&gt; delegate. This means that it is also possible to compile code with the wrong event/delegate combinations; but don't worry: the runtime will "inform you" of any conversion failures.&lt;/p&gt;
&lt;p&gt;Enjoy.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30125454-9060852066187798099?l=jacobcarpenters.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacobcarpenters.blogspot.com/feeds/9060852066187798099/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30125454&amp;postID=9060852066187798099' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30125454/posts/default/9060852066187798099'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30125454/posts/default/9060852066187798099'/><link rel='alternate' type='text/html' href='http://jacobcarpenters.blogspot.com/2006/11/earlier-today-friend-described-scenario.html' title='Single Raised EventHandler'/><author><name>Jacob</name><uri>http://www.blogger.com/profile/07300518452274773472</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30125454.post-116257558385672154</id><published>2006-11-03T09:39:00.000-08:00</published><updated>2006-11-03T09:35:53.816-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='csharp'/><title type='text'>Enum TryParse</title><content type='html'>&lt;p&gt;I was somewhat surprised to discover that there's no TryParse method for the Enum class in the .NET Framework 2.0. (It's also odd that the docs/compiler keep referring to Enum as a class&amp;#x2014;and yet the apprpriate &lt;code&gt;where&lt;/code&gt; constraint to apply is &lt;code&gt;struct&lt;/code&gt;.) So here's a pair of generic methods to support TryParse for Enums:&lt;/p&gt;
&lt;pre&gt;
public static class EnumUtility
{
   public static bool TryParse&amp;lt;T&amp;gt;(string value, out T result)
      where T : struct // error CS0702: Constraint cannot be special class 'System.Enum'
   {
      return TryParse&amp;lt;T&amp;gt;(value, out result, false);
   }

   public static bool TryParse&amp;lt;T&amp;gt;(string value, out T result, bool ignoreCase)
      where T : struct // error CS0702: Constraint cannot be special class 'System.Enum'
   {
      result = default(T);
      try
      {
         result = (T)Enum.Parse(typeof(T), value, ignoreCase);
         return true;
      }
      catch { }

      return false;
   }
}
&lt;/pre&gt;

&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30125454-116257558385672154?l=jacobcarpenters.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacobcarpenters.blogspot.com/feeds/116257558385672154/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30125454&amp;postID=116257558385672154' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30125454/posts/default/116257558385672154'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30125454/posts/default/116257558385672154'/><link rel='alternate' type='text/html' href='http://jacobcarpenters.blogspot.com/2006/11/enum-tryparse.html' title='Enum TryParse'/><author><name>Jacob</name><uri>http://www.blogger.com/profile/07300518452274773472</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30125454.post-116111645232997534</id><published>2006-10-17T13:19:00.000-07:00</published><updated>2006-11-03T09:35:53.752-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='csharp'/><title type='text'>Enumerate Using</title><content type='html'>&lt;p&gt;If you ever need to enumerate a collection of &lt;code&gt;IDisposable&lt;/code&gt; items, and you find the following code snippet ugly:&lt;/p&gt;
&lt;pre&gt;
foreach (SomeDisposableClass item in collectionOfDisposableItems)
{
   using (item)
   {
      // do stuff
   }
}
&lt;/pre&gt;
&lt;p&gt;You may find the following method useful:&lt;/p&gt;
&lt;pre&gt;
public static IEnumerable&amp;lt;T&amp;gt; EnumerateUsing&amp;lt;T&amp;gt;(IEnumerable&amp;lt;T&amp;gt; disposableItems)
   where T : IDisposable
{
   foreach (T item in disposableItems)
      using (item)
         yield return item;
}
&lt;/pre&gt;
&lt;p&gt;Calling code looks like:&lt;/p&gt;
&lt;pre&gt;
foreach (SomeDisposableClass item in EnumerateUsing(collectionOfDisposableItems))
{
   // do stuff
}
&lt;/pre&gt;
&lt;p&gt;And yes, &lt;code&gt;Dispose()&lt;/code&gt; does get called appropriately after you're finished "doing stuff".&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30125454-116111645232997534?l=jacobcarpenters.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacobcarpenters.blogspot.com/feeds/116111645232997534/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30125454&amp;postID=116111645232997534' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30125454/posts/default/116111645232997534'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30125454/posts/default/116111645232997534'/><link rel='alternate' type='text/html' href='http://jacobcarpenters.blogspot.com/2006/10/enumerate-using.html' title='Enumerate Using'/><author><name>Jacob</name><uri>http://www.blogger.com/profile/07300518452274773472</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30125454.post-116017224767170997</id><published>2006-10-06T15:04:00.000-07:00</published><updated>2006-11-03T09:35:53.689-08:00</updated><title type='text'>Merging in Subversion</title><content type='html'>&lt;p&gt;Once you've done it, merging from a branch to the trunk (or vice versa) in Subversion is a trivial task. But that first time you attempt it, it can seem a little daunting. Here's a quick how-to:&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;Let's say you've got a development &lt;var&gt;branch&lt;/var&gt; that's all committed and ready to be merged into the &lt;var&gt;trunk&lt;/var&gt;. First, &lt;kbd&gt;switch&lt;/kbd&gt; your working copy to where the result of the merge will ultimately be committed; in this case, the &lt;var&gt;trunk&lt;/var&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;kbd&gt;merge&lt;/kbd&gt; &lt;em&gt;from&lt;/em&gt; the current location &lt;em&gt;to&lt;/em&gt; the location that resembles your desired final result; for us, this is merging from the &lt;var&gt;trunk&lt;/var&gt; to the development &lt;var&gt;branch&lt;/var&gt;.&lt;/li&gt;
  &lt;li&gt;Resolve any conflicts and &lt;kbd&gt;commit&lt;/kbd&gt; your current working copy.&lt;/li&gt;
&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30125454-116017224767170997?l=jacobcarpenters.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacobcarpenters.blogspot.com/feeds/116017224767170997/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30125454&amp;postID=116017224767170997' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30125454/posts/default/116017224767170997'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30125454/posts/default/116017224767170997'/><link rel='alternate' type='text/html' href='http://jacobcarpenters.blogspot.com/2006/10/merging-in-subversion.html' title='Merging in Subversion'/><author><name>Jacob</name><uri>http://www.blogger.com/profile/07300518452274773472</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30125454.post-115835223767573734</id><published>2006-09-15T13:30:00.000-07:00</published><updated>2006-11-03T09:35:53.626-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='visual studio'/><title type='text'>Visual Studio Macro</title><content type='html'>&lt;p&gt;Never thought I'd be posting VB to my blog, but here's a little Visual Studio macro to switch between a Class file and it's associated TestFixture. The macro assumes a &lt;code&gt;&lt;i&gt;ClassName&lt;/i&gt;Fixture&lt;/code&gt; naming convention. Also sorry if my VB sucks, it literally took me 3 minutes plus asking a coworker to figure out how test for &lt;code&gt;null&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Enjoy:&lt;/p&gt;
&lt;pre&gt;
Imports System
Imports System.IO
Imports EnvDTE
Imports EnvDTE80
Imports System.Diagnostics

Public Module TestFixtures

    Public Sub SwitchBetweenClassAndFixture()
        Dim active As Document, filename As String, extension As String
        Const fixtureSuffix = "Fixture"

        active = DTE.ActiveDocument
        If Not active Is Nothing Then
            filename = Path.GetFileNameWithoutExtension(active.Name)
            extension = Path.GetExtension(active.Name)
            If filename.EndsWith(fixtureSuffix) Then
                DTE.ExecuteCommand("Edit.OpenFile", filename.Substring(0, filename.Length - fixtureSuffix.Length) + extension)
            Else
                DTE.ExecuteCommand("Edit.OpenFile", filename + fixtureSuffix + extension)
            End If
        End If
    End Sub

End Module
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30125454-115835223767573734?l=jacobcarpenters.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacobcarpenters.blogspot.com/feeds/115835223767573734/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30125454&amp;postID=115835223767573734' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30125454/posts/default/115835223767573734'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30125454/posts/default/115835223767573734'/><link rel='alternate' type='text/html' href='http://jacobcarpenters.blogspot.com/2006/09/visual-studio-macro.html' title='Visual Studio Macro'/><author><name>Jacob</name><uri>http://www.blogger.com/profile/07300518452274773472</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30125454.post-115456053430880627</id><published>2006-08-02T16:15:00.000-07:00</published><updated>2006-11-03T09:35:53.562-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='csharp'/><title type='text'>Generics and Delegates</title><content type='html'>&lt;p&gt;I see a surprising number of search hits on this blog for things involving generics, delegates, and collections. So I guess it would be appropriate to write a series of posts on the subject.&lt;/p&gt;
&lt;p&gt;This is all pretty rudimentary stuff, so if you're familiar with generics, delegates, and anonymous methods, you may want to just skip this one.&lt;/p&gt;

&lt;h3&gt;Generics&lt;/h3&gt;
&lt;pre&gt;public static class Assert
{
    public void Throws&amp;lt;T&amp;gt;(/* ... */) where T: Exception {/* ... */}
}&lt;/pre&gt;
&lt;p&gt;Here we have a method, named as if it were a part of some test framework (say, &lt;a href="http://nunit.org/"&gt;NUnit&lt;/a&gt;). This method takes one type parameter (&lt;code&gt;T&lt;/code&gt;), so we can call this method a &amp;quot;generic method&amp;quot;.&lt;/p&gt;
&lt;p&gt;This method also contains what is called a &amp;quot;type constraint&amp;quot;. That bit beginning with &lt;code&gt;where&lt;/code&gt; says that any type that stands in for &lt;code&gt;T&lt;/code&gt; must derive from (or be) &lt;code&gt;System.Exception&lt;/code&gt;. There are other types of&amp;#x2026; well&amp;#x2026; type constraints that I don't think I'll cover in this post.&lt;/p&gt;
&lt;p&gt;Okay, so what would we need to know to see if a block of code threw a specific exception? Obviously the &lt;em&gt;type&lt;/em&gt; of exception we would expect&amp;#x2014;that's &lt;code&gt;T&lt;/code&gt;. But we would also need the block of code, wouldn't we?&lt;/p&gt;

&lt;h3&gt;Delegates / Anonymous methods&lt;/h3&gt;
&lt;p&gt;Delegates have been in C# since forever. Event handling in Forms (and Web Forms) uses delegates extensively. So what's the big fuss?&lt;/p&gt;
&lt;p&gt;Well, C# 2.0 introduces the very useful concept of anonymous methods. Arbitrary blocks of code that can be passed around and executed at whim.&lt;/p&gt;
&lt;p&gt;Wheras before one had to define a method corresponding to a specific delegate's signature, and then construct the delegate (using syntax that still feels a little odd) before being able to pass it around, you can now say:&lt;/p&gt;
&lt;pre&gt;public delegate void VoidNoArg();

// ...

VoidNoArg myCode = delegate { Console.WriteLine("Hello world!"); };&lt;/pre&gt;
&lt;p&gt;Neat. But how useful can a void, no argument delegate &lt;em&gt;really&lt;/em&gt; be? Very, actually, through the magic of &lt;a href="http://en.wikipedia.org/wiki/Closure_%28computer_science%29"&gt;closures&lt;/a&gt;. That is, you can actually say:&lt;/p&gt;
&lt;pre&gt;string greeting = "Hello world!";

&lt;strike&gt;VoidNoArg myCode = delegate { Console.WriteLine("Hello world!"); };&lt;/strike&gt;
VoidNoArg myCode = delegate { Console.WriteLine(&lt;strong&gt;greeting&lt;/strong&gt;); };

myCode();

// output: Hello world!&lt;/pre&gt;
&lt;p&gt;Note that the anonymous method referrs to a variable outside of its own scope.&lt;/p&gt;

&lt;h3&gt;Putting it together&lt;/h3&gt;
&lt;pre&gt;public static class Assert
{
    public void Throws&amp;lt;T&amp;gt;(VoidNoArg code) where T: Exception {/* ... */}
}

// ...

int i = Int32.MaxValue;
Assert.Throws&amp;lt;OverflowException&amp;gt;(delegate { checked(i + 1); });&lt;/pre&gt;
&lt;p&gt;That's just the tip of the iceberg.&lt;/p&gt;
&lt;p&gt;Delegates can be generic. Classes can be generic. Generic classes can have methods that take generic delegates. The &lt;code&gt;System.Collections.Generic&lt;/code&gt; collections do all of these things. We'll look at this more in a future post&amp;#x2026;&lt;/p&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30125454-115456053430880627?l=jacobcarpenters.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacobcarpenters.blogspot.com/feeds/115456053430880627/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30125454&amp;postID=115456053430880627' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30125454/posts/default/115456053430880627'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30125454/posts/default/115456053430880627'/><link rel='alternate' type='text/html' href='http://jacobcarpenters.blogspot.com/2006/08/generics-and-delegates.html' title='Generics and Delegates'/><author><name>Jacob</name><uri>http://www.blogger.com/profile/07300518452274773472</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30125454.post-115323979437418631</id><published>2006-07-18T09:23:00.000-07:00</published><updated>2006-11-03T09:35:53.386-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><title type='text'>Ruby Closures</title><content type='html'>&lt;p&gt;&lt;a href="http://innig.net/software/ruby/closures-in-ruby.rb"&gt;This guide covering closures in Ruby&lt;/a&gt; by Paul Cantrell is very insightful. It's written as a Ruby script to be both executed and read. Thanks to &lt;a href="http://www.rubyinside.com/"&gt;Ruby Inside&lt;/a&gt; for &lt;a href="http://www.rubyinside.com/getting-down-with-closures-blocks-and-procs-120.html"&gt;linking to it&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30125454-115323979437418631?l=jacobcarpenters.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacobcarpenters.blogspot.com/feeds/115323979437418631/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30125454&amp;postID=115323979437418631' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30125454/posts/default/115323979437418631'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30125454/posts/default/115323979437418631'/><link rel='alternate' type='text/html' href='http://jacobcarpenters.blogspot.com/2006/07/ruby-closures.html' title='Ruby Closures'/><author><name>Jacob</name><uri>http://www.blogger.com/profile/07300518452274773472</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30125454.post-115263332237173383</id><published>2006-07-11T08:55:00.000-07:00</published><updated>2006-11-03T09:35:53.328-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='csharp'/><title type='text'>JSON Serialization Using C# 3.0 Extension Methods</title><content type='html'>&lt;p&gt;This post on &lt;a href="http://keithhill.spaces.msn.com/Blog/cns!5A8D2641E0963A97!515.entry"&gt;JSON Serialization Using Extension Methods&lt;/a&gt; is a nice demonstration of an elegant solution made possible with extension methods. Nice job, Keith.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30125454-115263332237173383?l=jacobcarpenters.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacobcarpenters.blogspot.com/feeds/115263332237173383/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30125454&amp;postID=115263332237173383' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30125454/posts/default/115263332237173383'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30125454/posts/default/115263332237173383'/><link rel='alternate' type='text/html' href='http://jacobcarpenters.blogspot.com/2006/07/json-serialization-using-c-30.html' title='JSON Serialization Using C# 3.0 Extension Methods'/><author><name>Jacob</name><uri>http://www.blogger.com/profile/07300518452274773472</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30125454.post-115231342401762259</id><published>2006-07-07T15:30:00.000-07:00</published><updated>2006-11-03T09:35:53.272-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='csharp'/><title type='text'>Collection&lt;T&gt; and explicit interface implementations</title><content type='html'>&lt;p&gt;Say you're looking at &lt;a href="http://msdn2.microsoft.com/en-us/library/ms132397.aspx"&gt;&lt;code&gt;Collection&amp;lt;T&amp;gt;&lt;/code&gt;&lt;/a&gt; and &lt;a href="http://msdn2.microsoft.com/en-us/library/ms132474.aspx"&gt;&lt;code&gt;ReadOnlyCollection&amp;lt;T&amp;gt;&lt;/code&gt;&lt;/a&gt; in the &lt;a href="http://msdn2.microsoft.com/en-us/library/system.collections.objectmodel.aspx"&gt;System.Collections.ObjectModel namespace&lt;/a&gt;. You think, &amp;#x201C;I could use those! In fact, there's a collection I've been meaning to write for awhile:&amp;#x201D;&lt;/p&gt;
&lt;pre&gt;class StringCollection : Collection&amp;lt;string&amp;gt;
{
    public StringCollection(params string[] strings) : base(strings) { }

    public string Join(string separator)
    {
        // clearly this is not an efficient solution!
        string[] strings = new string[Items.Count];
        Items.CopyTo(strings, 0);

        return String.Join(separator, strings);
    }
}

class Program
{
    static void Main(string[] args)
    {
        StringCollection strings = new StringCollection("one", "two", "three");
        Console.WriteLine(strings.Join(", "));
    }
}

// Output:
// one, two, three&lt;/pre&gt;
&lt;p&gt;Perfect! That's exactly what you expected.&lt;/p&gt;
&lt;p&gt;Next, you decide to modify your program. You want to add another string:&lt;/p&gt;
&lt;pre&gt;static void Main(string[] args)
{
    StringCollection strings = new StringCollection("one", "two", "three");
    strings.Add("four");
    Console.WriteLine(strings.Join(", "));
}&lt;/pre&gt;
&lt;p&gt;Builds fine and&amp;#x2026; &lt;strong&gt;NotSupportedException&lt;/strong&gt; Collection is read-only!&lt;/p&gt;
&lt;p&gt;But wait, we inherited from &lt;code&gt;Collection&amp;lt;T&amp;gt;&lt;/code&gt;, not &lt;code&gt;ReadOnlyCollection&amp;lt;T&amp;gt;&lt;/code&gt;. What gives?&lt;/p&gt;
&lt;p&gt;Well, when we called the base constructor for &lt;code&gt;Collection&amp;lt;T&amp;gt;&lt;/code&gt;, we gave it an &lt;code&gt;IList&amp;lt;string&amp;gt;&lt;/code&gt;. Okay, so really we gave it an &lt;code&gt;Array&lt;/code&gt; of strings, but it was implicitly converted to an &lt;code&gt;IList&amp;lt;string&amp;gt;&lt;/code&gt;. That &lt;code&gt;IList&lt;/code&gt; was stored as a field within the &lt;code&gt;Collection&lt;/code&gt; wrapper (accessible via the protected &lt;code&gt;Items&lt;/code&gt; property).&lt;/p&gt;
&lt;p&gt;Calling &lt;code&gt;Add&lt;/code&gt; calls the &lt;a href="http://www.google.com/search?q=explicit+interface+member+implementation"&gt;explicitly implemented interface member&lt;/a&gt; &lt;a href="http://msdn2.microsoft.com/en-us/library/system.array.system.collections.ilist.add.aspx"&gt;&lt;code&gt;IList.Add&lt;/code&gt;&lt;/a&gt; on the &lt;code&gt;string[]&lt;/code&gt; which (from the docs:) &lt;b&gt;Throws a not supported exception in all cases&lt;/b&gt;.&lt;/p&gt;
&lt;p&gt;So, how can we modify the &lt;code&gt;StringCollection&lt;/code&gt; so that it continues to call the appropriate base constructor, but coerces the &lt;code&gt;string[]&lt;/code&gt; to something a bit more useful?&lt;/p&gt;
&lt;p&gt;One possibility is to check the &lt;code&gt;IsReadOnly&lt;/code&gt; property of the &lt;code&gt;IList&lt;/code&gt; before passing it along, like so:&lt;/p&gt;
&lt;pre&gt;class StringCollection : Collection&amp;lt;string&amp;gt;
{
    public StringCollection() : base() { }
    public StringCollection(params string[] strings) : this((IList&amp;lt;string&amp;gt;) strings) { }
    public StringCollection(IList&amp;lt;string&amp;gt; strings) : base(strings.IsReadOnly ? new List&amp;lt;string&amp;gt;(strings) : strings) { }

    // ...
}&lt;/pre&gt;
&lt;p&gt;I'm sure there are better ways, though. Any ideas?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30125454-115231342401762259?l=jacobcarpenters.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacobcarpenters.blogspot.com/feeds/115231342401762259/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30125454&amp;postID=115231342401762259' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30125454/posts/default/115231342401762259'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30125454/posts/default/115231342401762259'/><link rel='alternate' type='text/html' href='http://jacobcarpenters.blogspot.com/2006/07/collection-and-explicit-interface.html' title='Collection&amp;lt;T&amp;gt; and explicit interface implementations'/><author><name>Jacob</name><uri>http://www.blogger.com/profile/07300518452274773472</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30125454.post-115194324744024470</id><published>2006-07-03T08:55:00.000-07:00</published><updated>2006-11-03T09:35:53.214-08:00</updated><title type='text'>NDoc</title><content type='html'>&lt;p&gt;Right about the time I discovered &lt;a href="http://ndoc.sourceforge.net/"&gt;NDoc&lt;/a&gt;, we started running pre-release bits of the 2.0 .NET Framework. It was pretty frustrating to discover such a useful tool that didn't work at all with the new features. Even more frustrating has been the lack of updates as I've checked back in on the project.&lt;/p&gt;
&lt;p&gt;Well, it turns out &lt;a href="http://jonas.lagerblad.com/blog/"&gt;Jonas Lagerblad&lt;/a&gt; is my &lt;a href="http://jonas.lagerblad.com/blog/?cat=2"&gt;2.0 documentation generation&lt;/a&gt; hero. It looks like the updated NDoc still isn't compatible with Visul Studio 2005 solution files, but pointing at an assembly+generated xml works great. Thanks, Jonas!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30125454-115194324744024470?l=jacobcarpenters.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacobcarpenters.blogspot.com/feeds/115194324744024470/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30125454&amp;postID=115194324744024470' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30125454/posts/default/115194324744024470'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30125454/posts/default/115194324744024470'/><link rel='alternate' type='text/html' href='http://jacobcarpenters.blogspot.com/2006/07/ndoc.html' title='NDoc'/><author><name>Jacob</name><uri>http://www.blogger.com/profile/07300518452274773472</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30125454.post-115171026144190259</id><published>2006-06-30T16:23:00.000-07:00</published><updated>2006-11-03T09:35:53.105-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='csharp'/><title type='text'>Cast Delegate</title><content type='html'>&lt;p&gt;Following my &lt;a href="http://jacobcarpenters.blogspot.com/2006/06/c-30-and-delegate-conversion.html"&gt;previous post&lt;/a&gt;, &lt;a href="http://www.ejball.com/EdAtWork/"&gt;Ed&lt;/a&gt; went ahead and made a (C# 2.0-usable) Multicast-capable version:&lt;/p&gt;
&lt;pre&gt;public static T CastDelegate&amp;lt;T&amp;gt;(Delegate source)
    where T : class
{
    if (source == null)
        return null;

    Delegate[] delegates = source.GetInvocationList();
    if (delegates.Length == 1)
        return Delegate.CreateDelegate(typeof(T), delegates[0].Target, delegates[0].Method) as T;

    for (int i = 0; i &amp;lt; delegates.Length; i++)
        delegates[i] = Delegate.CreateDelegate(typeof(T), delegates[i].Target, delegates[i].Method);
 
    return Delegate.Combine(delegates) as T;
}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30125454-115171026144190259?l=jacobcarpenters.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacobcarpenters.blogspot.com/feeds/115171026144190259/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30125454&amp;postID=115171026144190259' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30125454/posts/default/115171026144190259'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30125454/posts/default/115171026144190259'/><link rel='alternate' type='text/html' href='http://jacobcarpenters.blogspot.com/2006/06/cast-delegate.html' title='Cast Delegate'/><author><name>Jacob</name><uri>http://www.blogger.com/profile/07300518452274773472</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30125454.post-115170226804940465</id><published>2006-06-30T13:52:00.000-07:00</published><updated>2006-11-03T09:35:53.047-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='csharp'/><title type='text'>C# 3.0 and Delegate Conversion</title><content type='html'>&lt;p&gt;&lt;code&gt;System.Query&lt;/code&gt; defines a number of delegate types to help with query expressions. They follow the pattern of:&lt;/p&gt;
&lt;pre&gt;delegate T Func&amp;lt;T&amp;gt;();
delegate T Func&amp;lt;A0, T&amp;gt;(A0 arg0);
delegate T Func&amp;lt;A0, A1, T&amp;gt;(A0 arg0, A1 arg1);
// etc.&lt;/pre&gt;
&lt;p&gt;This is all well and good.&lt;/p&gt;
&lt;p&gt;Certain methods in &lt;code&gt;System.Query.Sequence&lt;/code&gt; take a parameter of &lt;code&gt;Func&amp;lt;T, bool&amp;gt;&lt;/code&gt;. An example is &lt;code&gt;Where&amp;lt;T&amp;gt;(this IEnumerable&amp;lt;T&amp;gt; source, Func&amp;lt;T, bool&amp;gt; predicate)&lt;/code&gt;. Note that the underlying signatures of &lt;code&gt;Func&amp;lt;T, bool&amp;gt;&lt;/code&gt; and &lt;code&gt;Predicate&amp;lt;T&amp;gt;&lt;/code&gt; match.&lt;/p&gt;
&lt;p&gt;Well it turns out that &lt;code&gt;Delegate&lt;/code&gt;s are kind of funky. For one thing, &lt;a href="http://pluralsight.com/blogs/mike/archive/2005/12/06/17307.aspx"&gt;the &lt;code&gt;Delegate&lt;/code&gt; class cannot be used as a generic type constraint&lt;/a&gt;. Also, conversion between compatible types of delegates isn't allowed (that is, you can't cast them).&lt;/p&gt;
&lt;p&gt;That means that if one has a reference to an existing &lt;code&gt;Predicate&amp;lt;T&amp;gt;&lt;/code&gt; one cannot use it as an argument to &lt;code&gt;Where&lt;/code&gt;. I'm sure it won't come up much, because it's not often that one has a reference to a delegate without being able to reach the method that the delegate referrs to, but it could happen.&lt;/p&gt;
&lt;p&gt;The best way I came up with to convert between two types of compatible delegates:&lt;/p&gt;
&lt;pre&gt;
// CS0702: Constraint cannot be special class 'System.Delegate'
public static T ConvertTo&amp;lt;T&amp;gt;(this Delegate source)
    where T : class //, Delegate
{
    if (source.GetInvocationList().Length &gt; 1)
        throw new ArgumentException("Cannot safely convert MulticastDelegate");

    return Delegate.CreateDelegate(typeof(T), source.Target, source.Method) as T;
}&lt;/pre&gt;
&lt;p&gt;This isn't great. Something like the following compiles just fine:&lt;/p&gt;
&lt;pre&gt;Predicate&amp;lt;int&amp;gt; isEven = n =&amp;gt; n % 2 == 0;
MailAddress email = isEven.ConvertTo&amp;lt;MailAddress&amp;gt;();&lt;/pre&gt;
&lt;p&gt;Since &lt;code&gt;Delegate&lt;/code&gt; is invalid as a type constraint, there's not really any way around it. I don't think that will ever cause any difficulty, though.&lt;/p&gt;
&lt;p&gt;More subtly evil, however, is that conversion between incompatible delegates will appear to work fine at compile time, but result in a runtime error. Oh well. At least now I can do this:&lt;/p&gt;
&lt;pre&gt;int[] numbers = { 1, 2, 3, 4, 5 };
Predicate&amp;lt;int&amp;gt; isEven = n =&amp;gt; n % 2 == 0;
foreach (var n in numbers.Where(isEven.ConvertTo&amp;lt;Func&amp;lt;int, bool&amp;gt;&amp;gt;()))
    Console.WriteLine(n);

// Output:
// 2
// 4&lt;/pre&gt;
&lt;p&gt;&amp;#x2026; not that I ever would&amp;#x2026;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Update:&lt;/b&gt; the &lt;a href="http://jacobcarpenters.blogspot.com/2006/06/cast-delegate.html"&gt;delegate conversion method has been extended/updated&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30125454-115170226804940465?l=jacobcarpenters.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacobcarpenters.blogspot.com/feeds/115170226804940465/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30125454&amp;postID=115170226804940465' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30125454/posts/default/115170226804940465'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30125454/posts/default/115170226804940465'/><link rel='alternate' type='text/html' href='http://jacobcarpenters.blogspot.com/2006/06/c-30-and-delegate-conversion.html' title='C# 3.0 and Delegate Conversion'/><author><name>Jacob</name><uri>http://www.blogger.com/profile/07300518452274773472</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30125454.post-115159821517155313</id><published>2006-06-29T09:21:00.000-07:00</published><updated>2006-11-03T09:35:52.980-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='visual studio'/><title type='text'>Best Visual Studio Help Option</title><content type='html'>&lt;p&gt;Best Visual Studio Help option I've unchecked, today: &lt;kbd&gt;Tools &amp;gt; Options &amp;gt; General: Reuse topic window&lt;/kbd&gt;. Now hitting &lt;kbd&gt;F1&lt;/kbd&gt; in Visual studio is a lot more like my web browsing experience (external links open a new tab within Firefox). &lt;kbd&gt;Ctrl-F4&lt;/kbd&gt; or middle-click the tab to close it.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Update:&lt;/b&gt; to be clear, I'm talking about Help/Documentation Viewer/what used to be called MSDN; not actually Visual Studio itself.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30125454-115159821517155313?l=jacobcarpenters.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacobcarpenters.blogspot.com/feeds/115159821517155313/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30125454&amp;postID=115159821517155313' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30125454/posts/default/115159821517155313'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30125454/posts/default/115159821517155313'/><link rel='alternate' type='text/html' href='http://jacobcarpenters.blogspot.com/2006/06/best-visual-studio-help-option.html' title='Best Visual Studio Help Option'/><author><name>Jacob</name><uri>http://www.blogger.com/profile/07300518452274773472</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30125454.post-115145461579977537</id><published>2006-06-27T17:28:00.000-07:00</published><updated>2006-11-03T09:35:52.908-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='csharp'/><title type='text'>Testing internal code</title><content type='html'>&lt;p&gt;A few upfront assertions:&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;Unit testing is good. For C# code I use &lt;a href="http://www.nunit.org/"&gt;NUnit&lt;/a&gt; (along with &lt;a href="http://www.testdriven.net/"&gt;TestDriven.NET&lt;/a&gt;).&lt;/li&gt;
  &lt;li&gt;Languages (including C#) have been designed with the
    &lt;code&gt;internal&lt;/code&gt; keyword for a reason. There are legitimate uses for
    something that's accessible only within one's own assembly.&lt;/li&gt;
  &lt;li&gt;These &lt;code&gt;internal&lt;/code&gt; classes/methods are reasonable candidates
    for unit testing.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So, how do you test &lt;code&gt;internal&lt;/code&gt; bits without compiling test code
into your deliverable assembly?&lt;/p&gt;

&lt;p&gt;It turns out that it's trivial (in the .NET 2.0 Framework): &lt;a href="http://msdn2.microsoft.com/en-us/library/0tke9fxk.aspx"&gt;Friend
Assemblies&lt;/a&gt; (&lt;a href="http://msdn2.microsoft.com/en-us/library/system.runtime.compilerservices.internalsvisibletoattribute.aspx"&gt;see also&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Say you have two projects: &lt;samp&gt;MyCoolAssembly&lt;/samp&gt; and &lt;samp&gt;MyCoolAssembly.UnitTests&lt;/samp&gt;.&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;In your &lt;samp&gt;MyCoolAssembly&lt;/samp&gt;, open up the
    Properties/AssemblyInfo.cs.&lt;/li&gt;
  &lt;li&gt;Add &lt;code&gt;[assembly:
    InternalsVisibleTo("MyCoolAssembly.UnitTests")]&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it! Now, &lt;samp&gt;MyCoolAssembly.UnitTests&lt;/samp&gt; can access all of
the &lt;code&gt;internal&lt;/code&gt; classes/methods within
&lt;samp&gt;MyCoolAssembly&lt;/samp&gt;.&lt;/p&gt;

&lt;p&gt;No conditional compilation symbols. No messy inner classes. Problem
solved.&lt;/p&gt;

&lt;p&gt;I found out about this useful attribute in &lt;a href="http://www.microsoft.com/MSPress/books/6522.asp"&gt;CLR via C#&lt;/a&gt;, but
Jay Bazuzi (whose &lt;a href="http://blogs.msdn.com/jaybaz_MS/"&gt;blog&lt;/a&gt; I'd
really like to read except that he apparently doesn't post anymore) had
already &lt;a href="http://blogs.msdn.com/jaybaz_ms/archive/2004/09/09/227602.aspx"&gt;blogged
about this very usage&lt;/a&gt; back in September of 2004.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30125454-115145461579977537?l=jacobcarpenters.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacobcarpenters.blogspot.com/feeds/115145461579977537/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30125454&amp;postID=115145461579977537' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30125454/posts/default/115145461579977537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30125454/posts/default/115145461579977537'/><link rel='alternate' type='text/html' href='http://jacobcarpenters.blogspot.com/2006/06/testing-internal-code.html' title='Testing internal code'/><author><name>Jacob</name><uri>http://www.blogger.com/profile/07300518452274773472</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30125454.post-115104242508055332</id><published>2006-06-22T22:53:00.000-07:00</published><updated>2006-11-03T09:35:52.846-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='csharp'/><title type='text'>Ruby's Enumerable mixin again</title><content type='html'>&lt;style type="text/css"&gt;
TABLE#RubyEnumerableToCSharp { border-collapse: collapse; border: none; }
#RubyEnumerableToCSharp TD { border: solid 1px #ddd; vertical-align: bottom; padding: .5em; }
#RubyEnumerableToCSharp TD CODE { white-space: nowrap; }
&lt;/style&gt;


&lt;p&gt;On the topic of Ruby's Enumerable mixin, it might be interesting to
compare them to C# 2.0's Array/List&amp;lt;T&amp;gt; methods&amp;#x2014;static for Array, instance for List&amp;lt;T&amp;gt;&amp;#x2014;and 3.0's Standard Query
Operators (&lt;code&gt;System.Query&lt;/code&gt; namespace).&lt;/p&gt;

&lt;p&gt;In the cases where C# does not support the method, I'd recommend following the link to the ruby docs. There are some rather interesting methods, and a lot can be learned from looking at what other languages support. In fact, some of these methods (&lt;code&gt;each_slice&lt;/code&gt;, &lt;code&gt;each_with_index&lt;/code&gt;) might be worth implementing as extension methods in C# (a trivial excercise left to the reader).&lt;/p&gt;

&lt;table id="RubyEnumerableToCSharp"&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;th&gt;Ruby Enumerable&lt;/th&gt;
      &lt;th&gt;C# 2.0 Array/List&amp;lt;T&amp;gt; methods*&lt;/th&gt;
      &lt;th&gt;C# 3.0 System.Query&lt;/th&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;&lt;a href="http://www.ruby-doc.org/core/classes/Enumerable.html#M003124"&gt;all?&lt;/a&gt;&lt;/code&gt;&lt;br&gt;
        &lt;code&gt;&lt;a href="http://www.ruby-doc.org/core/classes/Enumerable.html#M003124"&gt;all?
        { |obj| block }&lt;/a&gt;&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;bool TrueForAll(Predicate&amp;lt;T&amp;gt; match)&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;bool All&amp;lt;T&amp;gt;(this IEnumerable&amp;lt;T&amp;gt; source,
        Func&amp;lt;T, bool&amp;gt; predicate)&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;&lt;a href="http://www.ruby-doc.org/core/classes/Enumerable.html#M003125"&gt;any?&lt;/a&gt;&lt;/code&gt;&lt;br&gt;
        &lt;code&gt;&lt;a href="http://www.ruby-doc.org/core/classes/Enumerable.html#M003125"&gt;any?
        { |obj| block }&lt;/a&gt;&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;bool Exists(Predicate&amp;lt;T&amp;gt; match)&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;bool Any&amp;lt;T&amp;gt;(this IEnumerable&amp;lt;T&amp;gt; source,
        Func&amp;lt;T, bool&amp;gt; predicate)&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;&lt;a href="http://www.ruby-doc.org/core/classes/Enumerable.html#M003120"&gt;collect
        { |obj| block }&lt;/a&gt;&lt;/code&gt;&lt;br&gt;
        &lt;code&gt;&lt;a href="http://www.ruby-doc.org/core/classes/Enumerable.html#M003121"&gt;map
        { |obj| block}&lt;/a&gt;&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;List&amp;lt;TOutput&amp;gt; ConvertAll&amp;lt;TOutput&amp;gt;(Converter&amp;lt;T,
        TOutput&amp;gt; converter)&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;IEnumerable&amp;lt;S&amp;gt; Select&amp;lt;T, S&amp;gt;(this
        IEnumerable&amp;lt;T&amp;gt; source, Func&amp;lt;T, S&amp;gt; selector)&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;&lt;a href="http://www.ruby-doc.org/core/classes/Enumerable.html#M003116"&gt;detect(ifnone
        = nil) { |obj| block }&lt;/a&gt;&lt;/code&gt;&lt;br&gt;
        &lt;code&gt;&lt;a href="http://www.ruby-doc.org/core/classes/Enumerable.html#M003115"&gt;find(ifnone
        = nil) { |obj| block }&lt;/a&gt;&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;T Find(Predicate&amp;lt;T&amp;gt; match)&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;T First&amp;lt;T&amp;gt;(this IEnumerable&amp;lt;T&amp;gt; source, Func&amp;lt;T,
        bool&amp;gt; predicate)&lt;/code&gt;&lt;br&gt;
        &lt;code&gt;T FirstOrDefault&amp;lt;T&amp;gt;(this IEnumerable&amp;lt;T&amp;gt; source,
        Func&amp;lt;T, bool&amp;gt; predicate)&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;&lt;a href="http://www.ruby-doc.org/core/classes/Enumerable.html#M003136"&gt;each_cons(n)
        {...}&lt;/a&gt;&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;/td&gt;
      &lt;td&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;&lt;a href="http://www.ruby-doc.org/core/classes/Enumerable.html#M003134"&gt;each_slice(n)
        {...}&lt;/a&gt;&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;/td&gt;
      &lt;td&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;&lt;a href="http://www.ruby-doc.org/core/classes/Enumerable.html#M003130"&gt;each_with_index
        { |obj, index| block }&lt;/a&gt;&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;/td&gt;
      &lt;td&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;&lt;a href="http://www.ruby-doc.org/core/classes/Enumerable.html#M003110"&gt;to_a&lt;/a&gt;&lt;/code&gt;&lt;br&gt;
        &lt;code&gt;&lt;a href="http://www.ruby-doc.org/core/classes/Enumerable.html#M003111"&gt;entries&lt;/a&gt;&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;T[] ToArray&amp;lt;T&amp;gt;(this IEnumerable&amp;lt;T&amp;gt;
        source)&lt;/code&gt;&lt;br&gt;
        &lt;code&gt;List&amp;lt;T&amp;gt; ToList&amp;lt;T&amp;gt;(this IEnumerable&amp;lt;T&amp;gt;
        source)&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;&lt;a href="http://www.ruby-doc.org/core/classes/Enumerable.html#M003117"&gt;find_all
        { |obj| block }&lt;/a&gt;&lt;/code&gt;&lt;br&gt;
        &lt;code&gt;&lt;a href="http://www.ruby-doc.org/core/classes/Enumerable.html#M003118"&gt;select
        { |obj| block }&lt;/a&gt;&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;List&amp;lt;T&amp;gt; FindAll(Predicate&amp;lt;T&amp;gt; match)&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;IEnumerable&amp;lt;T&amp;gt; Where(this IEnumerable&amp;lt;T&amp;gt; source,
        Func&amp;lt;T, bool&amp;gt; predicate)&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;&lt;a href="http://www.ruby-doc.org/core/classes/Enumerable.html#M003114"&gt;grep(pattern)&lt;/a&gt;&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;FindAll&lt;/code&gt; could certainly specify a predicate that
        applied a regular expression against each item of the collection.&lt;/td&gt;
      &lt;td&gt;same for &lt;code&gt;Where&lt;/code&gt;.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;&lt;a href="http://www.ruby-doc.org/core/classes/Enumerable.html#M003129"&gt;include?(obj)&lt;/a&gt;&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;bool Contains(T item)&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;&lt;a href="http://www.ruby-doc.org/core/classes/Enumerable.html#M003122"&gt;inject(initial)
        { |memo, obj| block }&lt;/a&gt;&lt;/code&gt;&lt;code&gt;&lt;br&gt;
        &lt;a href="http://www.ruby-doc.org/core/classes/Enumerable.html#M003122"&gt;inject
        { |memo, obj| block }&lt;/a&gt;&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;U Aggregate&amp;lt;T, U&amp;gt;(this IEnumerable&amp;lt;T&amp;gt; source, U
        seed, Func&amp;lt;U, T, U&amp;gt; func)&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;&lt;a href="http://www.ruby-doc.org/core/classes/Enumerable.html#M003127"&gt;max&lt;/a&gt;
        / &lt;a href="http://www.ruby-doc.org/core/classes/Enumerable.html#M003126"&gt;min&lt;/a&gt;&lt;/code&gt;&lt;br&gt;
        &lt;code&gt;&lt;a href="http://www.ruby-doc.org/core/classes/Enumerable.html#M003127"&gt;max&lt;/a&gt;
        / &lt;a href="http://www.ruby-doc.org/core/classes/Enumerable.html#M003126"&gt;min&lt;/a&gt;
        { |a, b| block }&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;T Max/Min&amp;lt;T&amp;gt;(this IEnumerable&amp;lt;T&amp;gt; source)&lt;/code&gt;,
        etc. Note that while there are a few overloads for this method, it
        looks like the delegates passed in merely provide value extraction. I
        don't see an overload where you can provide your own
        &lt;code&gt;IComparer&amp;lt;T&amp;gt;&lt;/code&gt; (which is what the second Ruby method
        does)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;&lt;a href="http://www.ruby-doc.org/core/classes/Enumerable.html#M003123"&gt;partition
        { |obj| block }&lt;/a&gt;&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;/td&gt;
      &lt;td&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;&lt;a href="http://www.ruby-doc.org/core/classes/Enumerable.html#M003119"&gt;reject
        { |obj| block }&lt;/a&gt; &lt;/code&gt;merely returns the collection of the
        inverse of &lt;code&gt;&lt;a href="http://www.ruby-doc.org/core/classes/Enumerable.html#M003117"&gt;find_all&lt;/a&gt;&lt;/code&gt;
        / &lt;code&gt;&lt;a href="http://www.ruby-doc.org/core/classes/Enumerable.html#M003118"&gt;select&lt;/a&gt;&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;/td&gt;
      &lt;td&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;&lt;a href="http://www.ruby-doc.org/core/classes/Enumerable.html#M003112"&gt;sort&lt;/a&gt;&lt;/code&gt;&lt;br&gt;
        &lt;code&gt;&lt;a href="http://www.ruby-doc.org/core/classes/Enumerable.html#M003112"&gt;sort
        { |a, b | block }&lt;/a&gt;&lt;/code&gt;&lt;br&gt;
        &lt;code&gt;&lt;a href="http://www.ruby-doc.org/core/classes/Enumerable.html#M003113"&gt;sort_by
        { |obj| block }&lt;/a&gt;&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;Sort()&lt;/code&gt;&lt;br&gt;
        &lt;code&gt;Sort(IComparer&amp;lt;T&amp;gt; comparison)&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;OrderedSequence&amp;lt;T, K&amp;gt;
        OrderBy/OrderByDescending/ThenBy/ThenByDescending(&lt;br/&gt;&amp;nbsp;&amp;nbsp;this
        IEnumerable&amp;lt;T&amp;gt; source, Func&amp;lt;T, K&amp;gt; keySelector)&lt;/code&gt;&lt;br&gt;
        &lt;code&gt;OrderedSequence&amp;lt;T&amp;gt;
        OrderBy/OrderByDescending/ThenBy/ThenByDescending(&lt;br/&gt;&amp;nbsp;&amp;nbsp;this
        IEnumerable&amp;lt;T&amp;gt; source, Func&amp;lt;T, K&amp;gt; keySelector,
        IComparer&amp;lt;K&amp;gt; comparer)&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;&lt;a href="http://www.ruby-doc.org/core/classes/Enumerable.html#M003132"&gt;to_set&lt;/a&gt;&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;/td&gt;
      &lt;td&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;&lt;a href="http://www.ruby-doc.org/core/classes/Enumerable.html#M003131"&gt;zip(arg,
        ...)&lt;/a&gt;&lt;/code&gt;&lt;br&gt;
        &lt;code&gt;&lt;a href="http://www.ruby-doc.org/core/classes/Enumerable.html#M003131"&gt;zip(arg,
        ...) { |arr| block }&lt;/a&gt;&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;/td&gt;
      &lt;td&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30125454-115104242508055332?l=jacobcarpenters.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacobcarpenters.blogspot.com/feeds/115104242508055332/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30125454&amp;postID=115104242508055332' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30125454/posts/default/115104242508055332'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30125454/posts/default/115104242508055332'/><link rel='alternate' type='text/html' href='http://jacobcarpenters.blogspot.com/2006/06/rubys-enumerable-mixin-again.html' title='Ruby&apos;s Enumerable mixin again'/><author><name>Jacob</name><uri>http://www.blogger.com/profile/07300518452274773472</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30125454.post-115104141933837580</id><published>2006-06-22T22:41:00.000-07:00</published><updated>2006-11-03T09:35:52.788-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='csharp'/><title type='text'>Enumerable mixin</title><content type='html'>&lt;p&gt;I really like Ruby's &lt;a href="http://www.ruby-doc.org/core/classes/Enumerable.html"&gt;Enumerable mixin&lt;/a&gt;. Methods like &lt;code&gt;each_slice&lt;/code&gt; and &lt;code&gt;each_with_index&lt;/code&gt; can inspire some really straightforward, elegant solutions.&lt;/p&gt;

&lt;p&gt;Porting such a library to C# is trivial, but having to use the 2.0's verbose delegate syntax detracts from the coolness a bit. Using 3.0's lambda expressions on the other hand…&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30125454-115104141933837580?l=jacobcarpenters.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacobcarpenters.blogspot.com/feeds/115104141933837580/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30125454&amp;postID=115104141933837580' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30125454/posts/default/115104141933837580'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30125454/posts/default/115104141933837580'/><link rel='alternate' type='text/html' href='http://jacobcarpenters.blogspot.com/2006/06/enumerable-mixin.html' title='Enumerable mixin'/><author><name>Jacob</name><uri>http://www.blogger.com/profile/07300518452274773472</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30125454.post-115102521098662800</id><published>2006-06-22T18:11:00.000-07:00</published><updated>2006-11-03T09:35:52.726-08:00</updated><title type='text'></title><content type='html'>Okay, blogger's template is obviously not well suited to &lt;code&gt;pre&lt;/code&gt;formatted text. I should try and fix that sometime…&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30125454-115102521098662800?l=jacobcarpenters.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacobcarpenters.blogspot.com/feeds/115102521098662800/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30125454&amp;postID=115102521098662800' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30125454/posts/default/115102521098662800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30125454/posts/default/115102521098662800'/><link rel='alternate' type='text/html' href='http://jacobcarpenters.blogspot.com/2006/06/okay-bloggers-template-is-obviously.html' title=''/><author><name>Jacob</name><uri>http://www.blogger.com/profile/07300518452274773472</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30125454.post-115102446333257923</id><published>2006-06-22T17:57:00.000-07:00</published><updated>2006-11-03T09:35:52.659-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='csharp'/><title type='text'>Ruby and C#</title><content type='html'>&lt;h3&gt;Ruby&lt;/h3&gt;
&lt;pre&gt;numbers = [1, 2, 3, 4, 5]
is_even = proc { |n| (n.modulo 2).zero? }

(numbers.map {|n| "#{n} #{is_even[n] ? 'is' : 'is not'} even"}).each {|summary| puts summary}&lt;/pre&gt;

&lt;h3&gt;C# 3.0&lt;/h3&gt;
&lt;pre&gt;int[] numbers = {1, 2, 3, 4, 5};
Predicate&amp;lt;int&amp;gt; isEven = n =&amp;gt; n % 2 == 0;

Array.ForEach(numbers, n =&amp;gt; Console.WriteLine("{0} {1} even", n, isEven(n) ? "is" : "is not"));&lt;/pre&gt;

&lt;p&gt;or if you prefer...&lt;/p&gt;

&lt;pre&gt;&lt;strike&gt;Array.ForEach(numbers, n =&amp;gt; Console.WriteLine("{0} {1} even", n, isEven(n) ? "is" : "is not"));&lt;/strike&gt;

numbers.Each(n =&amp;gt; Console.WriteLine("{0} {1} even", n, isEven(n) ? "is" : "is not"));


// elsewhere
public static class EnumerableExtensions
{
  public static void Each&amp;lt;T&amp;gt;(this IEnumerable&amp;lt;T&amp;gt; collection, Action&amp;lt;T&amp;gt; action)
  {
    foreach (T item in collection)
      action(item);
  }
}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30125454-115102446333257923?l=jacobcarpenters.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacobcarpenters.blogspot.com/feeds/115102446333257923/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30125454&amp;postID=115102446333257923' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30125454/posts/default/115102446333257923'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30125454/posts/default/115102446333257923'/><link rel='alternate' type='text/html' href='http://jacobcarpenters.blogspot.com/2006/06/ruby-and-c.html' title='Ruby and C#'/><author><name>Jacob</name><uri>http://www.blogger.com/profile/07300518452274773472</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30125454.post-115102023030255632</id><published>2006-06-22T16:48:00.000-07:00</published><updated>2006-11-03T09:35:52.591-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='csharp'/><title type='text'>C# and Ruby</title><content type='html'>&lt;p&gt;Searching Google for &lt;a href="http://www.google.com/search?q=c%23%20ruby"&gt;C# Ruby&lt;/a&gt; sure yields some interesting articles. I hope to add to the mix in the coming weeks as I play around with the C# 3.0/LINQ May CTP.&lt;/p&gt;

&lt;p&gt;Stay tuned…&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30125454-115102023030255632?l=jacobcarpenters.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacobcarpenters.blogspot.com/feeds/115102023030255632/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30125454&amp;postID=115102023030255632' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30125454/posts/default/115102023030255632'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30125454/posts/default/115102023030255632'/><link rel='alternate' type='text/html' href='http://jacobcarpenters.blogspot.com/2006/06/c-and-ruby.html' title='C# and Ruby'/><author><name>Jacob</name><uri>http://www.blogger.com/profile/07300518452274773472</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>
