Mam następujący element listy, aby wyświetlić wyraźnie, mogłem wizualizować, że mała lista następuje, że może to być setki wierszy.

CourseId    ClassName    StartDate
--------    --------      --------  
12321       Math         08-25-2017  
32342       Physics      08-25-2017  
34345       Chemistry    08-25-2017 
25325       Math         01-25-2018     
44345       Chemistry    01-25-2018    

Mam ClassName i Date, aby przejść do pobierania odpowiedniego obiektu. Mam trudności ze sposobem na wdrożenie parametru Date do LINQ

public Course GetClassesByNameAndDate(string className, DateTime date, List<Courses> allCourses)
{
    Course course  = allCourses.Where( x=> x.ClassName == className & x.StartDate <= date );

}

Na przykład logika, którą implementuję, zwraca mi dwie klasy. Jednak muszę tylko mieć przedmiot, który uruchomiony jest bliżej danej daty.

Jeśli przekazuję today date, a także nazwa kursu jako Math, a następnie należy zwrócić mi obiekt 25325 courseID z listy.

Mimo że istnieją dwa kursy matematyczne, ale ten, który rozpoczął 01-25-2018 jest najnowszym kursem do danej daty.

W innym przykładzie, jeśli daję datę 01-01-2018, to powinien zwrócić 12321 tego obiektu. Ponieważ 01-01-2018 jest wcześniejszy niż początek 25325, który ma 01-25-2018.

3
casillas 4 czerwiec 2018, 18:19

3 odpowiedzi

Najlepsza odpowiedź

Możesz OrderBy() lub {x1}}, To stabilne sortowanie, więc możesz wybrać pierwszy za pomocą FirstOrDefault() lub po prostu First()

allCourses.Where( x=> x.ClassName == className && x.StartDate <= date ).OrderByDescending(x=> x.StartDate ).FirstOrDefault();

6
Valentin 4 czerwiec 2018, 15:25

Możesz zamówić zapytanie przez datę i weź pierwszą jak:

Course course  = allCourses.Where( x=> x.ClassName == className & x.StartDate <= date).OrderByDescending(x => x.StartDate).First();;
0
Shiran Dror 4 czerwiec 2018, 15:25

Jeśli rozumiem poprawnie, musisz zwrócić klasę za pomocą StartDate, najbliżej argumentu date.

Jeśli tak, możesz zamówić różnicę między datami, a następnie wybrać pierwszy w kolejności.

public Course GetClassesByNameAndDate(string className, DateTime date, List<Courses> allCourses)
{
    Course course  = allCourses
       .OrderBy( x => (x.StartDate - date).Duration() ) // use duration to turn negative TimeSpans into positive
       .First( x=> x.ClassName == className & x.StartDate <= date );
}
0
jag 4 czerwiec 2018, 15:32