<feed xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns="http://www.w3.org/2005/Atom" xml:lang="sv-SE">
    <title>Morgan Persson</title>
    <link rel="self" type="application/xml" href="http://geekswithblogs.net/Lazydev/Atom.aspx" />
    <subtitle type="html"> </subtitle>
    <id>http://geekswithblogs.net/Lazydev/Default.aspx</id>
    <author>
        <name>Lazydev</name>
        <uri>http://geekswithblogs.net/Lazydev/Default.aspx</uri>
    </author>
    <generator uri="http://subtextproject.com" version="Subtext Version 0.0.0.0">Subtext</generator>
    <updated>2012-01-08T22:13:10Z</updated>
    <entry>
        <title>My take on TDD &amp;amp; binary search</title>
        <link rel="self" type="text/html" href="http://geekswithblogs.net/Lazydev/archive/2012/01/08/my-take-on-tdd-amp-binary-search.aspx" />
        <id>http://geekswithblogs.net/Lazydev/archive/2012/01/08/my-take-on-tdd-amp-binary-search.aspx</id>
        <published>2012-01-08T16:06:2901:00:00</published>
        <updated>2012-01-08T22:13:10Z</updated>
        <content type="html">&lt;p&gt;Jason Gorman blogged about TDD and &lt;a href="http://codemanship.co.uk/parlezuml/blog/?postid=1077" target="_blank"&gt;binary search&lt;/a&gt;. He also followed up with a &lt;a href="http://codemanship.co.uk/parlezuml/blog/?postid=1078" target="_blank"&gt;2nd take&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;The question Jason raised was, will you end up with binary search using TDD. Jason also mentions Uncle Bob's &lt;a href="http://cleancoder.posterous.com/the-transformation-priority-premise" target="_blank"&gt;transformation priority premise&lt;/a&gt; which is an interesting idea.     &lt;br /&gt;Looking at Jason's attempts I thought that maybe you could take even smaller steps, I couldn’t resist to try so here’s how I did it.&lt;/p&gt;  &lt;p&gt;My first test is the same as Jason's:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;[Test]
&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; When_key_is_not_found_index_returned_is_minus_one()
{
    Assert.AreEqual(-1, &lt;span class="kwrd"&gt;new&lt;/span&gt; BinarySearch().FindIndexOf(&lt;span class="kwrd"&gt;new&lt;/span&gt;[] { 0 }, 1));
}&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;This test is easily solved by returning a constant (-1)&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; FindIndexOf(&lt;span class="kwrd"&gt;int&lt;/span&gt;[] values, &lt;span class="kwrd"&gt;int&lt;/span&gt; toFind)
{
    &lt;span class="kwrd"&gt;return&lt;/span&gt; -1;
}&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;Next test, lets try to find a value in a list. 
  &lt;br /&gt;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;[Test]
&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Index_of_key_value_1_in_list_1_is_0()
{
    Assert.AreEqual(0, &lt;span class="kwrd"&gt;new&lt;/span&gt; BinarySearch().FindIndexOf(&lt;span class="kwrd"&gt;new&lt;/span&gt;[] { 1 }, 1));
}&lt;/pre&gt;
Which I solved with introducing an if statement. 

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; FindIndexOf(&lt;span class="kwrd"&gt;int&lt;/span&gt;[] values, &lt;span class="kwrd"&gt;int&lt;/span&gt; toFind)
{
    &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; index = 0;
    &lt;span class="kwrd"&gt;if&lt;/span&gt; (values[index] == toFind)
        &lt;span class="kwrd"&gt;return&lt;/span&gt; index;
    &lt;span class="kwrd"&gt;return&lt;/span&gt; -1;
}&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;Test number three, lets try a list with 2 numbers. &lt;/p&gt;

