//Properties/Variables * **********************************************************
        //Constructors *******************************************************************
        //Methods ************************************************************************
        public static List<TransactionDto> Process(string FileType, string FileName)
        {
            List<TransactionDto> ret = new List<TransactionDto>();

            try
            {
                using (StreamReader sr = new StreamReader(FileName))
                {
                    string delimiter = "";
                    if (FileType.Equals("'|' Delimited File"))
                    {
                        delimiter = "|";
                    }
                    else if (FileType.Equals("Comma Delimited File"))
                    {
                        delimiter = ",";
                    }
                    else if (FileType.Equals("Tab Delimited File"))
                    {
                        delimiter = "\t";
                    }
                        //modified to accept new files
                    else if (FileType.Equals("| Delimited Points (x,y) File"))
                    {
                        delimiter = "|";
                    }
                    else return null;

                    string line;

                    while ((line = sr.ReadLine()) != null)
                    {
                        string[] items = line.Split(delimiter.ToCharArray());

                        if (items.Length > 1)
                        {
                            TransactionDto temp = new TransactionDto();
                            temp.tid = items[0];

                            for (int i = 1; i < items.Length; i++)
                            {
                                temp.items.Add(items[i]);
                            }//for

                            ret.Add(temp);
                        }//if at least one product
                    }//while
                }//using
            }
            catch (Exception e)
            {
                MessageBox.Show("There was an issue with the file: " + FileName);
                return null;
            }//catch

            return ret;
        }
        public string decide(TransactionDto transaction, DecisionTreeNode node)
        {
            if (node.split_index == -1) return node.decision;

            foreach (DecisionTreeNode child in node.children)
            {
                if (transaction.items[node.split_index] == child.split_value) return decide(transaction, child);
            }

            return "NOT_FOUND";  //this case *SHOULD* never be reached
        }
        public TransactionDto Process(SalesItemsetsEntity Sale)
        {
            TransactionDto ret = new TransactionDto();

            ret.tid = Sale.salesorder;

            string[] productArray = Sale.Products.Split('|');

            ret.items = productArray.ToList();

            return ret;
        }
        public static List<TransactionDto> getAWSaleDto()
        {
            TransactionDto dto;
            List<TransactionDto> dtos = new List<TransactionDto>();

            using (AdventureWorksEntities awe = new AdventureWorksEntities())
            {
                IQueryable<BookExampleEntity> bee = awe.BookExampleEntities;

                foreach(BookExampleEntity be in bee)
                {
                    dto = new TransactionDto();
                    dto.tid = be.TID;
                    dto.items = be.items.Split('|').ToList();
                    dtos.Add(dto);
                }//foreach

            }//using

            return dtos;
        }
 public string decide(TransactionDto transaction)
 {
     return decide(transaction, _root);
 }
        private void createConditionalFPTree(List<FPPrefixPath> prefixPaths, ref List<ItemHeaderElement> itemHeaders)
        {
            foreach (FPPrefixPath p in prefixPaths)
            {
                for (int i = 0; i < p.support; i++)
                {
                    for (int j = 0; j < p.prefixpath.Count; j++)
                    {
                        Boolean found = false;
                        for (int k=0; k<itemHeaders.Count; k++){
                            if (itemHeaders[k].itemID == p.prefixpath[j].item) {
                                found = true;
                                itemHeaders[k].support = itemHeaders[k].support + 1;
                            }

                        }
                        if (!found) itemHeaders.Add(new ItemHeaderElement(p.prefixpath[j].item, 1));

                    }
                }
            }

            /* remove the itemHeaders that don't meet min_sup */
            for (int n = 0; n < itemHeaders.Count; n++)
            {
                if (itemHeaders[n].support < min_sup)
                {
                    itemHeaders.RemoveAt(n--);
                }
            }

            /*
            Console.WriteLine("ConditionalHeaderTable wo/node-links");
            foreach (ItemHeaderElement e in itemHeaders)
            {
                Console.WriteLine(e.ToString());
            }
            Console.WriteLine("Press any key to continue...");
            Console.ReadKey();
            */

            /* remove prefixpath nodes that don't meet min_sup */
            foreach (FPPrefixPath p in prefixPaths)
            {
                List<int> removeList = new List<int>();
                p.prefixpath.Reverse();
                for (int i = 0; i < p.prefixpath.Count; i++)
                {
                    bool found = false;
                    for (int j = 0; j < itemHeaders.Count; j++)
                    {
                        if (itemHeaders[j].itemID == p.prefixpath[i].item)
                        {
                            found = true;
                        }
                    }
                    if (!found) removeList.Add(i);
                }
                for (int i = 0; i < removeList.Count; i++)
                {
                    p.prefixpath.RemoveAt(removeList[i] - i); //CAN: Added because indexes change after the removing an element.  Did not encounter this issue in testing
                }
            }

            FPNode root = new FPNode(null, 0);
            foreach (FPPrefixPath p in prefixPaths)
            {
                TransactionDto dto = new TransactionDto();
                foreach (FPNode fpn in p.prefixpath)
                {
                    dto.items.Add(fpn.item);
                }
                /*
                Console.WriteLine("Adding to the tree " + p.support + " times: ");
                Console.WriteLine(dto);
                Console.ReadKey();
                */
                for (int i = 0; i < p.support; i++)
                {
                    TransactionDto tmpDto = new TransactionDto();
                    foreach (string item in dto.items)
                    {
                        tmpDto.items.Add(item);
                    }
                    addToTree(ref root, tmpDto, ref itemHeaders);
                }
            }

            /*
            Console.WriteLine("ConditionalHeaderTable w/node-links");
            foreach (ItemHeaderElement e in itemHeaders)
            {
                Console.WriteLine(e.ToString());
            }
            Console.WriteLine("Press any key to continue...");
            Console.ReadKey();

            Console.WriteLine("Conditional FP-Tree children");
            foreach (FPNode aNode in root.children)
            {
                Console.WriteLine("----");
                FPNode myNode = aNode;
                while (myNode != null)
                {
                    Console.WriteLine(myNode.item + ":" + myNode.support + " --> ");
                    if (myNode.children.Count == 0) myNode = null;
                    else myNode = myNode.children[0];
                }
            }
            Console.WriteLine("Press any key to continue...");
            Console.ReadKey();
            */
        }
        /* add the items in dto to tree recursively && add node links to itemHeaderTable */
        private void addToTree(ref FPNode root, TransactionDto dto, ref List<ItemHeaderElement> itemHeaderTable)
        {
            if (dto.items.Count == 0) return;

            FPNode parent = root;
            foreach (FPNode node in root.children)
            {
                if (node.item == dto.items[0])
                {
                    parent = node;
                }
            }

            if (parent == root)
            {
                FPNode fpn = new FPNode(dto.items[0], 1, parent);
                parent.children.Add(fpn);
                parent = fpn;
                for (int i = 0; i < itemHeaderTable.Count; i++)
                {
                    if (itemHeaderTable[i].itemID == dto.items[0]) itemHeaderTable[i].addNodeLink(fpn);
                }
            }
            else
            {
                parent.support = parent.support + 1;
            }

            dto.items.RemoveAt(0);
            addToTree(ref parent, dto, ref itemHeaderTable);
        }