Как расценивать groupby в C# linq как двумерный список?

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();

Какой самый простой способ вызвать значение "Close" для "a" в "2016, 2, 2", возможно ли использовать что-то вроде StockGroupList[0][1].close?

Кроме того, как заказать второе измерение? Например, для каждого "символа", упорядоченного по последовательности дат?

2 ответа

Решение

Позвольте написать код в обратном направлении. Чтобы StockGroupList[0][1] работал, StockGroupList должен иметь тип 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();

Так как IGrouping<out TKey, out TElement> : IEnumerable<TElement>, окончательный код

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

Вы можете заменить ToList с ToArray чтобы получить тот же эффект.

Попробуй сделать .ToList() дважды: для предметов в каждой группе и для всех групп в целом

  var StockGroupList = data
    .GroupBy(o => o.Symbol)
    .OrderBy(chunk => chunk.Key)
    .Select(chunk => chunk
       .OrderBy(item => item.Date) // ordered by the sequence of date
       .ToList()) // items in a group should be represented as List
    .ToList(); // groups should be represented as List
Другие вопросы по тегам