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?
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.