/// <summary>
 ///     Calculates the current temperature where percipitation will fall as snow
 /// </summary>
 /// <typeparam name="T"></typeparam>
 /// <param name="sourceTable"></param>
 /// <param name="humidityName"></param>
 /// <param name="resultName"></param>
 /// <param name="dewPoint">0°C for snow, 0.8°C for sleet</param>
 /// <returns></returns>
 public static INullableQueryTable <T> SnowingTemperature <T>(this INullableQueryTable <T> sourceTable,
                                                              string humidityName, string resultName = "Snowing Temperature", float dewPoint = 0.8f) where T : struct
 {
     return
         (sourceTable.ToNewTable(
              (o, n) =>
     {
         n.AddSerie(
             sourceTable.TryGetSerie(humidityName)
             .CalcValue(humidity => CalcSnowingTemperature(dewPoint, humidity), resultName));
     }));
 }
 private static INullableQueryTable <T> TempMath <T>(INullableQueryTable <T> sourceTable, string temperatureName,
                                                     string humidityName, string dewPointName, Func <TemperatureMath, double> valueSelector) where T : struct
 {
     return(sourceTable.ToNewTable((o, n) =>
     {
         n.AddSerie(sourceTable.TryGetSerie(temperatureName)
                    .Zip(sourceTable.TryGetSerie(humidityName), dewPointName,
                         (t, h) =>
         {
             if (!t.HasValue || !h.HasValue)
             {
                 return null;
             }
             var tempMath = new TemperatureMath(Convert.ToDouble(t.Value), Convert.ToDouble(h.Value));
             return (T)Convert.ChangeType(valueSelector(tempMath), typeof(T));
         }));
     }));
 }
 private static INullableQueryTable <T> CalcLine <T>(INullableQueryTable <T> sourceTable, string temperatureName,
                                                     string humidityName, string resultName, float dewPoint, float stationAltitude) where T : struct
 {
     return(sourceTable.ToNewTable((o, n) =>
     {
         n.AddSerie(sourceTable.TryGetSerie(temperatureName)
                    .Zip(sourceTable.TryGetSerie(humidityName), resultName,
                         (t, h) =>
         {
             if (t.HasValue == false || h.HasValue == false)
             {
                 return null;
             }
             T?snowTemp = CalcSnowingTemperature(dewPoint, h);
             var altititude = stationAltitude + (t.ToFloat() - snowTemp.ToFloat()) * 160;
             return altititude.ToType <T>();
         }));
     }));
 }