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);
}
}
添加评论
点赞收藏
点踩分享查看原文
评论
?
参与讨论