private double PerformConvert(StandardUnit to)
{
if (_converterGraph == null)
GenerateGraph();
var queue = new Queue<UnitGraphNode>();
var visited = new HashSet<UnitGraphNode>();
var multipliers = new Dictionary<UnitGraphNode, double>();
var fromNode = _converterGraph[_from];
queue.Enqueue(fromNode);
multipliers.Add(fromNode, 1.0);
while (queue.Any())
{
var n = queue.Dequeue();
if (_converterGraph[to] == n)
{
if (!fromNode.Links.Select(l => l.Value.OtherNode).Contains(n))
fromNode.LinkTo(n, multipliers[n]);
return multipliers[n] * _value;
}
if (!visited.Contains(n))
{
visited.Add(n);
var multiplier = multipliers[n];
foreach (var link in n.Links.Values)
{
if (!visited.Contains(link.OtherNode))
{
queue.Enqueue(link.OtherNode);
if (!multipliers.ContainsKey(link.OtherNode))
multipliers.Add(link.OtherNode, multiplier * link.Multiplier);
}
}
}
}
throw new ConversionNotSupportedException();
}