LINQ для группировки объектов по метке времени - PullRequest
0 голосов
/ 25 марта 2010

У меня есть серийный номер объекта, определенный как:

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 поверх этого? надеюсь, я ясно дал понять.

Ответы [ 3 ]

2 голосов
/ 25 марта 2010

Вот пример использования выражения запроса.

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 голосов
/ 25 марта 2010

Hour является свойством DateTime, поэтому оно должно быть простым:

fooList.GroupBy(f => f.Hour)

Это даст вам объект IGrouping<int, Foo>, в котором ключом int будет час.

1 голос
/ 25 марта 2010

Если вы не хотите сгруппировать 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))

Если вы действительно хотите отобразить один и тот же час / день / месяц в одну группу, тогда это проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...