125 lines
5.0 KiB
C#
125 lines
5.0 KiB
C#
using System.ComponentModel;
|
|
|
|
namespace GPW.CORE
|
|
{
|
|
public class Utils
|
|
{
|
|
#region Public Methods
|
|
|
|
/// <summary>
|
|
/// Costruisce una riga ripetendo un carattere molte volte
|
|
/// </summary>
|
|
/// <param name="padChar"></param>
|
|
/// <param name="repNum"></param>
|
|
/// <returns></returns>
|
|
public static string charLine(char padChar, int repNum)
|
|
{
|
|
return new string(padChar, repNum);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Effettua trim di una data al numero di minuti indicato
|
|
///
|
|
/// vedere qui: https://stackoverflow.com/questions/1393696/rounding-datetime-objects
|
|
/// </summary>
|
|
/// <param name="DateOrig">DataOra originale</param>
|
|
/// <param name="roundMin">Minuti di arrotondamento richeisti</param>
|
|
/// <param name="isFloor">Arrotondamento x difetto (floor = true) o eccesso (false)</param>
|
|
/// <returns></returns>
|
|
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;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Inizializzazione con periodo e arrotondamento
|
|
/// </summary>
|
|
/// <param name="minRound"></param>
|
|
/// <returns></returns>
|
|
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;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Effettua salvataggio in file di un generico oggetto in formato CSV
|
|
/// </summary>
|
|
/// <typeparam name="T"></typeparam>
|
|
/// <param name="reportData"></param>
|
|
/// <param name="path"></param>
|
|
/// <param name="separator">Separatore da impiegare</param>
|
|
/// <returns></returns>
|
|
public static async Task SaveToCsv<T>(List<T> reportData, string path, char separator)
|
|
{
|
|
var lines = new List<string>();
|
|
IEnumerable<PropertyDescriptor> props = TypeDescriptor.GetProperties(typeof(T)).OfType<PropertyDescriptor>();
|
|
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()));
|
|
}
|
|
|
|
/// <summary>
|
|
/// Effettua arrotondamento di un timespan ad un dato step di minuti
|
|
///
|
|
/// vedere qui: https://stackoverflow.com/questions/1393696/rounding-datetime-objects
|
|
/// </summary>
|
|
/// <param name="TSpanOrig">DataOra originale</param>
|
|
/// <param name="roundMin">Minuti di arrotondamento richeisti</param>
|
|
/// <param name="isFloor">Arrotondamento x difetto (floor = true) o eccesso (false)</param>
|
|
/// <returns></returns>
|
|
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;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Effettua arrotondamento di un timespan ad un dato step di minuti
|
|
///
|
|
/// vedere qui: https://stackoverflow.com/questions/1393696/rounding-datetime-objects
|
|
/// </summary>
|
|
/// <param name="DateOrig">DataOra originale</param>
|
|
/// <param name="roundMin">Minuti di arrotondamento richeisti</param>
|
|
/// <returns></returns>
|
|
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
|
|
}
|
|
} |