Convert the project from php to C#.

Squashed commit of the following:

commit 7ec7725f2242be2d6e9a4561ad65a655146ba6ac
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Mon Aug 27 01:16:20 2012 -0400

    Compare Cards directly, not through their string representations.

    Now that Equals() and GetHashCode() have been implemented, we're now
    able to do just that.

    Finally, all the tests pass as well!

commit edd93c909962bee3b821f4de4a8525423960feaa
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Mon Aug 27 01:14:08 2012 -0400

    Override Object.GetHashCode() in Hand.

    Maybe it's not the best implementation since I'm not 100% sure that I'll
    always get different hashcodes for all differing hands, but I'm pretty
    sure that two hands with the same cards will always produce the same
    hashcode.

commit 75c008643188946f97b3be30b0021ebd7e66f51b
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Mon Aug 27 00:38:31 2012 -0400

    Override Object.Equals() in Hand, replacing Hand.equals().

    Better to use the actual equality method here where it matters, compared
    to just whatever arbitrary method we used just by convention in php.

commit c5ca406206d202e5ff85c6ee92fdfdc2b721e3b9
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Mon Aug 27 00:30:51 2012 -0400

    Override Object.GetHashCode() in Card.

    I suspect that not having done this sooner was a part of the shenanigans
    I was observing in other test failures...

commit f9e11d5430d0c1ca84b70613319ae82579d7ab04
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Mon Aug 27 00:23:34 2012 -0400

    Override Object.Equals() in Card.

commit a2269761b652b680b1510b90463b46214b11eab1
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sun Aug 26 23:56:01 2012 -0400

    Add critical missing attributes to these tests.

    If you don't have a SetUp attribute marked, you effectively don't have a
    SetUp method at all, as far as the testing framework is concerned...

commit cecff2f806fbfc6401e22b681052d0eb71c9c229
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sun Aug 26 23:16:16 2012 -0400

    Use a different implementation for FourOfAKindSpecification.newHand().

    Two- and Three- OfAKindSpecification can share their common
    implementation of newHand() (for now, at least), but it has become
    evident that FourOfAKindSpecification needs its own.

    This particular implementation satisfies all of the various 10-card
    hands given to it so far, so I guess we'll keep it for now.

commit f52f64baf5f0f6d7851ec27c7f0f98e2d0ecff62
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sun Aug 26 21:56:38 2012 -0400

    Name the data provider to what the TestCaseSource was expecting.

commit eb35785e80eb43380d77f519ff09c4a9dfe3f1e3
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sun Aug 26 21:55:11 2012 -0400

    Fix a problem in HandTest that was ok in php, but not in C#.

    In php, if a method takes 3 parameters and you give it 4 or 16 or
    whatever, as long as you give it three or more, php doesn't care.
    Not so with C#! I hadn't even realized this was happening. . . .

commit a9de1bf35c6fb2a1e011878e028d1df44c5828e7
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sun Aug 26 17:01:09 2012 -0400

    Fix broken test case source for BestHandIdentifier.

    This sucker had all kinds of things wrong with it:
    * It wasn't providing the hand constructors with the data in the forms
      they were expecting - IEnumerable<Card> instead of List<Card>.  Well,
      gee, that was easy enough to fix!

    * I don't have C# reflection down yet, so instead of trying to
      instantiate any possible class whose name could be represented in a
      string, why not reduce the set of possible Hand classes to what is
      known? And, why not put them inside a neat structure that we can use
      to select the proper one based on the string values, which are
      controlled?

    * Within the test itself, do the assertion based on the string
      representations of the Hands, rather than on the Hand objects
      themselves. . . . 2 different Hand objects will never be the same Hand
      object, so I might as well stop trying now.

commit 4199fc799f634c5e522650d7244cfdca8ac5b9dc
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sun Aug 26 13:13:20 2012 -0400

    Implement Hand.ToString().

commit 49d5171bcc4242303c09be5a72a4a36c6f31930a
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sun Aug 26 13:12:07 2012 -0400

    Fix issue with Card.ToString().

    It wasn't being tested directly, hence the issue was only detected when
    tested through Hand's ToString() method.  It should only return the
    first letter of the Suit's name, not the entire name.

commit 7d7c67e758dbcbf7d0ea5cecb91d6014c068ed55
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sun Aug 26 12:25:03 2012 -0400

    The same thing goes for Deck equality.

    Compare the cards based on a projection of their cards' strings.

