代码之家  ›  专栏  ›  技术社区  ›  casillas

在列表中找到相应的项

  •  3
  • casillas  · 技术社区  · 6 年前

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

    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    
    

    我有 ClassName Date 传递以检索相应的对象。我很难实施 日期 进入LINQ的参数

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

    例如,我实现的逻辑返回两个类。不过,我只需要有一个项目的开始日期是接近给定的日期。

    如果我通过 today date 以及课程名称 Math ,那它应该还我 25325 courseID 列表中的对象。

    尽管有两门数学课,但是 01-25-2018 是指定日期的最新课程。

    在另一个例子中,如果我给出一个日期 01-01-2018 ,则应返回12321该对象。因为 01-01-2018 早于 25325 起始日期为2018年1月25日。

    3 回复  |  直到 6 年前
        1
  •  6
  •   Valentin    6 年前

    你可以 OrderBy() OrderByDescending() ,它是稳定的排序,因此您可以使用 FirstOrDefault() 或者只是 First()

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

        2
  •  0
  •   Shiran Dror    6 年前

    您可以按日期对查询进行排序,并采用第一种方式:

    Course course  = allCourses.Where( x=> x.ClassName == className & x.StartDate <= date).OrderByDescending(x => x.StartDate).First();;
    
        3
  •  0
  •   jag    6 年前

    如果我没听错的话,你需要把 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 );
    }