LINQ- Max在哪里条件

Sha*_*yan 11 c# linq max where

我有一个带有这个定义的类TaskWeekUI:

 public class TaskWeekUI    {
   public Guid TaskWeekId { get; set; }
   public Guid TaskId { get; set; }
   public Guid WeekId { get; set; }
   public DateTime EndDate { get; set; }
   public string PersianEndDate { get; set; }
   public double PlanProgress { get; set; }
   public double ActualProgress { get; set; }    } 
Run Code Online (Sandbox Code Playgroud)

我写了这个查询:

 TaskWeekUI ti =  tis.First( t => t.PlanProgress > 0 && t.EndDate ==  tis.Where(p => p.PlanProgress != null && p.PlanProgress > 0).Max(w => w.EndDate));
Run Code Online (Sandbox Code Playgroud)

这个查询是真的吗?我能比这更好地写出我的查询吗?

Che*_*hen 34

我想你想要一个PlanProgress > 0最近的人EndDate.

TaskWeekUI ti = tis.Where(t => t.PlanProgress > 0)
                   .OrderByDescending(t => t.EndDate)
                   .FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

  • 为了获得具有最高`EndDate`的项目,排序整个列表是不是浪费时间?[这](http://stackoverflow.com/a/1101979/1219414)似乎是一个更好的解决方案. (2认同)

ILy*_*Lya 5

从获得的结果来看,这个查询似乎是正确的。

但是在你的内部查询中,tis.Where(p => p.PlanProgress != null && p.PlanProgress > 0).Max(w => w.EndDate)计算集合中的每个元素t.PlanProgress > 0

因此,这是在查询之外获取最大值的更好方法,如下所示:

var max = tis.Where(p => p.PlanProgress != null && p.PlanProgress > 0).Max(w => w.EndDate);
tis.First( t => t.PlanProgress > 0 && t.EndDate == max);
Run Code Online (Sandbox Code Playgroud)

更进一步 p.PlanProgress != null 始终为 true,因为 p.PlanProgress 不是 Nullable 类型。所以我们的代码就变成了这样:

var max = tis.Where(p => p.PlanProgress > 0).Max(w => w.EndDate);
    tis.First( t => t.PlanProgress > 0 && t.EndDate == max);
Run Code Online (Sandbox Code Playgroud)

或者您可以更改类的定义并将 p.PlanProgress 设为 Nullable 类型:

public class TaskWeekUI    {
   public Guid TaskWeekId { get; set; }
   public Guid TaskId { get; set; }
   public Guid WeekId { get; set; }
   public DateTime EndDate { get; set; }
   public string PersianEndDate { get; set; }
   public double? PlanProgress { get; set; }
   public double ActualProgress { get; set; }    
} 

var max = tis.Where(p => p.PlanProgress.HasValue && p.PlanProgress.Value > 0).Max(w => w.EndDate);
    tis.First( t => t.PlanProgress.HasValue && t.PlanProgress.Value > 0 && t.EndDate == max);
Run Code Online (Sandbox Code Playgroud)