A simple implementation for hex (and all bases up to 16); expand it by adding characters to the string constant (credit where credit is due; this is based on Douglas's answer):
private const string digits = "0123456789ABCDEF";
private readonly Dictionary<char, BigInteger> values
= digits.ToDictionary(c => c, c => (BigInteger)digits.IndexOf(c));
public BigInteger ParseBigInteger(string value, BigInteger baseOfValue)
{
return value.Aggregate(
new BigInteger,
(current, digit) => current * baseOfValue + values[digit]);
}
It is likely that arithmetic where one operand is an int is faster than if both operands are BigInteger. In that case:
private readonly Dictionary<char, int> values
= digits.ToDictionary(c => c, c => digits.IndexOf(c));
public BigInteger ParseBigInteger(string value, int baseOfValue)
{
return value.Aggregate(
new BigInteger,
(current, digit) => current * baseOfValue + values[digit]);
}