tags:

views:

32

answers:

1

I have a list of strings on the format yyyy.mm.ddThh, I'd like to create a tree like structure of its components(Years, Months,Days,Hours)

e.g. I have a list like:

List<String> l = new List<String>()
l.add("2010.10.11T10");
l.add("2010.10.11T11");
l.add("2010.09.01T23");
l.add("2009.01.02T03");

From this I'd like something like:

new {
     { Year = 2009, 
       Months = { { Month = 01, Days = { {Day = 02, Hours = {{Hour = 03}}}}},
     { Year = 2010
       Months = { { Month = 10, Days = { {Day = 11, Hours = {{Hour = 10,Hour = 11}}}}},
                 { Month = 09, Days = { {Day = 01, Hours = {{ Hour = 23}}}}}
                }

     }

Surely that should be possible with linq ?

+2  A: 

Something like this?

var groupedDates = l.Select(date => DateTime.ParseExact(date, "yyyy.MM.dd'T'HH",
                                    CultureInfo.InvariantCulture))
                    .GroupBy(date => date.Year)
                    .Select(yg => new { Year = yg.Key, Months = yg
                        .GroupBy(ydate => ydate.Month)
                        .Select(mg => new { Month = mg.Key, Days = mg
                            .GroupBy(mdate => mdate.Day)
                            .Select(dg => new { Day = dg.Key, Hours = dg
                                .GroupBy(ddate => ddate.Hour)
                                .Select(hg => new { Hour = hg.Key, Values = hg })
                            })
                        })
                    });

In LINQ query syntax (courtesy mostly by .NET Reflector):

var groupedDates =
    from date in
        from date in l
        select DateTime.ParseExact(date, "yyyy.MM.dd'T'HH",
                                   CultureInfo.InvariantCulture)
    group date by date.Year into yg
    select new { Year = yg.Key, Months =
        from ydate in yg
        group ydate by ydate.Month into mg
        select new { Month = mg.Key, Days =
            from mdate in mg
            group mdate by mdate.Day into dg
            select new { Day = dg.Key, Hours =
                from ddate in dg
                group ddate by ddate.Hour into hg
                select new { Hour = hg.Key, Values = hg }
            }
        }
    };
Timwi
Thanks. (out of interes how would this look using query syntax ?
Anonym
@Anonym: Updated.
Timwi