2016-05-12 13 views
1

Ich habe eine Liste von Objekten, die von einer Web-API-Anfrage zurückgegeben werden. Jedes Objekt hat ein Feld namens "PlaceNo", das einen Wert von 0 bis n haben kann, oder -1, wenn kein Wert zugewiesen wurde.Linq-Anweisung: Auftrag von

Ich muss die Liste basierend auf PlaceNo bestellen, wo es 0 bis n sein muss, gefolgt von allen -1.

allreports.OrderBy(x => Convert.ToInt32(x.PlaceNo)).ToList(); 

Der aktuelle Code gibt alle -1 zuerst, dann von 0 bis n gefolgt.

Hinweis: Ich mache die Typkonvertierung auf PlaceNo, weil die Zahl als String statt als ganze Zahl übergeben wird.

+0

der sauberste Weg wäre, sie in zwei Listen zu trennen, die positiven zu ordnen und sie zu beschriften – pomber

+0

@ Dr.Stitch. Durch das Entfernen der Konvertierung funktioniert die Sortierung überhaupt nicht. Ich habe es gerade getestet. –

+0

Entschuldigung, ich habe meinen Kommentar gelöscht, da ich Ihre Frage falsch gelesen habe. Ich stimme Pomber zu. –

Antwort

8

Der richtige Weg zur Lösung dieses Problems ist eine Order-by-then-by-Abfrage. Obwohl der Vorschlag der anderen Antworten - um negative Zahlen in das Maximum int zu konvertieren - wahrscheinlich funktionieren wird, ist es am besten, den Code so zu schreiben, dass er die Operationen darstellt, die Sie im Code erfassen möchten. In diesem Fall haben Sie zwei Sortierkriterien, so sollten Sie zwei Sortierkriterien in der Abfrage haben!

Was Sie tun möchten, ist zunächst eine Reihenfolge-by auf "ist die ganze Zahl -1?" Das heißt, auf einer Boolean Menge bestellen. Die Standardreihenfolge lautet, dass "false" vor "true" steht. Wenn Sie also möchten, dass die -1s zuletzt sortiert werden, prüfen Sie, ob die Ganzzahl gleich -1 ist.

Das sollte Ihre Order-by-Klausel sein. Die Then-by-Klausel ist dann Ihre normale Reihenfolge - durch den Integer-Wert.

var query = from report in allreports 
      let place = Convert.ToInt32(report.PlaceNo) 
       orderby place == -1, place 
      select report; 
var list = query.ToList(); 

Sinn machen?

+0

Aww .. Hier war ich im Begriff, Ihre Antwort abzuhängen. Hier ist ein Codebeispiel: https://dotnetfiddle.net/eoxZxA Ziemlich ähnlich, aber ein bisschen anders. – Cameron

+0

@Eric Leistungs weise, wie denkst du, ist dies schneller oder langsamer als der Vergleich mit Int32.MaxValue wie in meiner Antwort unter –

+4

@SirajMansour: Sie haben den Code in beide Richtungen geschrieben. Wenn du wissen willst, was schneller ist, ** führe sie ** und dann wirst du es wissen! –

0

Versuchen Sie Folgendes:

allreports.OrderBy(x => Convert.ToInt32(x.PlaceNo) < 0 ? Int32.MaxValue : Convert.ToInt32(x.PlaceNo)); 
+1

Ich bin mir nicht sicher, wie die Leistung betroffen wäre, aber Sie konvertieren die ganze Zahl zweimal. – Cameron

2
allreports.OrderBy(x => { 
    var placeNo = Convert.ToInt32(x.PlaceNo); 
    return placeNo == -1 ? Int32.MaxValue : placeNo; 
}).ToList(); 

Dieser Code ungetestet ich das aus nur schrieb die Spitze von meinem Kopf so frei fühlen, keine Kompilierung Fehler zu korrigieren.