我有一个像这样的对象列表
MyObject
.StartDate
.EndDate
.Number
我需要知道数字总和超过一定数字的最后一天是什么时候。 如果它在StartDate和EndDate之间,则该数字仅输入当天的总和。
var list = List<MyObject>();
from list
where (list.Sum(x => x.Number) > 100)
select lastdate
这可以用LINQ吗?
答案 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的更改决定。
所以:
这样就防止了不必要的迭代,并且忽略了以后结束但在检查日期之后开始的项目。