2017-01-03 1 views
-7

Ich habe ein Array von Zeichenfolge von .SQL-Dateien, die ich in aufsteigender Reihenfolge sortieren muss. Eigentlich möchte ich es basierend auf numerischer Teil sortieren, wenn kein numerischer Teil dann Datei oben kommen sollte. Wie kann ich das tun?Wie sortiere ich ein Array von alphanumerischen Dateinamen in aufsteigender Reihenfolge?

3.5.1_Patch 

3.5_CoreScript 

3.6_Patch 

3.6.1_Patch 
+0

ja, ich habe Sie aber auf dieser alphanumerischen Teil nicht sicher .. –

+4

Sie sollten zeigen, was Sie versucht haben oder Ihre Frage wird erhalten wegen mangelnder Anstrengung abgelehnt und wahrscheinlich geschlossen. Außerdem sollten Sie genau angeben, wie Ihre Sortierung funktionieren soll. Ich nehme an, dass Sie nach der Version wie Zahlen vor dem Unterstrich und dann nach dem Text sortieren wollen, aber was ist, wenn es eine Datei ohne die Versionsnummern gibt, würde das zuerst oder zuletzt kommen? – juharr

Antwort

-1

Sie sollten Ihre Frage so spezifisch wie möglich stellen. Sie können tun, was Sie Array.Sort und eine Lambda-Funktion wollen mit:

string [] files = new string[] {"3.6.1_Patch","3.5_CoreScript","3.5.1_Patch","3.6_Patch"}; 
Array.Sort(files, (x,y) => { 
    string [] x1 = x.Split('_'); 
    string [] y1 = y.Split('_'); 
    return String.Compare(x1[0], y1[0]); 
}); 

Ich habe es dir den Rand Fall zu behandeln, in denen es keine Versionsnummer ist.

EDIT

Ihre Dateinamen sind komplexer als ursprünglich vorgestellt. Ich nehme an alles bis zur ersten nicht numerischen Zeichenfolge ist die Version?

An dieser Stelle würde ich eine Klasse machen, um die Dateinamen zu analysieren und die Versionsnummern zu speichern. Es implementiert auch die IComparable Schnittstelle zum Sortieren.

public class Version : IComparable<Version> { 
    // Just guessing here - without knowing the actual format 
    public int Major = 0; 
    public int Minor = 0; 
    public int Build = 0; 
    public string FileName; 

    public Version(string fileName) { 
     ParseFileName(fileName); 
    } 

    // Split the string on '_' or '.', 
    // Considers the first 3 numbers to be version 
    // (stops parsing at non-numeric value) 
    public void ParseFileName(string fileName) 
    { 
     FileName = fileName; 
     string [] data = Regex.Split(fileName, @"[_\.]"); 
     int x; 
     if (Int32.TryParse(data[0], out x)) { 
      Major = x; 
      if (2 <= data.Length && Int32.TryParse(data[1], out x)) { 
       Minor = x; 
       if (3 <= data.Length && Int32.TryParse(data[2], out x)) { 
        Build = x; 
       } 
      } 
     } 
    } 

    public override string ToString() { 
     return FileName; 
    } 

    // Comparison 
    public int CompareTo(Version v) { 
     int c = Major.CompareTo(v.Major); 
     if (0 == c) { 
      c = Minor.CompareTo(v.Minor); 
     } 
     if (0 == c) { 
      c = Build.CompareTo(v.Build); 
     } 
     return c; 
    } 
} 

Testprogramm:

string [] files = new string[] {"10.6.1_Patch","3.5_CoreScript","3.5.1_Patch","3.6_Patch","10.6_Patch", "test", "01_1_ALTER_TC_EDB_V3", "01_2_ALTER_TC_EDB_V3"}; 
Version [] versions = new Version[files.Length]; 
for (int i = 0; i < files.Length; i++) { 
    versions[i] = new Version(files[i]); 
} 
Array.Sort(versions); 
foreach (var v in versions) { 
    Console.WriteLine(v.ToString()); 
} 

Ausgang:

test 
01_1_ALTER_TC_EDB_V3 
01_2_ALTER_TC_EDB_V3 
3.5_CoreScript 
3.5.1_Patch 
3.6_Patch 
10.6_Patch 
10.6.1_Patch 
+0

Dies wird sagen, dass 2 größer als 10 ist. – Servy

+0

@Servy True. Wird behoben ..... –

+0

@JohnnyMopp Wenn es mehr als ein _ beteiligt ist wie würde ich sortieren? wie 01_1_ALTER_TC_EDB_V3, 01_2_ALTER_TC_EDB_V3 –

-1

Versuchen Sie folgendes:

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

namespace ConsoleApplication34 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      List<string> input = new List<string>() { "3.5.1_Patch", "3.5_CoreScript", "3.6_Patch", "3.6.1_Patch" }; 


      input.Sort((x,y) => new CustomSort() { s = x}.CompareTo(y)); 
     } 
    } 

    public class CustomSort : IComparable 
    { 
     public string s { get; set; } 
     public int CompareTo(object input) 
     { 
      string[] thissplitArray = (s).Split(new char[] { '_' }).ToArray(); 
      string[] splitArray = ((string)input).Split(new char[] { '_' }).ToArray(); 

      if (thissplitArray[0] == splitArray[0]) 
      { 
       return thissplitArray[1].CompareTo(splitArray[1]); 
      } 
      else 
      { 
       return thissplitArray[0].CompareTo(splitArray[0]); 
      } 

     } 
    } 


} 
Verwandte Themen