2016-11-11 3 views
0

Ich habe eine Liste mit Daten mit String und Nummer. Ich muss es in auf- und absteigender Reihenfolge bestellen.C# orderby string zusammen mit int

 id data 
    ------------------ 
     1  [email protected]% 
     2  data10 
     3  data 
     4  @$data 
     5  data2 

Ich hole den Datensatz und speichern Sie es in der Liste "Liste". Dann bestelle ich es aufsteigend, aber "data10" kommt s/w "data1" und "data2". Im Folgenden meinen Code

var o/p = List.OrderBy(x => x.data); 

expected output - data1, data2 and data10 
+0

bestellen Sie es durch ID stattdessen – active92

+0

Ja, das ist Wörterbuch Bestellung. – Rahul

+0

Ich nehme an, Ihr Code enthält nicht wirklich 'var o/p = ...' – Abion47

Antwort

0

Um was Sie wollen, müssen Sie den numerischen Teil in Ihrem Auftrag durch Klausel Pad, so etwas wie:

var o/p = List.OrderBy(x => PadNumbers(x.Data)); 

wo PadNumbers als Stackoverflow Benutzer definiert werden könnte Nathan hat here geschrieben:

public static string PadNumbers(string input) 
{ 
    return Regex.Replace(input, "[0-9]+", match => match.Value.PadLeft(10, '0')); 
} 

Diese polstert Nullen für eine beliebige Anzahl (oder Zahlen), die in der Eingabezeichenfolge erscheinen, so dass SortiertNach sieht:

data0000000001 
data0000000010 
data0000000002 

Die Auffüllung erfolgt nur auf dem Schlüssel, der für den Vergleich verwendet wird. Die ursprünglichen Strings (ohne Padding) bleiben im Ergebnis erhalten.

Hinweis: Dieser Ansatz setzt eine maximale Anzahl von Ziffern für Zahlen im Eingang voraus.

+0

können Sie den obigen Code Fn – anand

+0

Padding Lösung Problem einfach verschieben und nicht entfernen. Das Konvertieren von Zahlteil in Integer funktioniert in jedem Fall. Keine Notwendigkeit für eine Notiz der maximalen Anzahl von Ziffern. – Fabio

+0

Bitte nehmen Sie nicht die Lösung eines anderen Benutzers und präsentieren Sie sie als Ihre eigene. – Rawling

1

Sie sortieren es derzeit anhand der Zeichenfolgenwerte, die nach Wörterbuchwerten sortiert werden. In einem Wörterbuch wird "10" zwischen "1" und "2" angezeigt, da dies eine alphabetische Reihenfolge ist - es erkennt nicht, dass es Zahlen sortiert.

Eine echte alphanumerische Sortierung kann ziemlich komplex werden, aber basierend auf Ihren Daten können Sie sie möglicherweise vereinfachen. Unter der Annahme, die Zeichenfolge „data1“, „Daten 2“ und „Daten10“ ist ein einheitliches Muster, können Sie etwas tun:

var op = List.OrderBy(x => int.Parse(x.data.substring(4))); 

Alternativ kann, wenn der Wert vor der Nummer ist keine konstante Länge, Sie kann Regex verwenden, um den Zahlenwert herauszuziehen:

var op = List.OrderBy(x => int.Parse(Regex.Match(x.data, "\\d+").Value)); 
+0

Wenn ich orderbydescending setze, funktioniert das obige richtig – anand

+0

Fehler zeigt in "Regex" – anand

+0

Haben Sie 'using System.Text.RegularExpressions;'? – Abion47