LINQ过滤两个指定日期之间列表中的项目

时间:2016-12-22 12:45:41

标签: c# asp.net linq datetime filter

我有类似以下类型的列表:

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天范围......?

3 个答案:

答案 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));