the following code compares two lists which are sorted in descending order to find the removed entries.
fullorderbook.asks
is the previous list of orders which may contain the removed orders.
orderbook.asks
is the currect list of orders which contains the current state.
So the algorithm simply loops on the fullorderbook.asks
and compares the price with the corresponding order price in the orderbook.asks
to find if it already exist or deleted or simply shifted down.
My question is, How can I rewrite the code using LINQ?
for (int i = 1; i <= fulllength; i++)
{
withinrange = false;
//for each level in the ask book check if the price still
//exists or it is deleted or just shift down
while (askindex <= asklength)
{
//removed ask
if (orderbook.asks[askindex].price > fullorderbook.asks[i].price)
{
changes.Add(new CapturedLevel(i, fullorderbook.asks[i].price, -1 * fullorderbook.asks[i].volume));
withinrange = true;
break;
}
else if (orderbook.asks[askindex].price < fullorderbook.asks[i].price)
{
//update the ask pointer
askindex++;
}
else
{
withinrange = true;
askindex++;
break;
}
}
if (!withinrange)
{
//removed ask
if (askindex >= asklength && asklength < OBK_SIZE)
{
changes.Add(new CapturedLevel(i, fullorderbook.asks[i].price, -1 * fullorderbook.asks[i].volume));
}
else if (askindex >= asklength)
{
shiftedorders.Add(orderbook.asks[i]);
}
}
}
fullorderbook.asks.Clear();
fullorderbook.asks.AddRange(orderbook.asks.ToList<PriceLevel>());
fullorderbook.asks.AddRange(shiftedorders);
P.S:
The aim of the algorithm is to find the totally removed orders and the shifted down orders
(the order position is greater than the orderbook size OBK_SIZE
).
So I the usage of the IEnumerable.Except
extension method will not give the solution as it will return difference without knowing what is cause of this difference (shifting down or removal).
Because if the order is shifted down I have to keep it in the fullorderbook.asks
in the right order.