commit a5d8ad5e3c404c973308ebbce182313965698d7f
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sun Aug 26 12:22:41 2012 -0400

    Deck needs to know when it already contains a card.

    It seems that the card objects are being tested for equality by
    comparing their actual references, i.e. that the two objects are in fact
    the same reference.  That's not what I want at all.  I consider two
    cards to be equal if they both evaluate to the same string.

commit 03a5f8d73bb61a71e0aaffcf29b42cac8fc68060
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sun Aug 26 12:20:52 2012 -0400

    Don't use a sledgehammer to kill a horsefly.

    Do we really need to use reflection here?  The type to use is more
    or less known and is directly related to the suit's name/value.

commit 4c975e5b2fd55a9a3430bb0d9cf8b52eaf0a24b1
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sun Aug 26 11:54:12 2012 -0400

    Fix some assertions in CardTest that were lost in translation.

    Either I was completely confused during the initial conversion process,
    which is altogether completely possible, or phpunit's less than /
    greater than assertion semantics are backwards compared to nunit's.
    Either way, it's fixed now, I believe...

commit e237c2b6a79f7837c53c154e0f6e669ceade67e7
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sun Aug 26 11:28:00 2012 -0400

    Add the long-awaited FullHouseSpecification::newHand().

    It's still modeled after the php version's algorithm, which was much
    easier to convert now after more exposure to how C# works, namely the
    collections, generics, and LINQ's extension methods.

commit c72cae127a4b294acb544a377ecb5bcb56b29d1a
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sun Aug 26 10:57:39 2012 -0400

    Add the long-awaited CardsOfAKindSpecification::newHand().

    It wasn't that hard to do once I had a firmer grasp on what was going
    on, and now, several days later, I certainly do!

commit ee1c207edebf4f93a50253bb73ed6d162daef820
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sun Aug 26 00:36:29 2012 -0400

    Return to CardBuilderTest's original intent.

    I wasn't able to get any kind of equality assertion to work on the
    expected and actual card objects, regardless of the fact that they were
    in fact the same card values, as far as their face value and suit were
    concerned.  That being the case, why try to compare anything else besides
    their ToString() contents?

commit 305afe291fa1f18bc27aad4fd0b262f99834eefa
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sun Aug 26 00:20:39 2012 -0400

    Fix a bug in CardsOfAKindSpecification.isSatisfiedBy.

    My attempt at LINQ'ing the solution failed, I guess for now I can fall
    back on an iterative solution.

commit 28f897f565453984956313a1bfb5dc0245297708
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sun Aug 26 00:17:24 2012 -0400

    Fix a bug in CardBuilder.convertValueFromLetterToNumber.

    This bug was masked by php's ability to type-juggle ints and strings
    fairly well, at least that's what I think now was going on back then.
    Now, the strict typing is revealing that I was missing a default case
    for all the non-face/ace cards.

    Referencing Int32.TryParse requires a 'using System' directive.

commit c0c65264131f57c2f4798be87919cf219a9e2676
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 22:58:57 2012 -0400

    Every solution needs a Main method in order to compile.

commit 3c2c81af83339454d46b2df21ad8dbdb0b718ce1
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 22:55:40 2012 -0400

    Get TwoPairSpecification to compile.

commit 220aaace205e38cc4f040ae0eb3653a1abb1ef0e
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 22:54:08 2012 -0400

    Get TwoOfAKindSpecification to compile.

commit cfcfb4ea1451eac4a1e2e66c88bf75dc401057a4
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 22:53:48 2012 -0400

    Get ThreeOfAKindSpecification to compile.

commit 5649daa0e19da0ee01a29f55ae5a7e846c451033
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 22:53:33 2012 -0400

    Get StraightSpecification to compile.

commit f803c9e7e6babcfa2db1b571e079d339370ce0e1
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 22:51:24 2012 -0400

    Get StraightFlushSpecification to compile.

commit 65998aa2de55a75986d58462d1c5873835191266
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 22:44:06 2012 -0400

    Get StraightFlushSpecification to compile.

commit 39a8bc9c49e7cc9365eeace1505f00c2ebbda74f
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 22:43:20 2012 -0400

    Get FourOfAKindSpecification to compile.

commit 723bf10de00b673d58a32ac209af499233cdb134
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 22:41:45 2012 -0400

    Get FlushSpecification to compile.

