代码之家  ›  专栏  ›  技术社区  ›  Ahmed

我可以用LINQ重写下面的代码吗?

  •  0
  • Ahmed  · 技术社区  · 16 年前

    fullorderbook.asks

    orderbook.asks 是包含当前状态的当前订单列表。

    所以算法只是在 fullorderbook.asks文件 并将价格与订单中相应的订单价格进行比较 订单.asks

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

    该算法的目的是寻找完全删除的顺序和下移的顺序 (订单位置大于订单簿大小 OBK_SIZE ).

    所以我知道 IEnumerable.Except 扩展方法不会给出解决方案,因为它将返回差异,而不知道造成这种差异的原因(下移或删除)。 因为如果订单调低了,我就得把它放在 按正确的顺序。

    3 回复  |  直到 16 年前
        1
  •  2
  •   Davy Landman    16 年前

    我会说使用 Except Operator .

    var deleted = fullorderbook.asks.Except(orderbook.asks);
    

    如果你不想使用对象。等于你可以提供一个 IEqualityComparer<T> . 例如,如果你仍然只想比较价格。

        2
  •  0
  •   nailitdown    16 年前

    抱歉,我没有时间给一个适当考虑的答复。。。这可能会让你开始:

    //checks for deliverableNo's existence in sheetDataSource
    if(!(sheetDataSource.Any(item => item.DeliverableNo == varItem.DeliverableNo)))
    {
    sheetDataSource.Add(varItem);
    }
    
        3
  •  0
  •   Ahmed    16 年前

    我想这就是解决办法

            double highestprice = orderbook.asks[asklength].price;
            List<PriceLevel> difflist = new List<PriceLevel>(fullorderbook.asks.Except(orderbook.asks));
            fullorderbook.asks.Clear();
            fullorderbook.asks.AddRange(orderbook.asks);
            //fill the shifted orders
            fullorderbook.asks.AddRange(
                (difflist.FindAll((x) =>
            {
                //shifted order
                return x.price > highestprice;
            }
                )));
    
            //fill the deleted orders
            changes.AddRange(
                (difflist.FindAll((x) =>
            {
                //deleted order
                return x.price < highestprice;
            }).ConvertAll((y)=>
    
            {
                return new CapturedLevel(0, y.price, -1*y.volume);
            }
            )));