2016-04-22 4 views
0
List<DateTime> 

"2015-03-21 13:00:00" 
"2015-05-15 13:00:00" 
"2015-05-24 13:00:00" 
"2015-05-27 13:00:00" 
"2015-06-14 13:00:00" 

Я имею дату начала (2015-05-21 13:00:00) и дата окончания (2015-06-09 22:00:00)Получить ближайшие даты

На самом деле мне нужно, чтобы получить две даты из выше массива, которые ближе или равно для начала и даты окончания.

Обратите внимание, что дата, ближайшая к дате начала, должна быть равна или до даты начала, а дата, ближайшая к дате окончания, должна быть равна или после даты окончания. Другими словами, учитывая список дат, найдите наименьший диапазон дат, который включает дату начала и окончания.

В этом случае выход будет «2015-05-15 13:00:00» и «2015-06-14 13:00:00».

Как добиться этого в C#?

+4

Вы пробовали _anything_ решить вашу проблему? –

+0

Да, много пробовал .. – StackOverflow

+3

Итак, пожалуйста, покажите, что вы пробовали, и объясните, что пошло не так. (Как первая идея, сортируйте список, выполните двоичный поиск, и вы либо найдете подходящую дату, либо индекс со смежными записями ...) –

ответ

3
void Main() 
{ 
    var dates = new string[] 
     { 
      "2015-03-21 13:00:00", 
      "2015-05-15 13:00:00", 
      "2015-05-24 13:00:00", 
      "2015-05-27 13:00:00", 
      "2015-06-14 13:00:00" 
     } 
     .Select(x => DateTime.Parse(x)) 
     .ToList(); 

    var start = DateTime.Parse("2015-05-21 13:00:00"); 
    var end = DateTime.Parse("2015-06-09 22:00:00"); 

    Console.WriteLine(dates 
     .Where(x => x <= start) 
     .OrderByDescending(x => x) 
     .FirstOrDefault()); 
    Console.WriteLine(dates 
     .Where(x => x >= end) 
     .OrderBy(x => x) 
     .FirstOrDefault()); 
} 

// the date must be outside of boundary, so this is no longer good... 
//public static DateTime GetClosestDate(IEnumerable<DateTime> source, DateTime date) 
//{ 
// return source 
//  .OrderBy(x => Math.Abs((x.Date - date).TotalSeconds)) 
//  .First(); 
//} 

Результат:

GetClosestDate:
2015-05-24 13:00:00
2015-06-14 13:00:00

Где OrderBy [Descendin г] FirstOrDefault:
2015-05-15 13:00:00
2015-06-14 13:00:00

+0

Вместо 'List ', мы можем достичь решения, используя 'List ' – StackOverflow

+0

Это список дат, я просто ходил на него. – Xiaoy312

+0

Должен ли я использовать ваш код без изменения. – StackOverflow

2
public DateTime? GetClosest(List<DateTime> dates, DateTime dateToCompare) 
{ 
    DateTime? closestDate = null; 
    int min = int.MaxValue; 

    foreach (DateTime date in dates) 
    { 
     if (Math.Abs(date.Ticks - dateToCompare.Ticks) < min) 
     { 
      min = date.Ticks - dateToCompare.Ticks; 
      closestDate = date; 
     } 
    } 
    return closestDate; 
} 

Простой поиск в Google относится к this

Смежные вопросы