【问题标题】:LINQ to group objects according to timestampLINQ 根据时间戳对对象进行分组
【发布时间】:2011-01-31 13:16:55
【问题描述】:

我有一系列对象定义为:

public class Foo
{
           public DateTime Time {get;set;}
}

现在我想根据时间对对象(IEnumerable<Foo>)进行分组,例如我想按小时、天或月对它们进行分组。

例如(按小时分组):

group 1(13:00-14:00) : foo1, foo2, foo3
group 2(14:00-15:00): foo4, foo5

如何在此之上编写 LINQ?希望我说清楚了。

【问题讨论】:

    标签: c# .net linq timestamp grouping


    【解决方案1】:

    这是一个使用查询表达式的示例。

    public class Foo
    {
        public int FooID { get; set; }
        public DateTime FooDate { get; set; }
    }
    

    ...

    List<Foo> foos = new List<Foo>()
    {
        new Foo() { FooID = 1, FooDate = new DateTime(2010,3,15,18,30,0)},
        new Foo() { FooID = 2, FooDate = new DateTime(2010,3,15,19,30,0)},
        new Foo() { FooID = 3, FooDate = new DateTime(2010,3,15,20,30,0)},
        new Foo() { FooID = 4, FooDate = new DateTime(2010,3,15,18,15,0)},
        new Foo() { FooID = 5, FooDate = new DateTime(2010,3,15,18,45,0)},
        new Foo() { FooID = 6, FooDate = new DateTime(2010,3,15,20,15,0)},
        new Foo() { FooID = 7, FooDate = new DateTime(2010,3,15,19,15,0)}
    };
    
    var query = from foo in foos
                group foo by foo.FooDate.Hour
                    into foogroup
                    select new
                    {
                        Hour = foogroup.Key,
                        Foos = foos.Where(foo => foo.FooDate.Hour == foogroup.Key)
                    };
    
    foreach (var group in query)
    {
        Console.WriteLine(group.Hour);
        foreach (Foo foo in group.Foos)
            Console.WriteLine("\t{0}\t{1}", foo.FooID, foo.FooDate);
    }
    

    编辑:关于需要单独的天、月等,你可以像下面这样扩展你的分组

    var query = from foo in foos
                group foo by new { Date = foo.FooDate.Date, Hour = foo.FooDate.Hour }
                    into foogroup
                    select new
                    {
                        Date = foogroup.Key.Date,
                        Hour = foogroup.Key.Hour,
                        Foos = foos.Where(foo => 
                            foo.FooDate.Date == foogroup.Key.Date 
                            && foo.FooDate.Hour == foogroup.Key.Hour)
                    };
    

    【讨论】:

      【解决方案2】:

      如果您不想想将昨天的 13-14 小时与今天的 13-14 小时、本月 5 日与上个月 5 日等分组,那么您需要做类似的事情:-

      // splitting time up into hour intervals
      fooList.GroupBy(f => f.Time.Date.AddHours(f.Time.Hour))
      
      // splitting time up into day intervals
      fooList.GroupBy(f => f.Time.Date)
      
      // splitting time up into month intervals
      fooList.GroupBy(f => f.Time.Date.AddDays(-f.Time.Day))
      

      如果您确实想将所有相同的小时/天/月映射到同一个组中,那就更容易了。

      【讨论】:

        【解决方案3】:

        Hour 是 DateTime 的一个属性,所以应该这么简单:

        fooList.GroupBy(f => f.Hour)
        

        这会给你一个 IGrouping&lt;int, Foo&gt; 对象,其中 int 键是小时。

        【讨论】:

          猜你喜欢
          • 2015-03-07
          • 1970-01-01
          • 2018-08-09
          • 2016-09-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多