static void Main(string[] args)
        {
            Board<bool, int, int> board = new Board<bool, int, int>();
            Board<bool, int, int> nextGeneration = new Board<bool, int, int>();

            //Board<bool, int, int> noDupesOnBoard = new Board<bool, int, int>();

            //take user input
            string userInput;
            Console.Write("Enter 'x,y' coordinates for a living cell:");
            userInput = Console.ReadLine();

            //convert user input and add to Board

            int xcoord;
            int ycoord;

            string[] xyString = userInput.Split(',');
            int[] convertedxyString = Array.ConvertAll<string, int>(xyString, int.Parse);

            xcoord = convertedxyString[0];
            ycoord = convertedxyString[1];

            Console.WriteLine("x: {0}, y: {1}", xcoord, ycoord);

            //add cell to board
            board.Add(true, xcoord, ycoord);

            //add more cells to board
            do
            {
                Console.Write("Enter 'x,y' coordinates for another living cell or enter 'start':");
                userInput = Console.ReadLine();

                if (userInput == "start")
                {
                    break;
                }

                //convert user input and add to Board
                xyString = userInput.Split(',');
                convertedxyString = Array.ConvertAll<string, int>(xyString, int.Parse);
                xcoord = convertedxyString[0];
                ycoord = convertedxyString[1];

                //Console.WriteLine("x: {0}, y: {1}", xcoord, ycoord);

                board.Add(true, xcoord, ycoord);
                //Console.WriteLine("board in loop: {0}", board);

            } while (userInput != "start");

            foreach (var item in board)
            {
                //Console.WriteLine(item);
            }

            //remove duplicates
            IEnumerable<Tuple<bool, int, int>> noDupesOnBoard = board.Distinct();

            //Console.WriteLine(noDupesOnBoard);

            foreach (var item in noDupesOnBoard)
            {
                //Console.WriteLine(item);
            }

            Board<bool, int, int> transGen = new Board<bool, int, int>();
            //add eight neighboors for each distint cell on initial board set up
            foreach (var item in noDupesOnBoard)
            {
                transGen.Add(false, item.Item2 + 0, item.Item3 + 1);
                transGen.Add(false, item.Item2 + 1, item.Item3 + 1);
                transGen.Add(false, item.Item2 + 1, item.Item3 + 0);
                transGen.Add(false, item.Item2 + 1, item.Item3 - 1);
                transGen.Add(false, item.Item2 - 0, item.Item3 - 1);
                transGen.Add(false, item.Item2 - 1, item.Item3 - 1);
                transGen.Add(false, item.Item2 - 1, item.Item3 + 0);
                transGen.Add(false, item.Item2 - 1, item.Item3 + 1);
            }

            int addedNCount = 0;
            foreach (var item in transGen)
            {
                addedNCount++;
                //Console.WriteLine("{1}: {0}",item, addedNCount);

            }

            //combine initial set up with neighbors
            IEnumerable<Tuple<bool, int, int>> boardOfTheLivingAndDead = board.Concat(transGen);
            int boardOfTheLivingAndDeadNumber = 0;
            foreach (var item in boardOfTheLivingAndDead)
            {
                boardOfTheLivingAndDeadNumber++;
                //Console.WriteLine("{0}: {1}", boardOfTheLivingAndDeadNumber, item);
            }

            //count how many time each cell in in the list, this is the count of adjacent living cells used for birth
            var groups = boardOfTheLivingAndDead.GroupBy(cell => cell);
            foreach (var item in groups)
            {
                //Console.WriteLine("{0} occurs {1} times, if 3 and false: birth!",item.Key, item.Count());
                if (item.Count() == 3 && item.Key.Item1 == false)
                {
                    nextGeneration.Add(item.Key);
                }

            }

            //find living cells that will survive to next generation
            // item1 == true && 2 or 3 neighbors with item1 == true
            // look at initial board set up (board)
            foreach (var item in noDupesOnBoard)
            {
                int numberOfLiveNeighbors = 0;
                // create local neighbor list
                Board<bool, int, int> localNeighbors = new Board<bool, int, int>();
                localNeighbors.Add(true, item.Item2 + 0, item.Item3 + 1);
                localNeighbors.Add(true, item.Item2 + 1, item.Item3 + 1);
                localNeighbors.Add(true, item.Item2 + 1, item.Item3 + 0);
                localNeighbors.Add(true, item.Item2 + 1, item.Item3 - 1);
                localNeighbors.Add(true, item.Item2 - 0, item.Item3 - 1);
                localNeighbors.Add(true, item.Item2 - 1, item.Item3 - 1);
                localNeighbors.Add(true, item.Item2 - 1, item.Item3 + 0);
                localNeighbors.Add(true, item.Item2 - 1, item.Item3 + 1);

                foreach (var liveCell in noDupesOnBoard)
                {
                    if (localNeighbors.Contains(liveCell))
                    {
                        numberOfLiveNeighbors++;
                    }
                }

                if (numberOfLiveNeighbors == 2 || numberOfLiveNeighbors == 3)
                {
                    //Console.WriteLine("the cell {0} survives with {1} neighbors", item, numberOfLiveNeighbors);
                    nextGeneration.Add(item);
                }
            }

            Console.WriteLine("These are the living in the next generation:");
            foreach (var item in nextGeneration)
            {
                Console.WriteLine(item);
            }

            Console.ReadKey();
        }