C#:
public class Interval
{
public double Min { get; set; }
public double Max { get; set; }
public Interval(double min, double max)
{
Min = min;
Max = max;
}
/// <summary>
/// Проверяет вхождение числа в интевал.
/// </summary>
/// <param name="val"></param>
/// <returns></returns>
public bool Has(double val)
{
return Min <= val && Max >= val;
}
/// <summary>
/// Возвращает случайное число из интервала.
/// </summary>
/// <returns></returns>
public double Random()
{
var rnd = new Random(DateTime.Now.Second);
var iRnd = rnd.Next((int)Min, (int)Max);
var dRnd = iRnd + rnd.NextDouble();
return Has(dRnd) ? dRnd : iRnd;
}
/// <summary>
/// Выполняет сравнивание перечня диапазона с указанным числом и возвращает первый совпавший ключ.
/// </summary>
/// <param name="dictionary">Словарь диапазонов.</param>
/// <param name="has">Проверяемое число.</param>
/// <returns>Первое совпадения из словоря.</returns>
public static string DictionaryHas(Dictionary<string, double[]> dictionary, double has)
{
foreach (var kvp in dictionary)
{
for (var i = 0; i < kvp.Value.Length; i++)
{
var j = i + 1;
if (kvp.Value.Length <= j) continue;
if (new Interval(kvp.Value[i], kvp.Value[j]).Has(has))
{
return kvp.Key;
}
i++;
}
}
return "";
}
/// <summary>
/// Выполняет сравнивание перечня диапазона с указанным числом и возвращает все совпавшие ключи.
/// </summary>
/// <param name="dictionary">Словарь диапазонов.</param>
/// <param name="has">Проверяемое число.</param>
/// <returns>Все совпадения из словаря.</returns>
public static string[] DictionaryHasMany(Dictionary<string, double[]> dictionary, double has)
{
List<string> many = new();
foreach (var kvp in dictionary)
{
for (var i = 0; i < kvp.Value.Length; i++)
{
var j = i + 1;
if (kvp.Value.Length >= j) continue;
if (new Interval(kvp.Value[i], kvp.Value[j]).Has(has))
{
many.Add(kvp.Key);
}
i++;
}
}
return many.ToArray();
}
}
C++:
public class DateTimeInterval
{
/// <summary>
/// Экземпляр <see cref="DateTime"/> начала периода.
/// </summary>
public DateTime Start { get; set; }
/// <summary>
/// Экземпляр <see cref="DateTime"/> окончания периода.
/// </summary>
public DateTime End { get; set; }
public DateTimeInterval(DateTime start, DateTime end)
{
Start = start;
End = end;
}
/// <summary>
/// Количество дней в интервале.
/// </summary>
public long Days => (End - Start).Days;
/// <summary>
/// Находится ли эксземпляр <see cref="DateTime"/> в границах периода.
/// </summary>
/// <param name="dateTime"></param>
/// <returns></returns>
public bool Has(DateTime dateTime)
{
return Start <= dateTime && End >= dateTime;
}
}
Пост автоматически объеденен:
Код не сложной, просто позволяет работать с интервалами даты и чисел. Делал лишь то, что мне нужно было, но можно расширить или объединить вообще.