我有类似以下类型的列表:
class GroupedItem
{
public DateTime _Date {get;set;}
pubilc int sales {get;set;}
}
列表定义为:
List<GroupedItem> _groupedItems = new List<GroupedItem>();
我想从DateTime.Now中删除列表中的所有项目,并从列表中删除过去7,14,21或30天,以某种方式使用LINQ指定...
我怎么能这样做?
编辑:我尝试的方法如下:
var selectedDates = Enumerable
.Range(0, int.MaxValue)
.Select(index => new DateTime?(StartDate.AddDays(index)))
.TakeWhile(date => date <= EndDate)
.ToList();
但这会让我回到空列表......
编辑:伙计们,我怎么能做到以下几点:
var date_range = Int32.Parse(Session["drange"].ToString());
ViewBag.LineGraph = _groupedItems
.GroupBy(l => l._Date.Date)
.Select(cl => new GroupedItem
{
_Date = cl.Key,
Sales = cl.Sum(c=>c.Sales)
})
.OrderBy(x => x._Date)
.Where(t => t._Date <= DateTime.Now &&
t._Date >= DateTime.Now.Subtract(TimeSpan.FromDays(date_range)))
.ToList();
有没有办法升级它,只删除不在参数给定的时间范围内的日期(今天的日期 - DateTime.Now和 - 过去的7天......
例如,如果我有12月14日的日期,那个将被删除,但是18日的那个不是因为它'属于那7天范围......?
答案 0 :(得分:1)
var filtered = _groupedItems
.Where(t=>t._Date<=DateTime.Now &&
t._Date>=DateTime.Now.Substract(TimeSpan.FromDays(7)));
您只需将查询中的7替换为其他值: 14/21/30
它从旧版本中创建新的过滤集合,我认为它是您想要的,而不是从现有列表中删除项目。
答案 1 :(得分:1)
如果您只想比较天数差异,可以执行此操作
list.RemoveAll(x=>( DateTime.Now.Subtract(x.dt1).Days == 7));
这是一个示例
Class1 cls1 = new Class1();
cls1.dt1 = DateTime.Parse("22/11/2016");
Class1 cls2 = new Class1();
cls2.dt1 = DateTime.Parse("15/12/2016");
Class1 cls3 = new Class1();
cls3.dt1 = DateTime.Parse("08/11/2016");
Class1 cls4 = new Class1();
cls4.dt1 = DateTime.Parse("22/11/2016");
Class1 cls5 = new Class1();
cls5.dt1 = DateTime.Parse("22/12/2016");
List<Class1> list = new List<Class1>() { cls1, cls2, cls3, cls4, cls5 };
list.RemoveAll(x=>( DateTime.Now.Subtract(x.dt1).Days == 7));
public class Class1
{
public DateTime dt1 { get; set; }
}
答案 2 :(得分:-1)
您可以使用RemoveAll()
并使用DateTime.UtcNow.AddDays(-7)
即可在7天前获得日期。
_groupedItems.RemoveAll(d => d._Date >= DateTime.UtcNow.AddDays(-7));