using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; namespace GPW.CORE.Data { public class Utils { #region Public Methods /// /// Costruisce una riga ripetendo un carattere molte volte /// /// /// /// public static string charLine(char padChar, int repNum) { return new string(padChar, repNum); } /// /// Effettua trim di una data al numero di minuti indicato /// /// vedere qui: https://stackoverflow.com/questions/1393696/rounding-datetime-objects /// /// DataOra originale /// Minuti di arrotondamento richeisti /// Arrotondamento x difetto (floor = true) o eccesso (false) /// public static DateTime DateRounded(DateTime DateOrig, int roundMin, bool isFloor) { long ticks = 0; roundMin = roundMin <= 0 ? 1 : roundMin; TimeOnly step = new TimeOnly(0, roundMin); if (isFloor) { ticks = DateOrig.Ticks / step.Ticks; } else { ticks = (DateOrig.Ticks + step.Ticks - 1) / step.Ticks; } DateTime answ = new DateTime(ticks * step.Ticks, DateOrig.Kind); return answ; } /// /// Inizializzazione con periodo e arrotondamento /// /// /// public static DateTime InitDatetime(DateTime dtRif, int minRound) { TimeSpan DayElapsed = dtRif.Subtract(dtRif.Date); int minDay = (int)Math.Ceiling((double)(DayElapsed.TotalMinutes / minRound)) * minRound; DateTime endRounded = DateTime.Today.AddMinutes(minDay); return endRounded; } /// /// Effettua salvataggio in file di un generico oggetto in formato CSV /// /// /// /// /// Separatore da impiegare /// public static async Task SaveToCsv(List reportData, string path, char separator) { var lines = new List(); IEnumerable props = TypeDescriptor.GetProperties(typeof(T)).OfType(); var header = string.Join(";", props.ToList().Select(x => x.Name)); lines.Add(header); var valueLines = reportData.Select(row => string.Join(separator, header.Split(separator).Select(a => row.GetType().GetProperty(a).GetValue(row, null)))); //var valueLines = reportData.Select(row => string.Join(";", header.Split(';').Select(a => row.GetType().GetProperty(a).GetValue(row, null)))); lines.AddRange(valueLines); await Task.Run(() => File.WriteAllLines(path, lines.ToArray())); } /// /// Effettua arrotondamento di un timespan ad un dato step di minuti /// /// vedere qui: https://stackoverflow.com/questions/1393696/rounding-datetime-objects /// /// DataOra originale /// Minuti di arrotondamento richeisti /// Arrotondamento x difetto (floor = true) o eccesso (false) /// public static TimeSpan TSpanRounded(TimeSpan TSpanOrig, int roundMin, bool isFloor) { long ticks = 0; roundMin = roundMin <= 0 ? 1 : roundMin; TimeOnly step = new TimeOnly(0, roundMin); if (isFloor) { ticks = TSpanOrig.Ticks / step.Ticks; } else { ticks = (TSpanOrig.Ticks + step.Ticks - 1) / step.Ticks; } TimeSpan answ = new TimeSpan(ticks * step.Ticks); return answ; } /// /// Effettua arrotondamento di un timespan ad un dato step di minuti /// /// vedere qui: https://stackoverflow.com/questions/1393696/rounding-datetime-objects /// /// DataOra originale /// Minuti di arrotondamento richeisti /// public static TimeSpan TSpanRounded(TimeSpan TSpanOrig, int roundMin) { long ticks = 0; roundMin = roundMin <= 0 ? 1 : roundMin; TimeOnly step = new TimeOnly(0, roundMin); ticks = (TSpanOrig.Ticks + step.Ticks / 2) / step.Ticks; TimeSpan answ = new TimeSpan(ticks * step.Ticks); return answ; } #endregion Public Methods } }