Страницы

Поиск по вопросам

четверг, 19 декабря 2019 г.

Определить какая дата из массива находится ближе всего к введенной дате

#c_sharp #массивы


Есть массив дат, каждой дате поставлено в соответствие определенное значение параметра.
Пользователь вводит дату и надо определить значение параметра, дата которого находится
ближе всего к введенной дате. Единственное что приходит в голову это использовать массив
кортежей List>, в котором хранить параметр и разницу между датами (датой
параметра и введенной датой) и затем отсортировать и взять первое значение. Возможно
есть более красивый способ? Спасибо.
    


Ответы

Ответ 1



Как верно заметили, сортировка не нужна. Быстрее будет пробежаться по всем элементам, на ходу вычисляя самый близкий. Ну и не забудьте про приведение дат к UTC, например, если они у вас из разных поясов. var data = new Dictionary() { { DateTime.Now.AddDays(-2), -2 }, { DateTime.Now.AddDays(-1), -1 }, { DateTime.Now.AddDays(3), 3 }, }; var specifiedDate = DateTime.Now; var distances = data .Select(p => new { Distance = Math.Abs((specifiedDate - p.Key).Ticks), p.Value }); var distance = long.MaxValue; int closestParameter; foreach (var pair in distances) { if (pair.Distance < distance) { distance = pair.Distance; closestParameter = pair.Value; } }

Ответ 2



Ну и в качестве варианта, моя любимая функция MinBy из пакета MoreLinq: using MoreLinq; // ... var dict = new Dictionary() { [new DateTime(2016, 1, 1)] = "прошедший Новый Год", [new DateTime(2016, 12, 31)] = "будущий Новый Год", [new DateTime(2014, 1, 5)] = "давным-давно" }; var today = DateTime.Now; var closestValue = dict.MinBy(kvp => (kvp.Key - today).Duration()).Value; // -> будущий Новый Год

Ответ 3



Используй Linq, Люк... :) var RawData = new List () { { DateTime.Now.AddDays(-2) }, { DateTime.Now.AddDays(-1) }, { DateTime.Now.AddDays(3) } } var specifiedDate = DateTime.Now; var minDistance = RawData.Min(n => (n - specifiedDate).Duration()); var minDate = RawData.Where(n => (n - specifiedDate).Duration() == minDistance).ToList();

Комментариев нет:

Отправить комментарий