在列表中找到相应的项目

时间:2018-06-04 15:19:58

标签: c# linq

我有以下列表项目,以便清楚地显示我可以看到下面的小列表,可能是数百行。

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    

我要传递ClassNameDate来检索相应的对象。我很难如何在LINQ

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

}

例如,我实现的逻辑返回了两个类。但是,我只需要让startdate的项目更接近给定的日期。

如果我传递today date并且课程名称为Math,那么它应该从列表中返回25325 courseID个对象。

即使有两门数学课程,但已开始01-25-2018的课程是指定日期的最新课程。

在其他示例中,如果我给出日期01-01-2018,那么它应该返回12321该对象。因为01-01-2018早于25325 startdate,即01-25-2018。

3 个答案:

答案 0 :(得分:6)

您可OrderBy()OrderByDescending(),这是稳定排序,因此您可以使用FirstOrDefault()First()

选择第一个

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

答案 1 :(得分:0)

您可以按日期订购查询,并按照第一种方式进行查询:

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

答案 2 :(得分:0)

如果我理解正确,您需要返回距离StartDate参数最近的date的课程。

如果是这样,您可以按日期之间的差异排序,然后选择顺序中的第一个。

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