internal RomanNumberInstance(int number, char letter, RomanNumberInstance allowedBeforeNumber, RomanNumberInstance allowedAfterNumber)
 {
     this.representesNumber = number;
     this.representedLetter = letter;
     this.allowedBefore     = allowedBeforeNumber;
     this.allowedAfter      = allowedAfterNumber;
 }
 internal bool AllowedAfter(RomanNumberInstance number)
 {
     if (number == allowedAfter)
     {
         return(true);
     }
     return(false);
 }
 private static void CreateInstances()
 {
     if (instances == null)
     {
         instances = new List <RomanNumberInstance>();
         RomanNumberInstance one = new RomanNumberInstance(1, 'I', null, null);
         instances.Add(one);
         RomanNumberInstance five = new RomanNumberInstance(5, 'V', one, one);
         instances.Add(five);
         RomanNumberInstance ten = new RomanNumberInstance(10, 'X', one, null);
         instances.Add(ten);
         RomanNumberInstance fifty = new RomanNumberInstance(50, 'L', ten, ten);
         instances.Add(fifty);
         RomanNumberInstance hundered = new RomanNumberInstance(100, 'C', ten, null);
         instances.Add(hundered);
         RomanNumberInstance fivehundered = new RomanNumberInstance(500, 'D', hundered, hundered);
         instances.Add(fivehundered);
         RomanNumberInstance thousand = new RomanNumberInstance(1000, 'M', hundered, null);
         instances.Add(thousand);
     }
 }
        internal static int ConvertToNumber(string RomanNumber)
        {
            CreateInstances();
            char[] characters = RomanNumber.ToCharArray();
            RomanNumberInstance highestInstance = null;
            int totalNumber = 0;

            for (int i = characters.Length - 1; i >= 0; i--)
            {
                bool found = false;
                foreach (RomanNumberInstance instance in instances)
                {
                    if (instance.GetLetter().Equals(characters[i]))
                    {
                        found = true;
                        if (highestInstance == null)
                        {
                            highestInstance = instance;
                        }
                        else if (highestInstance.GetNumber() < instance.GetNumber())
                        {
                            highestInstance = instance;
                        }
                        if (highestInstance.GetNumber() > instance.GetNumber())
                        {
                            totalNumber -= instance.GetNumber();
                        }
                        else
                        {
                            totalNumber += instance.GetNumber();
                        }
                    }
                }
                if (found == false)
                {
                    throw new Exception("Character gevonden wat geen bekend romeins nummer is");
                }
            }
            return(totalNumber);
        }
        internal static string ConvertToRomanSingularNumber(int numberToConvert)
        {
            if (numberToConvert == 0)
            {
                return("");
            }
            CreateInstances();
            RomanNumberInstance before = null;
            RomanNumberInstance after  = null;

            foreach (RomanNumberInstance instance in instances)
            {
                int instanceNumber = instance.GetNumber();
                if (numberToConvert == instanceNumber)
                {
                    return("" + instance.GetLetter());
                }
                if (numberToConvert > instanceNumber)
                {
                    if (before == null || before.GetNumber() < instanceNumber)
                    {
                        before = instance;
                    }
                }
                if (numberToConvert < instanceNumber)
                {
                    if (after == null || after.GetNumber() > instanceNumber)
                    {
                        after = instance;
                    }
                }
            }
            if (after != null)
            {
                foreach (RomanNumberInstance instance in instances)
                {
                    if (after.AllowedBefore(instance))
                    {
                        if (after.GetNumber() - instance.GetNumber() == numberToConvert)
                        {
                            return("" + instance.GetLetter() + after.GetLetter());
                        }
                    }
                }
            }
            if (before != null)
            {
                int amountOfBefores = 2;
                while (true)
                {
                    if (before.GetNumber() * amountOfBefores == numberToConvert)
                    {
                        string toReturn = "";
                        for (int i = 0; i < amountOfBefores; i++)
                        {
                            toReturn += before.GetLetter();
                        }
                        return(toReturn);
                    }
                    else if (before.GetNumber() * amountOfBefores > numberToConvert)
                    {
                        foreach (RomanNumberInstance instance in instances)
                        {
                            if (before.AllowedAfter(instance))
                            {
                                int amountOfAfters = 1;
                                while (true)
                                {
                                    if (before.GetNumber() + instance.GetNumber() * amountOfAfters == numberToConvert)
                                    {
                                        string toReturn = "" + before.GetLetter();
                                        for (int i = 0; i < amountOfAfters; i++)
                                        {
                                            toReturn += instance.GetLetter();
                                        }
                                        return(toReturn);
                                    }
                                    else if (before.GetNumber() + instance.GetNumber() * amountOfAfters > numberToConvert)
                                    {
                                        throw new NotImplementedException();
                                    }
                                    else
                                    {
                                        amountOfAfters++;
                                    }
                                }
                            }
                        }
                    }
                    else
                    {
                        amountOfBefores++;
                    }
                }
            }
            throw new NotImplementedException();
        }