This should give the raw groups:
return fileRawList.Where(file => file.Time >= beginDate)
.Where(file => file.Time < endofLoopDate)
.OrderBy(file => file.Time)
.GroupBy(file => file.Time.Ticks / timeSpan.Ticks,
(k, g) => new OHLC()
{
Open = g.Select(p => p.Bid).DefaultIfEmpty().First(),
High = g.Select(p => p.Bid).DefaultIfEmpty().Max(),
Low = g.Select(p => p.Bid).DefaultIfEmpty().Min(),
Close = g.Select(p => p.Bid).DefaultIfEmpty().Last(),
Time = g.Select(p => p.Time).DefaultIfEmpty().First()
})
.ToList();
While this should give a regular stream of OHLC:
var rawGroups = fileRawList.Where(file => file.Time >= beginDate)
.Where(file => file.Time < endofLoopDate)
.OrderBy(file => file.Time)
.ToLookup(file => (file.Time.Ticks - beginDate.Ticks) / timeSpan.Ticks,
file => new {Bid = file.Bid, Time = file.Time})
.ToDictionary( g => g.Key, g => new OHLC()
{
Open = g.Select(p => p.Bid).DefaultIfEmpty(0).First(),
High = g.Select(p => p.Bid).DefaultIfEmpty(0).Max(),
Low = g.Select(p => p.Bid).DefaultIfEmpty(0).Min(),
Close = g.Select(p => p.Bid).DefaultIfEmpty(0).Last(),
Time = g.Select(p => p.Time).First()
});
return Enumerable.Range(0,(Int32)((endofLoopDate.Ticks - beginDate.Ticks)/timeSpan.Ticks))
.Select(i => rawGroups.Keys.Contains(i) ?
rawGroups[i] :
new OHLC()
{
Open = 0,
High = 0,
Low = 0,
Close = 0,
Time = new DateTime(beginDate.Ticks + k*timeSpan.Ticks)
}).ToList();
Alternative:
var result = Enumerable.Range(0,(Int32)((endofLoopDate.Ticks - beginDate.Ticks)/timeSpan.Ticks))
.GroupJoin(fileRawList.Where(file => file.Time >= beginDate)
.Where(file => file.Time < endofLoopDate)
.OrderBy(file => file.Time),
i => i,
file => (file.Time.Ticks - beginDate.Ticks) / timeSpan.Ticks,
(k,g) => new OHLC()
{
Open = g.Select(p => p.Bid).DefaultIfEmpty(0).First(),
High = g.Select(p => p.Bid).DefaultIfEmpty(0).Max(),
Low = g.Select(p => p.Bid).DefaultIfEmpty(0).Min(),
Close = g.Select(p => p.Bid).DefaultIfEmpty(0).Last(),
Time = g.Any() ?
g.Select(p => p.Time).First() :
new DateTime(beginDate.Ticks + i*timeSpan.Ticks)
})