Standard Unit
Inheritance: ConstantClass
        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;
 }