使用LinQ每季度过滤数据

时间:2014-07-14 06:26:24

标签: c# linq list

我有物品清单。

class Item{
        public int Id { get; set; }
        public DateTime CreatedDate { get; set; } 
        public string Name { get; set; }
    }

获取季度清单以及2012年第一季度,2013年第二季度的年份

我需要根据季度列表过滤列表。 我只需要具有指定季度列表的项目名称列表。

2 个答案:

答案 0 :(得分:2)

像Nikhil问的那样,我不确定你在寻找什么结果,但这里有一些建议。这些列表中的任何一个都能满足您的需求吗? itemsByQuarter将每个项目分组到基于季度的列表中。 secondQuarterItemNames只是Q2中项目名称的列表。希望这有助于您思考正确的道路。

class Item
{
    public int Id { get; set; }
    public DateTime CreatedDate { get; set; }
    public string Name { get; set; }
}

class Program
{
    static int QuarterFromMonth(int month)
    {
        return (month-1) / 3 + 1;
    }

    static void Main(string[] args)
    {
        Item[] items = 
        { 
            new Item {Id = 1, CreatedDate = new DateTime(2014, 4, 1), Name = "AprilItem"},
            new Item {Id = 1, CreatedDate = new DateTime(2014, 7, 1), Name = "JulyItem"},
            new Item {Id = 1, CreatedDate = new DateTime(2014, 10, 1), Name = "OctoberItem"},
        };

        var itemsByQuarter = items.GroupBy(i => QuarterFromMonth(i.CreatedDate.Month));
        var secondQuarterItemNames = items.Where(i => QuarterFromMonth(i.CreatedDate.Month) == 2).Select(i => i.Name);
    }
}

答案 1 :(得分:1)

您可以将该季度建模为结构:

public struct Quarter
{
    public Quarter(int year, int quarterIndex)
    {
        Year = year;
        QuarterIndex = quarterIndex;
    }

    public static Quarter FromDate(DateTime date)
    {
        return new Quarter(date.Year, 1 + (date.Month - 1)/3);
    }

    public int Year;
    public int QuarterIndex;
}

然后,只需设置目标宿舍列表并使用LINQ进行过滤(代码假定您现有的项目集合称为items):

var targetQuarters = new[]
{
    new Quarter(2012, 1),
    new Quarter(2013, 1)
};

var itemsInTargetQuarters = 
    items.Where(i => targetQuarters.Contains(Quarter.FromDate(i.CreatedDate)))
    .ToList();
相关问题