2017-01-03 162 views
-7

我有一个.sql文件目录的字符串数组,我需要按升序排序。其实我想根据数字部分对它进行排序,如果没有数字部分,那么文件应该排在最前面。 我该怎么做?如何按升序对字母数字文件名称数组进行排序?

3.5.1_Patch 

3.5_CoreScript 

3.6_Patch 

3.6.1_Patch 
+0

是的,我没有你,但不知道这个字母部分.. –

+4

你应该显示你的尝试或你的问题会得到由于缺乏努力而可能关闭。你也应该详细说明你想要如何分类的工作。我假设你想要在下划线之前对文本进行排序,然后再对文本进行排序,但是如果文件没有版本号,那么会先出现还是最后出现? – juharr

回答

-1

你应该让你的问题尽可能具体。你可以做你想要使用的是什么Array.Sort和lambda函数:

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]); 
}); 

我离开它你处理不存在版本号的边缘情况。

编辑

你的文件名是更复杂的比原先提出的。我会假设一切到第一个非数字字符串的版本?

在这一点上,我会做一个类来解析文件名和存储版本号。它还实现IComparable接口进行排序。

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; 
    } 
} 

测试程序:

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()); 
} 

输出:

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

这会说2大于10. – Servy

+0

@Servy True。将修复..... –

+0

@JohnnyMopp如果有多个_涉及如何排序? 像01_1_ALTER_TC_EDB_V3,01_2_ALTER_TC_EDB_V3 –

-1

试试这个:

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]); 
      } 

     } 
    } 


} 
相关问题