Search code examples
c#listlinqlinq-group

how to regard groupby in C# linq as a two dimensional list?


List<History> data = new List<History>(){   
        new History() {Symbol="a", Close = 1.0m, Date = new DateTime(2016, 2, 1) },
        new History() {Symbol="a", Close = 1.2m, Date = new DateTime(2016, 2, 2) },
        new History() {Symbol="a", Close = 1.3m, Date = new DateTime(2016, 2, 3) },
        new History() {Symbol="b", Close = 1.2m, Date = new DateTime(2016, 2, 1) },
        new History() {Symbol="b", Close = 1.2m, Date = new DateTime(2016, 2, 2) },
        new History() {Symbol="b", Close = 1.3m, Date = new DateTime(2016, 2, 3) },
};

var StockGroupList = data
               .GroupBy(o => o.Symbol)
               .OrderBy(o => o.Key)
               .ToList();

What's the simplest way to call for the value of "Close" of "a" at "2016, 2, 2", is it possible to use something like StockGroupList[0][1].close?

Furthermore, how to order the second dimension? E.g, for each "Symbol", ordered by the sequence of date?


Solution

  • Let write code backward. To make StockGroupList[0][1] work, StockGroupList should be type of List<List<History>>.

    var StockGroupList = data
        ... // Should be type IEnumerable<List<History>>
        .ToList();
    

    =>

    var StockGroupList = data 
        .Select( o => o.ToList()) // Should be ordered by Date
        .ToList();
    

    =>

    var StockGroupList = data 
        ... // Should be IEnumerable<IEnumerable<History>>
        .Select( o => o.Orderby(c => c.Date).ToList())
        .ToList();
    

    Because IGrouping<out TKey, out TElement> : IEnumerable<TElement>, final code is

    var StockGroupList = data
        .GroupBy(o => o.Symbol)
        .OrderBy(o => o.Key)
        .Select(o => o.OrderBy(x => x.Date).ToList())
        .ToList();
    

    You can replace ToList with ToArray to get the same effect.