Dimensional.cs 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. namespace Jint.Tests.Runtime.Domain
  2. {
  3. public class Dimensional : IComparable<Dimensional>
  4. {
  5. private readonly MeasureUnit[] PossibleMeasureUnits = new MeasureUnit[] { new MeasureUnit("Mass", "kg", 1.0), new MeasureUnit("Mass", "gr", 0.001), new MeasureUnit("Count", "piece", 1.0) };
  6. public MeasureUnit MeasureUnit { get; private set; }
  7. public double Value { get; private set; }
  8. public double NormalizatedValue
  9. {
  10. get
  11. {
  12. return Value * MeasureUnit.RelativeValue;
  13. }
  14. }
  15. public Dimensional(string measureUnit, double value)
  16. {
  17. MeasureUnit = GetMeasureUnitByName(measureUnit);
  18. Value = value;
  19. }
  20. public static Dimensional operator +(Dimensional left, Dimensional right)
  21. {
  22. if (left.MeasureUnit.MeasureType != right.MeasureUnit.MeasureType)
  23. throw new InvalidOperationException("Dimensionals with different measure types are non-summable");
  24. return new Dimensional(left.MeasureUnit.RelativeValue <= right.MeasureUnit.RelativeValue ? left.MeasureUnit.Name : right.MeasureUnit.Name,
  25. left.Value * left.MeasureUnit.RelativeValue + right.Value * right.MeasureUnit.RelativeValue);
  26. }
  27. private MeasureUnit GetMeasureUnitByName(string name)
  28. {
  29. return PossibleMeasureUnits.FirstOrDefault(mu => mu.Name == name);
  30. }
  31. public int CompareTo(Dimensional obj)
  32. {
  33. if (MeasureUnit.MeasureType != obj.MeasureUnit.MeasureType)
  34. throw new InvalidOperationException("Dimensionals with different measure types are non-comparable");
  35. return NormalizatedValue.CompareTo(obj.NormalizatedValue);
  36. }
  37. public override string ToString()
  38. {
  39. return Value + " " + MeasureUnit.Name;
  40. }
  41. }
  42. public class MeasureUnit
  43. {
  44. public string MeasureType { get; set; }
  45. public string Name { get; set; }
  46. public double RelativeValue { get; set; }
  47. public MeasureUnit(string measureType, string Name, double relativeValue)
  48. {
  49. this.MeasureType = measureType;
  50. this.Name = Name;
  51. this.RelativeValue = relativeValue;
  52. }
  53. }
  54. }