public void Part2()
        {
            TicketData             ticketData             = TicketDataParser.Parse(StringListRetriever.Retreive("InputList15.txt").ToList());
            TicketValidationResult ticketValidationResult = TicketValidator.ValidateNearby(ticketData);
            FieldOrderResult       fieldOrderResult       = FieldOrderFinder.FindFieldOrderFor(ticketValidationResult.Tickets, ticketData.ValidationRules);

            Assert.Equal(1307550234719, fieldOrderResult.FieldOrder.Keys.Where(x => x.StartsWith("departure"))
                         .Select(x => System.Convert.ToInt64(ticketData.Tickets[0].DataItems[fieldOrderResult.FieldOrder[x]]))
                         .Aggregate <long, long>(1, (x, y) => x * y));
        }
        public void Part2Sample()
        {
            TicketData ticketData = TicketDataParser.Parse(GetPart2SampleData());

            Assert.Equal(3, ticketData.ValidationRules.Count);
            Assert.Equal(4, ticketData.Tickets.Count);
            TicketValidationResult ticketValidationResult = TicketValidator.ValidateNearby(ticketData);

            Assert.Equal(3, ticketValidationResult.Tickets.Count);
            FieldOrderResult fieldOrderResult = FieldOrderFinder.FindFieldOrderFor(ticketValidationResult.Tickets, ticketData.ValidationRules);
        }
            internal static FieldOrderResult FindFieldOrderFor(List <Ticket> tickets, List <TicketValidationRule> validationRules)
            {
                FieldOrderResult result = new FieldOrderResult();
                Dictionary <string, List <int> > ruleOrderMatrix = ComputeRuleOrderMatrixFor(tickets, validationRules);

                while (ruleOrderMatrix.Any(x => x.Value.Count > 0))
                {
                    foreach (string key in ruleOrderMatrix.Keys.Where(x => ruleOrderMatrix[x].Count == 1).ToList())
                    {
                        int dataItemIndex = ruleOrderMatrix[key][0];
                        result.FieldOrder.Add(key, dataItemIndex);
                        ruleOrderMatrix.Remove(key);
                        foreach (string otherKey in ruleOrderMatrix.Keys.Where(x => ruleOrderMatrix[x].Contains(dataItemIndex)).ToList())
                        {
                            ruleOrderMatrix[otherKey].Remove(dataItemIndex);
                        }
                    }
                }
                return(result);
            }