&lt;pre class="csharpcode"&gt;[Test]
&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Index_of_key_value_2_in_list_1_2_is_1()
{
    Assert.AreEqual(1, &lt;span class="kwrd"&gt;new&lt;/span&gt; BinarySearch().FindIndexOf(&lt;span class="kwrd"&gt;new&lt;/span&gt;[] { 1, 2 }, 2));
}&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;Which I solved with transforming the index constant to scalar, or is it a constant+ ? &lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; FindIndexOf(&lt;span class="kwrd"&gt;int&lt;/span&gt;[] values, &lt;span class="kwrd"&gt;int&lt;/span&gt; toFind)
{
    var index = values.Length - 1;
    &lt;span class="kwrd"&gt;if&lt;/span&gt; (values[index] == toFind)
        &lt;span class="kwrd"&gt;return&lt;/span&gt; index;
    &lt;span class="kwrd"&gt;return&lt;/span&gt; -1;
}&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;br /&gt;So next test, how do I break this code? 

&lt;br /&gt;Well, I can break this by looking for a 1 in a list with numbers 1,2. This is a pretty small step I think. 

&lt;br /&gt;

&lt;pre class="csharpcode"&gt;[Test]
&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Index_of_key_value_1_in_list_1_2_is_0()
{
    Assert.AreEqual(0, &lt;span class="kwrd"&gt;new&lt;/span&gt; BinarySearch().FindIndexOf(&lt;span class="kwrd"&gt;new&lt;/span&gt;[] { 1, 2 }, 1));
}&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;In the implementation code I renamed index to upperBound and added another if statement to check the value in the lower bound of the list. 
  &lt;br /&gt;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; FindIndexOf(&lt;span class="kwrd"&gt;int&lt;/span&gt;[] values, &lt;span class="kwrd"&gt;int&lt;/span&gt; toFind)
{
    var upperBound = values.Length - 1;
    &lt;span class="kwrd"&gt;if&lt;/span&gt; (values[upperBound] == toFind)
        &lt;span class="kwrd"&gt;return&lt;/span&gt; upperBound;
    &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; lowerBound = 0;
    &lt;span class="kwrd"&gt;if&lt;/span&gt; (values[lowerBound] == toFind)
        &lt;span class="kwrd"&gt;return&lt;/span&gt; lowerBound;
    &lt;span class="kwrd"&gt;return&lt;/span&gt; -1;
}&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;Which I then refactored into &lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; FindIndexOf(&lt;span class="kwrd"&gt;int&lt;/span&gt;[] values, &lt;span class="kwrd"&gt;int&lt;/span&gt; toFind)
{
    &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; lowerBound = 0;
    var upperBound = values.Length - 1;
    &lt;span class="kwrd"&gt;return&lt;/span&gt; FindIndexOf(values, toFind, lowerBound, upperBound);
}

&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; FindIndexOf(&lt;span class="kwrd"&gt;int&lt;/span&gt;[] values, &lt;span class="kwrd"&gt;int&lt;/span&gt; toFind, &lt;span class="kwrd"&gt;int&lt;/span&gt; lowerBound, &lt;span class="kwrd"&gt;int&lt;/span&gt; upperBound)
{
    &lt;span class="kwrd"&gt;if&lt;/span&gt; (values[upperBound] == toFind)
        &lt;span class="kwrd"&gt;return&lt;/span&gt; upperBound;
    &lt;span class="kwrd"&gt;if&lt;/span&gt; (values[lowerBound] == toFind)
        &lt;span class="kwrd"&gt;return&lt;/span&gt; lowerBound;
    &lt;span class="kwrd"&gt;return&lt;/span&gt; -1;
}&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;So what is the next test? I think the simplest test would be 3 numbers in a list and we should find the middle number. 
  &lt;br /&gt;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;[Test]
