public double To(StandardUnit to) { if (to == _from) return _value; return PerformConvert(to); }
public UnitConverter From(StandardUnit standardUnit) { _from = standardUnit; return this; }
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(); }
private UnitGraphNode(string s) { _unit = new StandardUnit(s); }
public MetricDatum WithUnit(StandardUnit value) { _datum.Unit = value; return this; }