2009-03-16 19 views
0

Der folgende Code vergleicht zwei Listen, die in absteigender Reihenfolge sortiert sind, um die entfernten Einträge zu finden.Kann ich den folgenden Code mit LINQ neu schreiben?

fullorderbook.asks ist die vorherige Liste der Aufträge, die die entfernten Aufträge enthalten können.

orderbook.asks ist die aktuelle Liste der Aufträge, die den aktuellen Status enthält.

Also schleift der Algorithmus einfach auf fullorderbook.asks und vergleicht den Preis mit dem entsprechenden Bestellpreis in orderbook.asks, um herauszufinden, ob es bereits existiert oder gelöscht oder einfach nach unten verschoben wurde.

Meine Frage ist, wie kann ich den Code mit LINQ umschreiben?

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:

Ziel des Algorithmus ist es, die vollständig entfernt Aufträge und die nach unten verschoben Aufträge (die Auftragslage als die Größe des Auftragsbuchs größer ist OBK_SIZE) zu finden.

Also ich die Verwendung der IEnumerable.Except Erweiterung Methode wird nicht die Lösung geben, da es Unterschied zurückgibt, ohne zu wissen, was die Ursache für diesen Unterschied (Herunterschalten oder Entfernen) ist. Weil, wenn die Reihenfolge nach unten verschoben wird, muss ich es in der fullorderbook.asks in der richtigen Reihenfolge halten.

+0

vielleicht ist Ihnen ein veröffentlichen können Voll funktionsfähiges Beispiel ... –

Antwort

2

Ich würde sagen, verwenden Sie die ExceptOperator.

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

Wenn Sie nicht wollen, die die Object.Equals Methode zu verwenden, außer dass Sie eine IEqualityComparer<T> bieten könnte. Zum Beispiel, wenn Sie nur nach Preis vergleichen möchten.

+0

Ich glaube, Sie haben den Algorithmus nicht gelesen, er extrahiert nicht einfach den Unterschied und betrachtet ihn als gelöscht !! –

+1

Ich fand Ihren Algorithmus nicht so einfach zu lesen, und ich benutzte Ihre textliche Erklärung. Ich dachte, dass manchmal, wenn Sie ein Problem beheben wollen, Sie weiter programmieren, bis es funktioniert, und dass Ihr aktueller Algorithmus ein Ergebnis davon ist. Sie könnten versuchen, die Logik besser zu erklären, und die 2 Listen. –

0

Apologies Ich habe keine Zeit eine richtig als Antwort zu geben ... das könnte Ihnen den Einstieg:

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

Ich denke, das die Lösung

 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); 
     } 
     ))); 
Verwandte Themen