2016-06-02 8 views
-1

Ich habe eine Liste von Strings der Version (siehe Foto), und ich möchte sie in absteigender Reihenfolge sortieren.So sortieren Sie eine Liste <string>/Array der Zeichenfolge Versionsnummer?

enter image description here

Ich habe ein paar Lösungen mit Version Klasse gesehen, sie zu vergleichen, aber ich kann jede Lösung, die Art eine ganze Liste wie diese nicht denken. Was ist der einfachste Weg dies zu erreichen?

+1

Eine 'Liste ' wird am einfachsten sein. Strings mit Ziffern werden die Listennummern nicht sortieren. Alternativ finden/verwenden Sie eine Natural Sort – Plutonix

+0

Seitennotiz: Bitte fügen Sie nicht "Danke" und "suchte viel" Text zu Ihren Beiträgen. Um den Forschungsaufwand zu demonstrieren, stellen Sie Links zu Ansätzen zur Verfügung, die Sie versucht haben, mit einer kurzen Erklärung, warum es Ihr Problem nicht gelöst hat. –

Antwort

4

Was ist falsch an dieser einfachen Implementierung?

using System; 
using System.Collections.Generic; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var ver = new List<Version>(); 

      ver.Add(new Version("3.5")); 
      ver.Add(new Version("3.15")); 
      ver.Add(new Version("3.10")); 
      ver.Add(new Version("3.1")); 

      ver.Sort(); 
      ver.Reverse(); 
     } 
    } 
} 
+0

Ist mir nicht in den Sinn gekommen. Wenn ich über die Versionsklasse gelesen habe, dachte ich, ich muss nur zwischen 2 Objekten –

4

Standardlösung Sortierung OrderBy als shownd in How can I order a List<string>? sollte in diesem Fall arbeiten, ist man es fragen nach Version bestellen:

var listOfStrings = new List<string>{"1.2", "2.3", "0.1"}; 
listOfStrings = listOfStrings.OrderBy(x => new Version(x)).ToList(); 
+0

vergleichen. Ich habe nie daran gedacht, die Liste anstelle der Liste zu verwenden. Ich muss über den Tellerrand mehr nachdenken. Danke –

1

Sie verwenden können, sollten IComparable

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
       List<string> data = new List<string>{ 
       "3.5.0.1", "3.4.1.9", "3.4.1.56", "3.4.1.55", "3.4.1.46", 
       "3.4.1.45", "3.4.1.44", "3.4.1.30", "3.4.1.3", "3.4.1.22", 
       "3.4.1.2", "3.4.1.11", "3.4.1.0", "3.4.0.7", "3.4.0.3", 
       "3.4.0.1", "3.3.0.8", "3.3.0.4", "3.3.0.0", "3.2.0.9", 
       "3.2.0.6", "3.2.0.3", "3.2.0.27", "3.2.0.20", "3.2.0.15", 
       "3.2.0.1", "3.2.0.0", "3.1.0.7", "3.1.0.15", "3.1.0.14" 
       }; 
       List<SortPara> sortPara = data.Select(x => new SortPara(x)).ToList(); 
       data = sortPara.OrderBy(x => x).Select(x => x.strNumbers).ToList(); 
       data = sortPara.OrderByDescending(x => x).Select(x => x.strNumbers).ToList(); 
     } 

    } 
    public class SortPara : IComparable<SortPara> 
    { 
     public List<int> numbers { get; set; } 
     public string strNumbers { get; set; } 
     public SortPara(string strNumbers) 
     { 
      this.strNumbers = strNumbers; 
      numbers = strNumbers.Split(new char[] { '.' }).Select(x => int.Parse(x)).ToList(); 

     } 
     public int CompareTo(SortPara other) 
     { 
      int shortest = this.numbers.Count < other.numbers.Count ? this.numbers.Count : other.numbers.Count; 
      int results = 0; 
      for (int i = 0; i < shortest; i++) 
      { 
       if (this.numbers[i] != other.numbers[i]) 
       { 
        results = this.numbers[i].CompareTo(other.numbers[i]); 
        break; 
       } 
      } 
      return results; 
     } 
    } 
} 
+0

Ich denke, das ist Overkill für so etwas –

+0

Nur weil es eine Versionsmethode gibt. Es ist ein gutes Beispiel für das Erstellen einer benutzerdefinierten IComparable-Methode mithilfe der CompareTo() -Methode. – jdweng

1

Sie verwenden IComparable als jdweng, nur ein wenig bearbeiten, um Versionen wie "2.1.0.4" und "2.1" zu vergleichen:

public int CompareTo(SortPara other) 
    { 
     int shortest = this.numbers.Count < other.numbers.Count ? this.numbers.Count : other.numbers.Count; 
     int results = 0; 
     for (int i = 0; i < shortest; i++) 
     { 
      if (this.numbers[i] != other.numbers[i]) 
      { 
       results = this.numbers[i].CompareTo(other.numbers[i]); 
       break; 
      } 
     } 
     if (results != 0) 
      return results; 
     if (this.numbers.Count > other.numbers.Count) 
      return 1; 
     else if (this.numbers.Count < other.numbers.Count) 
      return -1; 
     else 
      return 0; 
    } 
Verwandte Themen