LINQ选择满足特定条件的最后一天

时间:2013-07-24 18:22:33

标签: c# linq

我有一个像这样的对象列表

MyObject
  .StartDate
  .EndDate
  .Number

我需要知道数字总和超过一定数字的最后一天是什么时候。 如果它在StartDate和EndDate之间,则该数字仅输入当天的总和。

var list = List<MyObject>();

from list
  where (list.Sum(x => x.Number) > 100)
  select lastdate

这可以用LINQ吗?

4 个答案:

答案 0 :(得分:4)

假设列表按顺序排列:

var list = List<MyObject>();

var lastDate = list.First(item => list.Where(l => l.EndDate <= item.EndDate)
                                      .Sum(x => x.Number) > 100
                         )
                   .EndDate

如果不只是添加订单:

var list = List<MyObject>();

var lastDate = list.OrderBy(item => item.EndDate)
                   .First(item => list.Where(l => l.EndDate <= item.EndDate)
                                      .Sum(x => x.Number) > 100
                         )
                   .EndDate

但是,您要为每个项目重新扫描循环。使用简单的循环会更有效:

DateTime endDate;
int total;
foreach(var item in list.OrderBy(item => item.EndDate))
{
   total += item.Number;
   if(total > 100)
   {
      endDate = item.EndDate;
      break;
   }
}

答案 1 :(得分:1)

您可能需要额外的财产才能执行此操作。不确定如何在单行LINQ语句中执行此操作:

public class MyObjectWithSum
{
    public DateTime StartDate {get;set;}
    public DateTime EndDate {get;set;}
    public int Number {get;set;}
    public int SumAsOfEndDate {get;set;}
}

var list = new List<MyObjectWithSum>();

foreach(var item in list)
{
    item.SumAsOfEndDate = list.Sum(x => x.Number).Where(y => y.EndDate <= item.EndDate);
}

list.OrderBy(x => x.EndDate).First(x => x.SumAsOfEndDate > 100).EndDate;

答案 2 :(得分:1)

var result = items.Where(t => items.SkipWhile(tt => tt.EndDate != t.EndDate)
    .Sum(tt => tt.Number) > 100).First().EndDate;

答案 3 :(得分:0)

        var lastdate = list.OrderByDescending(l => l.EndDate)
         .First(l =>
             list.Where(s => s.StartDate <= l.EndDate && l.EndDate <= s.EndDate)
             .Sum(s => s.Number) > 100).EndDate;

我们不需要检查任何日期,因为对sum的更改由enddate的更改决定。

所以:

  • 按降序排序顺序对列表进行排序,因为我们只需要最后一个日期。
  • 搜索数字总和高于100的第一个匹配:
    • 创建一个列表,列出在结束日期之前和之后或之后开始的所有项目
    • 汇总所有数字

这样就防止了不必要的迭代,并且忽略了以后结束但在检查日期之后开始的项目。