See the question and my original answer on StackOverflow

FWIW, here is a "try parse" version of David DeMar's answer:

private static readonly Dictionary<char, int> _romanMap = new Dictionary<char, int>() { { 'I', 1 }, { 'V', 5 }, { 'X', 10 }, { 'L', 50 }, { 'C', 100 }, { 'D', 500 }, { 'M', 1000 } };

public static bool TryParseRoman(string text, out int value)
{
    value = 0;
    if (string.IsNullOrEmpty(text))
        return false;

    var number = 0;
    for (var i = 0; i < text.Length; i++)
    {
        if (!_romanMap.TryGetValue(text[i], out var num))
            return false;

        if ((i + 1) < text.Length)
        {
            if (!_romanMap.TryGetValue(text[i + 1], out var num2))
                return false;

            if (num < num2)
            {
                number -= num;
                continue;
            }
        }

        number += num;
    }

    value = number;
    return true;
}