public Participant AddParticipant(string firstname, string lastname)
        {
            if (_data == null)
            {
                LoadData();
            }

            var participant = _data.Keys.FirstOrDefault(x => x.Firstname.Equals(firstname, StringComparison.InvariantCultureIgnoreCase) &&
                                                        x.Lastname.Equals(lastname, StringComparison.InvariantCultureIgnoreCase));

            if (participant != null)
            {
                throw new Exception("Participant already exists");
            }

            participant = new Participant {
                Firstname = firstname, Lastname = lastname
            };
            var teaPreference = new TeaPreference {
                ParticipantId = participant.Id
            };

            _data.TryAdd(participant, teaPreference);

            SaveChanges();

            return(participant);
        }
        private void LoadData()
        {
            if (_data == null)
            {
                var now = DateTime.Now;
                // Normally, data is loaded from some database or appropriate repository
                // For the purpose of this exercise, we just use some dummy data
                _data = new ConcurrentDictionary <Participant, TeaPreference>();

                var participant = new Participant {
                    Firstname = "Theresa", Lastname = "May"
                };
                var teaPreference = new TeaPreference {
                    ParticipantId = participant.Id, AddSugar = true, TeaBrand = TeaBrand.Lipton
                };
                _data.TryAdd(participant, teaPreference);
                participant.Rounds.Add(now - new TimeSpan(1, 0, 0, 0));
                participant.Rounds.Add(now - new TimeSpan(2, 0, 0, 0));

                participant = new Participant {
                    Firstname = "John", Lastname = "Major"
                };
                teaPreference = new TeaPreference {
                    ParticipantId = participant.Id, AddMilk = true, AddSugar = true, TeaBrand = TeaBrand.Decaf
                };
                _data.TryAdd(participant, teaPreference);
                participant.Rounds.Add(now - new TimeSpan(4, 0, 0, 0));
                participant.Rounds.Add(now - new TimeSpan(10, 0, 0, 0));

                participant = new Participant {
                    Firstname = "Tony", Lastname = "Blair"
                };
                teaPreference = new TeaPreference {
                    ParticipantId = participant.Id, AddMilk = true, TeaBrand = TeaBrand.Twinnings
                };
                _data.TryAdd(participant, teaPreference);
                participant.Rounds.Add(now - new TimeSpan(0, 1, 0, 0));

                participant = new Participant {
                    Firstname = "Gordon", Lastname = "Brown"
                };
                teaPreference = new TeaPreference {
                    ParticipantId = participant.Id, TeaBrand = TeaBrand.Lipton
                };
                _data.TryAdd(participant, teaPreference);
                participant.Rounds.Add(now - new TimeSpan(0, 2, 0, 0));
                participant.Rounds.Add(now - new TimeSpan(0, 3, 0, 0));
                participant.Rounds.Add(now - new TimeSpan(1, 1, 0, 0));
                participant.Rounds.Add(now - new TimeSpan(2, 1, 0, 0));
                participant.Rounds.Add(now - new TimeSpan(2, 2, 0, 0));

                participant = new Participant {
                    Firstname = "David", Lastname = "Cameron"
                };
                teaPreference = new TeaPreference {
                    ParticipantId = participant.Id, TeaBrand = TeaBrand.Tetley
                };
                _data.TryAdd(participant, teaPreference);
                participant.Rounds.Add(now - new TimeSpan(0, 3, 0, 0));
                participant.Rounds.Add(now - new TimeSpan(1, 3, 0, 0));
            }
        }