Temperature Converter
| namespace Temperatures; | |
| public enum TemperatureUnit | |
| { | |
| Kelvin, | |
| Celsius, | |
| Fahrenheit, | |
| Rankine | |
| } | |
| public readonly struct Temperature : IEquatable, IComparable | |
| { | |
| public double Kelvin { get; } | |
| Temperature(double kelvin) | |
| { | |
| if (!double.IsFinite(kelvin) || kelvin < 0D) | |
| { | |
| throw new ArgumentOutOfRangeException(nameof(kelvin), | |
| $"[Error] [Temperatures.Temperature]: {nameof(kelvin)} out of range. Value: {kelvin} K. Expected: >= 0 K."); | |
| } | |
| Kelvin = kelvin; | |
| } | |
| public Temperature(double value, TemperatureUnit temperatureUnit) | |
| { | |
| switch (temperatureUnit) | |
| { | |
| case TemperatureUnit.Kelvin: | |
| { | |
| if (!TryFromKelvin(value, out Temperature result)) | |
| { | |
| throw new ArgumentOutOfRangeException(nameof(value), | |
| $"[Error] [Temperatures.Temperature]: {nameof(value)} out of range. Value: {value} K. Expected: >= 0 K."); | |
| } | |
| Kelvin = result.Kelvin; | |
| break; | |
| } | |
| case TemperatureUnit.Celsius: | |
| { | |
| if (!TryFromCelsius(value, out Temperature result)) | |
| { | |
| throw new ArgumentOutOfRangeException(nameof(value), | |
| $"[Error] [Temperatures.Temperature]: {nameof(value)} out of range. Value: {value} C, {CelsiusToKelvin(value)} K. Expected: >= 0 K."); | |
| } | |
| Kelvin = result.Kelvin; | |
| break; | |
| } | |
| case TemperatureUnit.Fahrenheit: | |
| { | |
| if (!TryFromFahrenheit(value, out Temperature result)) | |
| { | |
| throw new ArgumentOutOfRangeException(nameof(value), | |
| $"[Error] [Temperatures.Temperature]: {nameof(value)} out of range. Value: {value} F, {FahrenheitToKelvin(value)} K. Expected: >= 0 K."); | |
| } | |
| Kelvin = result.Kelvin; | |
| break; | |
| } | |
| case TemperatureUnit.Rankine: | |
| { | |
| if (!TryFromRankine(value, out Temperature result)) | |
| { | |
| throw new ArgumentOutOfRangeException(nameof(value), | |
| $"[Error] [Temperatures.Temperature]: {nameof(value)} out of range. Value: {value} R, {RankineToKelvin(value)} K. Expected: >= 0 K."); | |
| } | |
| Kelvin = result.Kelvin; | |
| break; | |
| } | |
| default: | |
| { | |
| throw new ArgumentOutOfRangeException(nameof(temperatureUnit), | |
| $"[Error] [Temperatures.Temperature]: {nameof(temperatureUnit)} out of range. Value: {temperatureUnit}. Expected: {TemperatureUnit.Kelvin} (0), {TemperatureUnit.Celsius} (1), {TemperatureUnit.Fahrenheit} (2), {TemperatureUnit.Rankine} (3)."); | |
| } | |
| } | |
| } | |
| public double Celsius => Kelvin - 273.15D; | |
| public double Fahrenheit => Kelvin * 1.8D - 459.67D; | |
| public double Rankine => Kelvin * 1.8D; | |
| public static double CelsiusToKelvin(double value) => value + 273.15D; | |
| public static double FahrenheitToKelvin(double value) => (value + 459.67D) / 1.8D; | |
| public static double RankineToKelvin(double value) => value / 1.8D; | |
| public static Temperature FromKelvin(double value) => new(value); | |
| public static Temperature FromCelsius(double value) => new(value + 273.15D); | |
| public static Temperature FromFahrenheit(double value) => new((value + 459.67D) / 1.8D); | |
| public static Temperature FromRankine(double value) => new(value / 1.8D); | |
| public static bool TryFromKelvin(double value, out Temperature result) | |
| { | |
| if (!double.IsFinite(value) || value < 0D) | |
| { | |
| result = default; | |
| return false; | |
| } | |
| result = new Temperature(value); | |
| return true; | |
| } | |
| public static bool TryFromCelsius(double value, out Temperature result) => TryFromKelvin(value + 273.15D, out result); | |
| public static bool TryFromFahrenheit(double value, out Temperature result) => TryFromKelvin((value + 459.67D) / 1.8D, out result); | |
| public static bool TryFromRankine(double value, out Temperature result) => TryFromKelvin(value / 1.8D, out result); | |
| public static Temperature operator +(Temperature temperatureOne, Temperature temperatureTwo) => FromKelvin(temperatureOne.Kelvin + temperatureTwo.Kelvin); | |
| public static Temperature operator -(Temperature temperatureOne, Temperature temperatureTwo) => FromKelvin(temperatureOne.Kelvin - temperatureTwo.Kelvin); | |
| public static Temperature operator *(Temperature temperature, double scalar) => FromKelvin(temperature.Kelvin * scalar); | |
| public static Temperature operator *(double scalar, Temperature temperature) => FromKelvin(scalar * temperature.Kelvin); | |
| public static Temperature operator /(Temperature temperature, double scalar) => FromKelvin(temperature.Kelvin / scalar); | |
| public static Temperature operator %(Temperature temperature, double scalar) => FromKelvin(temperature.Kelvin % scalar); | |
| public static double operator /(double scalar, Temperature temperature) => scalar / temperature.Kelvin; | |
| public static double operator %(double scalar, Temperature temperature) => scalar % temperature.Kelvin; | |
| public static double operator *(Temperature temperatureOne, Temperature temperatureTwo) => temperatureOne.Kelvin * temperatureTwo.Kelvin; | |
| public static double operator /(Temperature temperatureOne, Temperature temperatureTwo) => temperatureOne.Kelvin / temperatureTwo.Kelvin; | |
| public static double operator %(Temperature temperatureOne, Temperature temperatureTwo) => temperatureOne.Kelvin % temperatureTwo.Kelvin; | |
| public static Temperature operator ++(Temperature temperature) => FromKelvin(temperature.Kelvin + 1); | |
| public static Temperature operator --(Temperature temperature) => FromKelvin(temperature.Kelvin - 1); | |
| public static bool operator ==(Temperature temperatureOne, Temperature temperatureTwo) => temperatureOne.Kelvin == temperatureTwo.Kelvin; | |
| public static bool operator !=(Temperature temperatureOne, Temperature temperatureTwo) => !(temperatureOne == temperatureTwo); | |
| public static bool operator <(Temperature temperatureOne, Temperature temperatureTwo) => temperatureOne.Kelvin < temperatureTwo.Kelvin; | |
| public static bool operator >(Temperature temperatureOne, Temperature temperatureTwo) => temperatureOne.Kelvin > temperatureTwo.Kelvin; | |
| public static bool operator <=(Temperature temperatureOne, Temperature temperatureTwo) => temperatureOne.Kelvin <= temperatureTwo.Kelvin; | |
| public static bool operator >=(Temperature temperatureOne, Temperature temperatureTwo) => temperatureOne.Kelvin >= temperatureTwo.Kelvin; | |
| public bool Equals(Temperature other) => Kelvin == other.Kelvin; | |
| public int CompareTo(Temperature other) => Kelvin.CompareTo(other.Kelvin); | |
| public override bool Equals(object? obj) => obj is Temperature temperature && Equals(temperature); | |
| public override int GetHashCode() => Kelvin.GetHashCode(); | |
| public override string ToString() => $"{Kelvin} K"; | |
| public string ToString(TemperatureUnit temperatureUnit) => temperatureUnit switch | |
| { | |
| TemperatureUnit.Kelvin => $"{Kelvin} K", | |
| TemperatureUnit.Celsius => $"{Celsius} C", | |
| TemperatureUnit.Fahrenheit => $"{Fahrenheit} F", | |
| TemperatureUnit.Rankine => $"{Rankine} R", | |
| _ => throw new ArgumentOutOfRangeException(nameof(temperatureUnit), | |
| $"[Error] [Temperatures.Temperature]: {nameof(temperatureUnit)} out of range. Value: {temperatureUnit}. Expected: {TemperatureUnit.Kelvin} (0), {TemperatureUnit.Celsius} (1), {TemperatureUnit.Fahrenheit} (2), {TemperatureUnit.Rankine} (3).") | |
| }; | |
| public double Get(TemperatureUnit temperatureUnit) => temperatureUnit switch | |
| { | |
| TemperatureUnit.Kelvin => Kelvin, | |
| TemperatureUnit.Celsius => Celsius, | |
| TemperatureUnit.Fahrenheit => Fahrenheit, | |
| TemperatureUnit.Rankine => Rankine, | |
| _ => throw new ArgumentOutOfRangeException(nameof(temperatureUnit), | |
| $"[Error] [Temperatures.Temperature]: {nameof(temperatureUnit)} out of range. Value: {temperatureUnit}. Expected: {TemperatureUnit.Kelvin} (0), {TemperatureUnit.Celsius} (1), {TemperatureUnit.Fahrenheit} (2), {TemperatureUnit.Rankine} (3).") | |
| }; | |
| public float GetFloat(TemperatureUnit temperatureUnit) | |
| { | |
| return (float)Get(temperatureUnit); | |
| } | |
| } |
评论
?
参与讨论