&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Index_of_key_value_2_in_list_1_2_3_is_1()
{
    Assert.AreEqual(1, &lt;span class="kwrd"&gt;new&lt;/span&gt; BinarySearch().FindIndexOf(&lt;span class="kwrd"&gt;new&lt;/span&gt;[] { 1, 2, 3 }, 2));
}&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;There is not much point in checking only the first and last value in a list that has more than 2 items in it. 
  &lt;br /&gt;So, lets split the list in half and try again. 

  &lt;br /&gt;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; FindIndexOf(&lt;span class="kwrd"&gt;int&lt;/span&gt;[] values, &lt;span class="kwrd"&gt;int&lt;/span&gt; toFind, &lt;span class="kwrd"&gt;int&lt;/span&gt; lowerBound, &lt;span class="kwrd"&gt;int&lt;/span&gt; upperBound)
{
    &lt;span class="kwrd"&gt;if&lt;/span&gt; (upperBound - lowerBound &amp;lt;= 1)
    {
        &lt;span class="kwrd"&gt;if&lt;/span&gt; (values[upperBound] == toFind)
            &lt;span class="kwrd"&gt;return&lt;/span&gt; upperBound;
        &lt;span class="kwrd"&gt;if&lt;/span&gt; (values[lowerBound] == toFind)
            &lt;span class="kwrd"&gt;return&lt;/span&gt; lowerBound;
        &lt;span class="kwrd"&gt;return&lt;/span&gt; -1;
    }
    &lt;span class="kwrd"&gt;return&lt;/span&gt; FindIndexOf(values, toFind, upperBound / 2, upperBound);
}&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;Was this step to far? I'm not sure.
  &lt;br /&gt;Anyway, the next step is pretty obvious, the solution only handle the upper half of the list so far. 

  &lt;br /&gt;So lets write a test that expose that flaw, find the first element in a list when there are more than two items in the list. &lt;/p&gt;

&lt;pre class="csharpcode"&gt;[Test]
&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Index_of_key_value_1_in_one_1_2_3_is_0()
{
    Assert.AreEqual(0, &lt;span class="kwrd"&gt;new&lt;/span&gt; BinarySearch().FindIndexOf(&lt;span class="kwrd"&gt;new&lt;/span&gt;[] { 1, 2, 3 }, 1));
}&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;br /&gt;Yup, that failed alright, FindIndexOf returned -1. 

&lt;br /&gt;Lets fix the code so it searches the lower half of the list too. 

&lt;br /&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; FindIndexOf(&lt;span class="kwrd"&gt;int&lt;/span&gt;[] values, &lt;span class="kwrd"&gt;int&lt;/span&gt; toFind, &lt;span class="kwrd"&gt;int&lt;/span&gt; lowerBound, &lt;span class="kwrd"&gt;int&lt;/span&gt; upperBound)
{
    &lt;span class="kwrd"&gt;if&lt;/span&gt; (upperBound - lowerBound &amp;lt;= 1)
    {
        &lt;span class="kwrd"&gt;if&lt;/span&gt; (values[upperBound] == toFind)
            &lt;span class="kwrd"&gt;return&lt;/span&gt; upperBound;
        &lt;span class="kwrd"&gt;if&lt;/span&gt; (values[lowerBound] == toFind)
            &lt;span class="kwrd"&gt;return&lt;/span&gt; lowerBound;
        &lt;span class="kwrd"&gt;return&lt;/span&gt; -1;
    }
    var middle = (upperBound - lowerBound) / 2 + lowerBound;
    &lt;span class="kwrd"&gt;if&lt;/span&gt; (toFind &amp;lt; values[middle])
        &lt;span class="kwrd"&gt;return&lt;/span&gt; FindIndexOf(values, toFind, lowerBound, middle);
    &lt;span class="kwrd"&gt;return&lt;/span&gt; FindIndexOf(values, toFind, middle, upperBound);
}&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;Now the test passes. 

&lt;br /&gt;And I believe the code looks like an implementation of binary search. 

&lt;p&gt;Lets try the algorithm with a large list just to be sure it works on large lists too. 
  &lt;br /&gt;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;[Test]
&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; A_large_array()
{
    var values = Enumerable.Range(1, 100000000).ToArray();
    Assert.AreEqual(14, &lt;span class="kwrd"&gt;new&lt;/span&gt; BinarySearch().FindIndexOf(values, 15));
}&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;Yes, it passed!&lt;/p&gt;

&lt;p&gt;So I ended up with binary search, but was it because I knew the algorithm or did the tests and the transformation priority premise lead me there?
  &lt;/p&gt;&lt;img src="http://geekswithblogs.net/Lazydev/aggbug/148279.aspx" width="1" height="1" /&gt;</content>
    </entry>
</feed>