commit f41bb393b5a3baf9990f8f93a39f5742f2ba3162
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 22:40:32 2012 -0400

    Get Suit to compile, again?`

commit 2aba64b10412139ba6fb71ed0571ccc8e84ad0f5
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 22:39:20 2012 -0400

    Get CardsOfAKindSpecification to compile.

commit b2252de3b27db32b8852449039231fe429b07743
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 22:37:04 2012 -0400

    Get Wheel to compile.

commit ae360a6cd597e7e89ab0e71db2c17d39220c47f3
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 22:36:48 2012 -0400

    Get TwoPair to compile.

commit d269017d740941919a4852965319ca9404ad9d72
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 22:36:35 2012 -0400

    Get TwoOfAKind to compile.

commit 1d575ff05e93be98bf8863a94e016fc8e26bede6
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 22:36:21 2012 -0400

    Get ThreeOfAKind to compile.

commit 7ae07732eb838803768e6dec307bc95593953920
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 22:36:10 2012 -0400

    Get Straight to compile.

commit a2acdc252adb61633a29cb96bebb8d2fcb09392b
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 22:33:52 2012 -0400

    Get SteelWheel to compile.

commit 2a92c7ace9420df24eee4b7a8f4ce3272fb8c031
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 22:33:11 2012 -0400

    Get Hand to compile.

commit c840abc5bfb229b4f3ef245f2cc29856a23b5075
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 22:29:06 2012 -0400

    Get FullHouse to compile.

commit 232c36fc8b3b0fbebfb0263167ae9512b9d0c8e0
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 22:26:26 2012 -0400

    Get FourOfAKind to compile.

commit 879aa1e89a034c7ad5c99919535a80f7db82e690
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 22:25:54 2012 -0400

    Get Flush to compile.

commit b7d7d7af94e155a88a77399415ebefcd09418b38
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 22:25:13 2012 -0400

    Get Suit to compile.

commit 5cc3209658979651f090d4a0060462172c288f05
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 22:24:43 2012 -0400

    Get Spades to compile.

commit 403101aea61d4203ae1a563d7215e455cf41ea7f
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 22:24:28 2012 -0400

    Get Hearts to compile.

commit f154f3e2dfc0972bc4843216f84e9e0c413ed859
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 22:24:09 2012 -0400

    Get Diamonds to compile.

commit 8e7b7482afa0460f9938da260e2ea3c139c8e93c
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 22:24:01 2012 -0400

    Get Clubs to compile.

commit 992ff7d81b903b0990e9f6e35da52889f68180a6
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 22:23:15 2012 -0400

    Get Cards to compile.

commit 2d800329e5456d787be80a652c128b29c989f781
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 22:17:13 2012 -0400

    Get Card to compile.

commit 6f3038e676d12d3bbede061df95429152a6c9e43
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 22:15:40 2012 -0400

    Get Deck to compile.

commit a2acef6d63f6534692f01a6479f89a4900a1a03c
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 22:12:50 2012 -0400

    Get DeckIntegrityException to compile.

commit ac6e05b8b3bb2bcaf281f9d1e671f32076cc4c45
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 22:12:05 2012 -0400

    Get CardBuilderException to compile.

commit f36ca17d934581d7cbb5fa5f91a29e0222e46ab9
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 22:11:51 2012 -0400

    Get CardBuilder to compile.

commit 548b3e2cd412176b48a77583349ad02ebb36c545
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 22:00:53 2012 -0400

    Get HighCard to compile.

commit 390eee1b56e21930a8320e91b51ccad425591440
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 22:00:35 2012 -0400

    Get BestHandIdentifier to compile.

commit 24cba1e75f49318fd5ff639fc525c79a81e2462a
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 21:59:25 2012 -0400

    Get WheelSpecificationTest to compile.

commit cdd5c8e5cf1a6c860851eeea95b8e31902b0e6c7
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 21:53:05 2012 -0400

    Get TwoPairSpecificationTest to compile.

commit 4bd5622f250bcb150d984b05e912466693eabbe6
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 21:52:53 2012 -0400

    Get TwoOfAKindSpecificationTest to compile.

commit 31ad47e00c9f6625f8753430ba52bfb47fc8e977
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 21:52:00 2012 -0400

    Get ThreeOfAKindSpecificationTest to compile.

commit d9c01673bd13e634ae42da7164ef7c5ffdc7d54e
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 21:51:30 2012 -0400

    Get StraightSpecificationTest to compile.

commit 302482d04a2b33d324f193c1203b5ec94084b53c
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 21:49:43 2012 -0400

    Get StraightFlushSpecificationTest to compile.

commit 30e74841710e575d369e5e0db6ff78630ca683b1
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 21:49:13 2012 -0400

    Get SteelWheelSpecificationTest to compile.

commit f22c9bc8878d57db691cc23dd69ab66e7e0911f5
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 21:48:36 2012 -0400

    Get RoyalFlushSpecificationTest to compile.

commit aba177f3d92134281e4205e9a69973b41865bdfc
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 21:47:28 2012 -0400

    I removed a method from PokerTestCase too soon...

    There actually were some children making use of this method...

commit b51664e3a60be5672b239cc914e95ac8faee9531
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 21:47:15 2012 -0400

    Get HandTest to compile.

commit d7e735e97dbfe590189d9d034691928587b84d06
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 21:46:26 2012 -0400

    Get RoyalFlush to compile.

commit 29a8d8eb0dd5c00068cfa66005043d5d88092dea
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 21:45:05 2012 -0400

    Get StraightFlush to compile.

    In C#, it looks like you don't get to inherit parent constructors that
    take parameters...

commit ca7eb23144479dbc6af2bb2282c0748b7563187a
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 21:32:53 2012 -0400

    Get FullHouseSpecificationTest to compile.

commit 7b70ca708bb242204b7b191dadd394aca1209a86
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 21:31:18 2012 -0400

    Get FourOfAKindSpecificationTest to compile.

commit 4679b82360e604f502879e1afdfba08f206fa36a
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 21:25:25 2012 -0400

    Get FlushSpecificationTest to compile.

commit 50ab0728e1191e8e78d1ba1ec31d9b14f2286db4
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 21:18:34 2012 -0400

    Get DeckTest to Compile, Part II.

    Static methods aren't globally accessible, you need to reference them
    through their class name!

    And while it was a Good Thing(tm) to name class instances after their
    class name in php for readability, in C# it can sometimes get you into
    trouble, or at least, confuse the compiler, as was the case here with
    Suits.

commit 6cc24321bd0b479615ce4c59c1376ba304b8ec9f
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 21:16:12 2012 -0400

    Get DeckTest to compile, Part I.

    If you're gonna make unqualified references to classes in the generic
    collections namespace, you need to use that namespace first.

commit 74e31442220932f7b9860371b99ae86ec0210f0b
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 21:05:58 2012 -0400

    Silly typo fixes.

commit f4ffcf4d1784107f3a2c13b29128813ab9f0f176
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 21:05:29 2012 -0400

    Get CardTest to compile.

commit 57d5784698d4752373868f7cf9f3f67abbbeaa0a
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 21:03:44 2012 -0400

    Get CardBuilderTest to Compile, Part II.

    The constants need to be marked public - it's not like in php where just
    every const is always public, whether you want it to be or not....

    Also, the scope resolution operator, ::, means something else in C# -
    gotta love the false cognates!

commit 85cc7b2669de1b4ad2b860eb744060d1a4407ca7
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 20:51:28 2012 -0400

    Get CardBuilderTest to Compile, Part I.

    Though the var keyword most certainly helps, I'm not used to having to
    use any kind of type specifier at all.  Php does have a few non-retarded
    bits, after all. Not many, and they certainly don't even come close to
    making up for all its faults!

commit d386a68a143863a2b3055dbebf49d68bfafdbd3c
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 18:02:50 2012 -0400

    Get BestHandIdentifierTest to Compile, Part IV.

    It's been a while since I've worked in a strongly typed language - I'm
    not used to all the explicit casting that needs to be done from time to
    time!

commit 0fa313e0b55a358c671d8c5195c9d1cce0bd0eac
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 17:57:19 2012 -0400

    Get BestHandIdentifierTest to Compile, Part III.

    I guess Microsoft discourages this type of reflection, or at least
    recognizes the potential security risks it presents, since when all you
    have is a string of the classname you want to instantiate, and not just
    call the default constructor (Hand has no such constructor,
    incidentally), then you have to use this big bad overloaded method to do
    it.  The MSDN docs don't mention it explicitly, but stackoverflow and my
    own experiences confirm that you can pass null for all the other
    parameters and apparently the proper defaults will be used.

commit d8de4940b002d6458e9e18a2881afdff252ad29f
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 17:54:16 2012 -0400

    Get BestHandIdentifierTest to Compile, Part III.

    My big blob of test data was poorly formed, I couldn't use Types
    directly in this context, so I had to wrap the class names in strings.
    This also had other consequences with the way I could call the
    activation code to instantiate the various Hand-subclassed objects.

commit 75e187ad6abbd863640a2adb949b9c7742a5705b
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 17:51:14 2012 -0400

    Get BestHandIdentifierTest to Compile, Part II.

    The test uses LINQ, so I needed to add the using directive for it as
    well.  The problem was that initially, autocomplete wasn't suggesting
    System.Linq as one of the available namespaces, and it in fact, wasn't
    available, until after I added System.Core as a project reference.

commit fc38a6c847bb07141d8675512a50d28befaed988
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Sat Aug 25 18:01:40 2012 -0400

    Get BestHandIdentifierTest to Compile, Part I.

    I missed this one - monodevelop thought it was being helpful when it
    auto-completed the Card class instead of the card variable of the lambda
    expression that I actually wanted.

commit e412e95528762be428dc057bff60fc6de5a25cde
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Fri Aug 24 23:16:41 2012 -0400

    Use the correct form to assert instance-ness.

    Thank you, compiler and stackoverflow.com, for pointing me in the right
    direction!

commit 3e51ecf6930d2605ae7e99f20fd1a27efeac4737
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Fri Aug 24 22:09:44 2012 -0400

    Change the type of BestHandIdentifierTest.DealtCards to List<Card>.

    Leaning on the compiler is helping me to align the return types of
    methods to the types of variables they assign to, heh.

commit 078125604f8a9a9a25aabea2d46c69fcb9fcdc2e
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Fri Aug 24 22:06:57 2012 -0400

    Rename BestHandIdentifierTest.DealtHand to DealtCards.

    This clears up an inconsistency in the story of the test: You don't
    deal a Hand - you deal Cards, and try to identify a Hand out of them,
    the best Hand that you can.

commit c8e46d83714ec9788e3ee5ace1023149e0f610ff
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Fri Aug 24 21:59:54 2012 -0400

    Change Hand.Cards from type Card[] to List<Card>.

    I'm too used to php, which has automatically resizable arrays.  In
    fact, it's unfortunate that they're even called arrays - they're no
    such thing - they're implemented as ordered hashmaps!

commit ee5f028fd48dd6dcb772fde38703382468316150
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Fri Aug 24 21:53:57 2012 -0400

    Remove another lingering bit of php syntax from Hand class.

    The more rocks I overturn, the more the smaller birds keep scurrying
    out!

commit 4b7d7f8dbf8234745704283236235cf52be72fd4
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Fri Aug 24 21:18:03 2012 -0400

    Fix HandSpecifications' broken method signatures.

    C# doesn't support covariant return types.  Each HandSpecification's
    newHand() method is to return the corresponding subtype of Hand.  I
    thought I could make it a base class abstract method that returns a
    Hand.  Furthermore, I thought I could have implementers in the child
    classes, returning subclasses of Hand and still honor the interface
    contract.  Unfortunately, that is not the case.  None of these
    Specifications would even compile unless they had the exact same
    signature as their base class.

commit 01f086bfa33509eeb46e9f896b6b35f997086281
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Fri Aug 24 17:24:32 2012 -0400

    Add required missing non-abstract empty constructor bodies.

    C# is a stickler about that, apparently.  Not having them wasn't a
    syntax error and so I didn't see that until now.

commit 90e0272bc8c4e9bf2e7d0900c3a926c9120663ae
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Fri Aug 24 17:23:04 2012 -0400

    Add missing using; directives.

commit c34fb1a1e6f097ccebd24bb370af55034274d048
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Fri Aug 24 17:10:54 2012 -0400

    Remove the last vestiges of the 'function' keyword.

    Once all the syntax errors were fixed, without a functioning build, it
    was too easy to miss the function keyword - me coming from php doesn't
    make spotting it any easier either.

commit 2118ffc12dadc62a6103423ba1fbb81d9181951a
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Fri Aug 24 16:12:07 2012 -0400

    Convert BestHandIdentifier from php to C#.

commit 37bad0f3f9e54beab03feec6a40d53fa2f089532
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Fri Aug 24 16:11:40 2012 -0400

    Convert WheelSpecifcation from php to C#.

commit 8e825d4411e2c61a6d458d631785a47f7070ddb6
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Fri Aug 24 16:09:33 2012 -0400

    Convert TwoPairSpecification from php to C#.

commit 6eabf6af848060e1371ac6c4d63ef77ec1e1e6a4
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Fri Aug 24 16:06:16 2012 -0400

    Convert TwoOfAKindSpecification from php to C#.

commit 5e88c92c1c1a28dbcb44ece294afd253a88724fd
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Fri Aug 24 15:58:22 2012 -0400

    Convert ThreeOfAKindSpecification from php to C#.

commit 5f9f8ceb3adb4bdd5d738f8e6d0aac3fb48a2fd0
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Fri Aug 24 15:55:45 2012 -0400

    Convert StraightSpecification from php to C#.

commit a5322d42cdbea12e9a97b8d2d08b09830e0b94a6
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Fri Aug 24 15:42:19 2012 -0400

    Convert StraightFlushSpecification from php to C#.

commit 05497e6523e45f77e5440cd90a138d26416753b5
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Fri Aug 24 14:42:23 2012 -0400

    Convert SteelWheelSpecification from php to C#.

commit 48afbd10cfbec455f96fc869a01c1367f46c629f
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Fri Aug 24 14:10:02 2012 -0400

    Convert RoyalFlushSpecification from php to C#.

commit a69722308899695af01c4a3ea37c05454246ec19
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Fri Aug 24 14:05:50 2012 -0400

    Convert HandSpecification from php to C#.

commit 66fd608da43e6d1e7cd27136af7a93dad591e8c8
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Fri Aug 24 14:03:27 2012 -0400

    Convert FullHouseSpecifiction from php to C#.

    Too much array/hash gymnastics happening here, let's get a working build
    with failing tests first, then I'll re-implement it in C#.

commit ba0e6c8426d7650c758be4ebba061d517255e60d
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Fri Aug 24 00:22:23 2012 -0400

    Convert FourOfAKindSpecification from php to C#.

commit 1a171410f58c1316a2f865b3fa9b9a6e4b9b42cd
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Fri Aug 24 00:19:15 2012 -0400

    Convert FlushSpecification from php to C#.

    Conversions are easier to do when there's no crazy array closure
    gymnastics going on...

commit a00ac94dc9dc79fe34844a69832cacf427969005
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Thu Aug 23 23:44:36 2012 -0400

    Convert CardsOfAKindSpecification from php to C#.

    So, newHand()'s implementation is obviously broken here; be aware of
    that. I'll fix it when I actually have a build and some tests working.

commit f605096dbab646786c9c8a545a3abb7203031dd1
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Thu Aug 23 20:30:15 2012 -0400

    Convert Hand from php to C#.

    I deliberately chose to break toString() and getHandType(), because
    it'll be so much easier to get them working when I have a working build,
    rather than wasting all this time guessing at a liekly solution.

    The stuff in LINQ?  Who knows if I did that right or not - it seems to
    be right, but the tests will prove me right or wrong...

commit b2df2af94bc4a8ff183a9d04cfa93bba71a0f200
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Thu Aug 23 20:28:40 2012 -0400

    Convert Wheel from php to C#.

commit 4f353aa9aa3eedba562013cfa654e2b318e9d782
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Thu Aug 23 20:19:35 2012 -0400

    Convert TwoPair from php to C#.

commit e5935f161fd986d15cfaee06246e36165d5dec1b
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Thu Aug 23 20:19:17 2012 -0400

    Convert TwoOfAKind from php to C#.

commit 7ab43f7cad331b2cae6b98364ec2f289187f1d47
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Thu Aug 23 20:19:05 2012 -0400

    Convert ThreeOfAKind from php to C#.

commit c4246c50e355cfba27f99d0f05b670b2a1ee71d3
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Thu Aug 23 20:18:48 2012 -0400

    Convert StraightFlush from php to C#.

commit 6031833db293d8d6285f97601698c044c31ee36f
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Thu Aug 23 20:18:31 2012 -0400

    Convert Straight from php to C#.

commit 84aea50519c074dce52e581682995470ba10c01a
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Thu Aug 23 20:18:06 2012 -0400

    Convert SteelWheel from php to C#.

commit 181a24f696368005b1fd6a4ee98fa299b57b2e8b
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Thu Aug 23 20:17:43 2012 -0400

    Convert RoyalFlush from php to C#.

commit b57da2a65379fa8f03dba8f1e23d12a8506a8b80
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Thu Aug 23 20:17:22 2012 -0400

    Convert HighCard from php to C#.

commit 1b1ee4ea33167d8f6de06a388c9fa0d1d18bd1b1
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Thu Aug 23 19:47:28 2012 -0400

    Convert FullHouse from php to C#.

commit 643294a68f12700f91328831f1d0a12c3d8607fc
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Thu Aug 23 19:47:12 2012 -0400

    Convert FourOfAKind from php to C#.

commit b44e338b92c64981a2af9e9fb86c1c1810ac5a62
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Thu Aug 23 19:46:50 2012 -0400

    Convert Flush from php to C#.

commit db77861730795fd4bc2926024996b0f908ecab81
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Thu Aug 23 19:45:35 2012 -0400

    Convert DeckIntegrityException from php to C#.

commit cad6d1ab966edb07e7b4558c4201e0d8beaee064
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Thu Aug 23 19:45:00 2012 -0400

    Convert Deck from php to C#.

commit 702d00d8a420a5fdf0617baeeca6e16f42de2185
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Thu Aug 23 19:36:02 2012 -0400

    Convert CardBuilderException from php to C#.

    I don't even know if this is going to work, could it be that simple?

commit f10ddfc7e0c8009e6ba36551adc35dd8c5c2102a
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Thu Aug 23 19:35:00 2012 -0400

    Convert CardBuilder from php to C#.

    Man, finally, some non-test code to work on!

commit 7a048d8aa3bafb4d1648b9e6ba9558e91ff1c922
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Thu Aug 23 17:10:20 2012 -0400

    Convert WheelSpecificationTest from php to C#.

    Could it be???? The last test?!?!? HOORAY!!!!

commit 1fe26aaece810e0375b0b3122f929cb827546055
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Thu Aug 23 16:44:00 2012 -0400

    Convert TwoPairSpecificationTest from php to C#.

    Yep.

commit 854350af61fadd8e008c394910b704876ba3b4bd
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Thu Aug 23 15:53:44 2012 -0400

    Convert TwoOfAKindSpecificationTest from php to C#.

    Yawn.  We interrupt this commit message to bring you an important public
    service announcement:

    VIM IS TEH AWESOMEZ!!!!

commit 82e94bdb4541a92c5dd5bbeb0b87fe53d38ea4fe
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Thu Aug 23 15:49:17 2012 -0400

    Convert ThreeOfAKindSpecificationTest from php to C#.

    How many more tests to go?

commit 6d4555f9c744cd7def8440e8a2c045554b2d7eae
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Thu Aug 23 15:41:58 2012 -0400

    Convert StraightSpecificationTest from php to C#.

    I'm through guessing my way through the crazy array gymnastics when I
    don't even have a project that builds yet.  When time allows I'll come
    back to it, promise!

commit a8a1d83420080ebcbf4348dee324c20419302e09
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Thu Aug 23 15:29:07 2012 -0400

    Convert StraightFlushSpecificationTest from php to C#.

    Another easy conversion in the bag!

commit d1b165113b4e235140b6bb2ee5e9d18fb859e519
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Thu Aug 23 15:28:10 2012 -0400

    Convert SteelWheelSpecificationTest from php to C#.

    Ahhh, another relatively easy conversion...

commit 338d252f26e92ca05a4c028dde493572f9e361b4
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Thu Aug 23 15:04:31 2012 -0400

    Convert RoyalFlushSpecificationTest from php to C#.

    This one was refreshingly easier to conver than what I've had so far;
    none of my zany array closure gymnastics that don't directly map to the
    new language.

commit 6b59674bec4fbe8618e06da319d8589585ab8150
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Thu Aug 23 13:44:14 2012 -0400

    Convert HandTest from php to C#.

    Are we there yet?

commit ec14bff86cfdfd5d57ad995e4da85fa7ccd91e59
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Thu Aug 23 13:08:01 2012 -0400

    Convert FullHouseSpecificationTest from php to C#.

    One more file converted. .. . how many more to go?

commit f2f829d449811f4a63060b0eddb6ab27810e30ef
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Thu Aug 23 11:47:31 2012 -0400

    Convert FourOfAKindSpecificationTest from php to C#.

    My LINQ and lambda-fu are still weak, hence the awesome foreach action
    going on in getAllPossibleFoursOfAKindEachWithArandomKicker(). Let's
    revisit that at some point in the future, but for now it's good enough,
    I think.

commit 8a775e12cf2534ed967114fe58bd2bea506c88f3
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Wed Aug 22 23:38:34 2012 -0400

    Convert FlushSpecificationTest from php to C#.

    I regret not being able to replicate the crazy array generation I was
    performing in getSomePossibleFlushes(), but right this moment, I don't
    think any extra effort on it was warranted.  For now, a hard-coded list
    of a few Flushes will suffice.  If time permits, I will revisit this at
    some point in the future.

commit 958ad20485d5e15e32e26523a97c0f06b6ffd50b
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Wed Aug 22 22:51:08 2012 -0400

    Convert DeckTest from php to C#.

    I'm starting to like that var keyword more and more...

commit 7c2874f1bc42c52c6928e1085b7f74848fdb5cc0
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Wed Aug 22 22:38:01 2012 -0400

    Convert CardTest from php to C#.

    Ahhh, I love it!  The ability to call member functions without an
    explict use of "$this->".  As enamored as I was with explicit type
    hinting by way of phpdoc, it's just so much nicer to have it baked
    into my member declarations...

commit 637d16b54b4cfca2bdf3da276afc5413aa43c5cd
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Wed Aug 22 19:16:32 2012 -0400

    Remove functionlity that is not needed in C#.

    C#'s garbage collection, as far as I know, actually works. Here,
    teardown should only be for releasing non-memory resources.

commit 6e3f8792d89bd61af6d90c79240252144fb16829
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Wed Aug 22 19:09:08 2012 -0400

    Convert CardBuilderTest from php to C#.

    Will it build? Who knows? I'm still just going through the code, file by
    file, doing my best to faithfully preserve the original intent of the
    php code by representing it as best as possible, to my knowledge, in as
    close to equivalent C# as I can.

commit 23cf72300277da55e35b9c8a05875aa7939acf14
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Wed Aug 22 19:06:55 2012 -0400

    Clean up some minor test copy-pasta.

    The cardStrings were only invalid for those first few tests that expect
    an exception.  The rest of them are quite valid.  Let's not throw people
    off needlessly, my code is horrible enough without needing misleading
    names!

commit b22063333af50bd9438122fa30f5b9d36603dc50
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Wed Aug 22 17:12:40 2012 -0400

    Convert BestHandIdentifierTest from php to C#.

    Will it build as-is?  Probably not! But hey, at least all the blatant
    syntax errors have been corrected.  And that's a great start for a first
    pass at this.

commit cb3629728888ea076a64855ea8c998d6384af8fc
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Wed Aug 22 16:42:20 2012 -0400

    Convert PokerTestCase from php to C#.

    It's pretty neat that I was able to dispense with the func_get_args()
    silliness and use some proper varargs action with the params keyword.
    That's a pretty neat construct. Gotta love the forward references to
    code that hasn't yet been converted...

commit 5c9f84c392c7324fa570806026971fff7e6140ee
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Tue Aug 21 19:47:39 2012 -0400

    Convert the Card class hierarchy from php to C#.

    Interesting how calling parent (base) constructors works differently in
    C# than in php. I certainly prefer C#'s strictness about just when you
    can call a constructor to php's loosey-goosey treatment of constructors
    as just another funcdtion on the class, that just happens to get called
    upon instantiation...

commit 6f588a1c90b32b6b1c6230ae7567e0ff1552bafd
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Tue Aug 21 19:25:46 2012 -0400

    Convert the Cards class from php to C#.

    And already, there's just a hint of the fun challenges that yet lay
    ahead! Php's array data structure (and the loose typing) are just about
    the only things from the language that I'll be missing...

commit db579238a2ef2aadb29c6209d4e0c0d2241141f8
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Tue Aug 21 19:19:56 2012 -0400

    Convert the Suit class from php to C#.

    Reflection is done completely differently in C#, which isn't much of a
    surprise at all.

    It's also interesting to note how a lot of the type-related markup caused
    the file to shrink.  I think there are further size reductions to be
    gained, once I sink my teeth into properties.

    Finally, while some hard-core php'ers might have poo-pooed my
    "excessive" use of phpdoc, it certainly helped me today during the
    conversion process, if nothing else!

commit de31faa7182748b786c3eda7f9c1c1c1e8887483
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Tue Aug 21 17:25:01 2012 -0400

    Remove next-line braces and newlines at EOF.

commit c7bc5e305651b8abc41c68dbcc5a2c033e15f606
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Tue Aug 21 15:45:35 2012 -0400

    Rename all files from .php to .cs.

    Ending in .cs doesn't suddenly make a php class a c sharp class, but
    it's if nothing else a good start - at least now MonoDevelop can start
    seeing them.

    Also remove tests/phpunit.xml and tests/bootstrap.php since they won't
    be needed at all after the conversion.

commit 19be66a57721c372ec09f600531be1613f4967ed
Author: Daniel Miladinov <daniel.miladinov@gmail.com>
Date:   Tue Aug 21 15:41:47 2012 -0400

    Remove unused and unneeded file HandComparator.php.

    Along with its test case.