public void When_checking_values()
        {
            var personA = new Person {
                Name = "A", Age = 1
            };
            var personB = new Person {
                Name = "B", Age = 2
            };
            var personC = new Person {
                Name = "C", Age = 3
            };

            var collection = new KeyedCollectionEx <string, Person>(p => p.Name)
            {
                personA,
                personB,
                personC
            };

            collection.ShouldNotBeNull();
            collection.Count.ShouldBe(3);

            collection.Values.ShouldNotBeNull();
            collection.Values.ShouldNotBeEmpty();
            collection.Values.Count.ShouldBe(3);
            collection.Values.ShouldBe(new[] { personA, personB, personC });

            collection.RemoveAt(1);

            collection.Count.ShouldBe(2);

            collection.Values.Count.ShouldBe(2);
            collection.Values.ShouldBe(new[] { personA, personC });
        }
        public void When_creating_a_new_keyedCollectionEx_with_non_default_comparer()
        {
            var personA = new Person {
                Name = "A", Age = 1
            };
            var personB = new Person {
                Name = "B", Age = 2
            };
            var personC = new Person {
                Name = "C", Age = 3
            };

            var collection = new KeyedCollectionEx <string, Person>(p => p.Name, StringComparer.OrdinalIgnoreCase)
            {
                personA,
                personB
            };

            collection.ShouldNotBeNull();
            collection.Count.ShouldBe(2);
            collection.Contains("A").ShouldBeTrue();
            collection.Contains("a").ShouldBeTrue();
            collection.Contains("B").ShouldBeTrue();
            collection.Contains("b").ShouldBeTrue();
            collection.Contains("C").ShouldBeFalse();
            collection.Contains("c").ShouldBeFalse();

            collection.Contains(personA).ShouldBeTrue();
            collection.Contains(personB).ShouldBeTrue();
            collection.Contains(personC).ShouldBeFalse();

            collection.Add(personC);
            collection.Contains("C").ShouldBeTrue();
            collection.Contains("c").ShouldBeTrue();
            collection.Contains(personC).ShouldBeTrue();

            var dodgyPerson = new Person {
                Name = "A", Age = 666
            };

            Should.Throw <ArgumentException>(() => collection.Add(dodgyPerson)).Message
            .ShouldBe("An item with the same key has already been added.");

            collection["A"].Age.ShouldBe(1);
            collection["B"].Age.ShouldBe(2);
            collection["C"].Age.ShouldBe(3);

            Person somePerson;

            collection.TryGet("A", out somePerson).ShouldBeTrue();
            somePerson.ShouldNotBeNull();
            somePerson.Age.ShouldBe(1);

            collection.TryGet("D", out somePerson).ShouldBeFalse();
            somePerson.ShouldBeNull();
        }