2016-04-22 9 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" 

Ich habe Startdatum (2015-05-21 13:00:00) und Enddatum (2015-06-09 22:00:00)Erhalten nächsten Termine

Eigentlich muss ich die zwei Daten aus der obigen Anordnung erhalten, die näher oder gleich sind Startdatum und Enddatum.

Beachten Sie außerdem, dass das Datum, das dem Startdatum am nächsten ist, gleich oder vor dem Startdatum sein sollte und das Datum, das dem Enddatum am nächsten kommt, sollte gleich oder nach dem Enddatum sein. Mit anderen Worten: Suchen Sie anhand der Datumsliste den kleinsten Datumsbereich, der das Start- und Enddatum enthält. In diesem Fall lautet der Ausgang "2015-05-15 13:00:00" und "2015-06-14 13:00:00".

Wie erreicht man dies in C#?

+4

Haben Sie versucht, _anything_ Ihr Problem zu lösen? –

+0

Ja, versucht viel .. – StackOverflow

+3

Also bitte zeigen Sie, was Sie versucht haben, und erklären, was schief gelaufen ist. (Als erste Idee, sortiere die Liste, führe eine binäre Suche durch, und du findest entweder ein übereinstimmendes Datum oder den Index mit den angrenzenden Einträgen ...) –

Antwort

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(); 
//} 

Ergebnis:

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

Wo OrderBy [Descendin g] FirstOrDefault:
2015-05-15 13:00:00
2015-06-14 13:00:00

+0

Anstelle von 'List ', können wir die Lösung mit 'List ' – StackOverflow

+0

erreichen Das ist eine Liste von Datum Zeit, ich ging nur faul auf sie. – Xiaoy312

+0

Soll ich Ihren Code ohne Änderung verwenden? – 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; 
} 

Einfache Suche auf Google bezieht sich auf this