<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>porges &#187; IEnumerable</title>
	<atom:link href="http://porg.es/blog/tag/ienumerable/feed" rel="self" type="application/rss+xml" />
	<link>http://porg.es/blog</link>
	<description>... master of none</description>
	<lastBuildDate>Sun, 22 Aug 2010 21:36:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Implementing IEnumerable easily</title>
		<link>http://porg.es/blog/implementing-ienumerable-easily</link>
		<comments>http://porg.es/blog/implementing-ienumerable-easily#comments</comments>
		<pubDate>Fri, 04 Apr 2008 09:43:02 +0000</pubDate>
		<dc:creator>Porges</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[IEnumerable]]></category>

		<guid isPermaLink="false">http://porg.es/blog/?p=125</guid>
		<description><![CDATA[Say that you’re implementing a linked list, and you want an enumerator: public IEnumerator&#60;T&#62; GetEnumerator&#40;&#41; &#123; return new Stream&#60;T,Node&#62;&#40;first, node =&#62; node.next == null ? null : Tuple.Of&#40;node.next, node.datum&#41;.AsNullable&#40;&#41;&#41;; &#125; This uses the following utility class to implement the enumerator in one line (along with some code for Tuples and an extension method for structs): [...]]]></description>
			<content:encoded><![CDATA[<p>Say that you’re implementing a linked list, and you want an enumerator:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">public</span> IEnumerator<span style="color: #008000;">&lt;</span>T<span style="color: #008000;">&gt;</span> GetEnumerator<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">return</span> <span style="color: #008000;">new</span> Stream<span style="color: #008000;">&lt;</span>T,Node<span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span>first,
        node <span style="color: #008000;">=&gt;</span> node.<span style="color: #0000FF;">next</span> <span style="color: #008000;">==</span> <span style="color: #0600FF;">null</span> <span style="color: #008000;">?</span> <span style="color: #0600FF;">null</span> <span style="color: #008000;">:</span> Tuple.<span style="color: #0000FF;">Of</span><span style="color: #000000;">&#40;</span>node.<span style="color: #0000FF;">next</span>, node.<span style="color: #0000FF;">datum</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">AsNullable</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>This uses the following utility class to implement the enumerator in one line (along with some code for Tuples and an extension method for structs):</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">public</span> <span style="color: #FF0000;">class</span> Stream<span style="color: #008000;">&lt;</span>Tdata, Tstate<span style="color: #008000;">&gt;</span> <span style="color: #008000;">:</span> IEnumerator<span style="color: #008000;">&lt;</span>Tdata<span style="color: #008000;">&gt;</span>
<span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">private</span> Tdata current<span style="color: #008000;">;</span>
    <span style="color: #0600FF;">private</span> Tstate initialState<span style="color: #008000;">;</span>
    <span style="color: #0600FF;">private</span> Tstate state<span style="color: #008000;">;</span>
    <span style="color: #0600FF;">private</span> Func<span style="color: #008000;">&lt;</span>Tstate, Pair<span style="color: #008000;">&lt;</span>Tstate, Tdata<span style="color: #008000;">&gt;?&gt;</span> moveNext<span style="color: #008000;">;</span>
&nbsp;
    <span style="color: #0600FF;">public</span> Stream<span style="color: #000000;">&#40;</span>Tstate initialState, Func<span style="color: #008000;">&lt;</span>Tstate, Pair<span style="color: #008000;">&lt;</span>Tstate, Tdata<span style="color: #008000;">&gt;?&gt;</span> calcNextValue<span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        moveNext <span style="color: #008000;">=</span> calcNextValue<span style="color: #008000;">;</span>
        <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">initialState</span> <span style="color: #008000;">=</span> initialState<span style="color: #008000;">;</span>
        Reset<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #008080;">#region IEnumerator&lt;Tdata&gt; Members</span>
&nbsp;
    <span style="color: #0600FF;">public</span> Tdata Current
    <span style="color: #000000;">&#123;</span>
        get <span style="color: #000000;">&#123;</span> <span style="color: #0600FF;">return</span> current<span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span>
    <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #008080;">#endregion</span>
&nbsp;
    <span style="color: #008080;">#region IDisposable Members</span>
&nbsp;
    <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">void</span> Dispose<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        Dispose<span style="color: #000000;">&#40;</span><span style="color: #0600FF;">true</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        GC.<span style="color: #0000FF;">SuppressFinalize</span><span style="color: #000000;">&#40;</span><span style="color: #0600FF;">this</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF;">protected</span> <span style="color: #0600FF;">void</span> Dispose<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">bool</span> disposing<span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>disposing<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            var disposeCurrent <span style="color: #008000;">=</span> current <span style="color: #0600FF;">as</span> IDisposable<span style="color: #008000;">;</span>
            <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>disposeCurrent <span style="color: #008000;">!=</span> <span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span>
                disposeCurrent.<span style="color: #0000FF;">Dispose</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            var disposeState <span style="color: #008000;">=</span> state <span style="color: #0600FF;">as</span> IDisposable<span style="color: #008000;">;</span>
            <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>disposeState <span style="color: #008000;">!=</span> <span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span>
            <span style="color: #000000;">&#123;</span>
                disposeState.<span style="color: #0000FF;">Dispose</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
                <span style="color: #008080; font-style: italic;">//safe; have checked already above.</span>
                <span style="color: #008080; font-style: italic;">//type of state == type of initialstate</span>
                <span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span>IDisposable<span style="color: #000000;">&#41;</span>initialState<span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">Dispose</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #000000;">&#125;</span>
        <span style="color: #000000;">&#125;</span>
    <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #008080;">#endregion</span>
&nbsp;
    <span style="color: #008080;">#region IEnumerator Members</span>
&nbsp;
    <span style="color: #FF0000;">object</span> <span style="color: #000000;">System.<span style="color: #0000FF;">Collections</span></span>.<span style="color: #0000FF;">IEnumerator</span>.<span style="color: #0000FF;">Current</span>
    <span style="color: #000000;">&#123;</span>
        get <span style="color: #000000;">&#123;</span> <span style="color: #0600FF;">return</span> current<span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span>
    <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">bool</span> MoveNext<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        var result <span style="color: #008000;">=</span> moveNext<span style="color: #000000;">&#40;</span>state<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
        <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>result.<span style="color: #0000FF;">HasValue</span><span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            current <span style="color: #008000;">=</span> result.<span style="color: #0000FF;">Value</span>.<span style="color: #0000FF;">Right</span><span style="color: #008000;">;</span>
            state <span style="color: #008000;">=</span> result.<span style="color: #0000FF;">Value</span>.<span style="color: #0000FF;">Left</span><span style="color: #008000;">;</span>
            <span style="color: #0600FF;">return</span> true<span style="color: #008000;">;</span>
        <span style="color: #000000;">&#125;</span>
        <span style="color: #0600FF;">else</span>
            <span style="color: #0600FF;">return</span> false<span style="color: #008000;">;</span>
    <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">void</span> Reset<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        state <span style="color: #008000;">=</span> initialState<span style="color: #008000;">;</span>
    <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #008080;">#endregion</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://porg.es/blog/implementing-ienumerable-easily/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
