#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();
Комментариев нет:
Отправить комментарий