2017-02-22 6 views
1

Ich versuche, eine Liste von Zeichenfolgen in einer Reihenfolge zu sortieren, die zu einer Sequenz in allgemeinen Revisionsverlauf Sequenzen relevant ist. Manche Kunden beginnen mit "-" oder "Neu" oder einigen anderen spezifischen Codes, und ich kann LINQ verwenden, um eine benutzerdefinierte Sortierreihenfolge zu definieren. Nachdem jedoch eine Zeichnung von Rev A bis Rev Z überarbeitet wurde, wird sie Rev AA bis Rev AZ, Rev BA bis BZ und so weiter. Wie kann ich die folgende Liste mit LINQ sortieren?Sortierung Liste der Zeichenfolgen mit Linq mit benutzerdefinierten Sortierung

Ich habe dies als Beispiel Codeblock:

List<string> revList = new List<string> { "A", "NC", "New", "AB", "PD", "PD1", 
              "PD2", "B", "-", "*", "BB", "NA" }; 
revList = revList.OrderByDescending(i => i.ToLower() == "pd"). 
        ThenByDescending(i => i.ToLower() == "nc"). 
        ThenByDescending(i => i.ToLower() == "na"). 
        ThenByDescending(i => i.ToLower() == "new"). 
        ThenByDescending(i => i.ToLower() == "pd1"). 
        ThenByDescending(i => i.ToLower() == "pd2"). 
        ThenByDescending(i => i.ToLower() == "-"). 
        ThenByDescending(i => i.ToLower() == "*"). 
        ThenBy(i => i).ToList(); 

foreach (string rev in revList) 
    Console.WriteLine(rev); 

Dies erzeugt eine Ausgabe wie:

PD 
NC 
NA 
NEW 
PD1 
PD2 
- 
* 
A 
AB 
B 
B 

würde ich produzieren mag:

PD 
NC 
NA 
NEW 
PD1 
PD2 
- 
* 
A 
B 
AB 
BB 
+2

Zuerst nach 'Länge' sortieren, z. Setze 'ThenBy (i => i.Length) .' vor' ThenBy (i => i) ' –

+1

Ivan, du gewinnst. Ich wünschte, ich könnte für Ihre Antwort stimmen, seit es das erste Mal war, aber es war ein Kommentar. Danke. – AuLion

+0

Warum kam 'PD' vor 'NC' ist das gewünschte Ergebnis? –

Antwort

2

Dieser Code arbeitete mich.

var revList = new List<string> { "A", "NC", "New", "AB", "PD", "PD1", 
             "PD2", "B", "-", "*", "BB", "NA" }; 

     revList = revList.OrderByDescending(i => i.ToLower() == "pd"). 
          ThenByDescending(i => i.ToLower() == "nc"). 
          ThenByDescending(i => i.ToLower() == "na"). 
          ThenByDescending(i => i.ToLower() == "new"). 
          ThenByDescending(i => i.ToLower() == "pd1"). 
          ThenByDescending(i => i.ToLower() == "pd2"). 
          ThenByDescending(i => i.ToLower() == "-"). 
          ThenByDescending(i => i.ToLower() == "*"). 
          ThenBy(i => i.Length).ToList(); 

     foreach (string rev in revList) 
      Console.WriteLine(rev); 
     Console.ReadLine(); 
+0

Danke, Sameer! Ich kann nicht glauben, dass ich nicht daran gedacht habe. – AuLion

0

Sie können ein benutzerdefiniertes Objekt wie folgt erstellen:

class Revision 
{ 
    public string Name { get; set; } 
    public int Rank { get; set; } 

    public Revision(string Name, int Rank) 
    { 
     this.Name = Name; 
     this.Rank = Rank; 
    } 
} 

Dann eine Liste dieser Objekte erstellen können.

Etwas wie:

List<Revision> revisions = new List<Revision>(); 
revision.Add(new Revision("PD",1)); 
revision.Add(new Revision("NC",2)); 

Nun, wenn Sie durch den Rang LINQ sortieren können unter Verwendung anstatt zu versuchen, die Namen zu analysieren.

Es kann ein Problem sein, das Objekt zunächst einzurichten, da Sie möglicherweise zu ZZ gehen müssen, aber dies gibt Ihnen die vollständige Kontrolle über die Bestellung.

p.s. - Ich habe diesen Code nicht getestet.

Verwandte Themen