我有一个.sql文件目录的字符串数组,我需要按升序排序。其实我想根据数字部分对它进行排序,如果没有数字部分,那么文件应该排在最前面。 我该怎么做?如何按升序对字母数字文件名称数组进行排序?
3.5.1_Patch
3.5_CoreScript
3.6_Patch
3.6.1_Patch
我有一个.sql文件目录的字符串数组,我需要按升序排序。其实我想根据数字部分对它进行排序,如果没有数字部分,那么文件应该排在最前面。 我该怎么做?如何按升序对字母数字文件名称数组进行排序?
3.5.1_Patch
3.5_CoreScript
3.6_Patch
3.6.1_Patch
你应该让你的问题尽可能具体。你可以做你想要使用的是什么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
这会说2大于10. – Servy
@Servy True。将修复..... –
@JohnnyMopp如果有多个_涉及如何排序? 像01_1_ALTER_TC_EDB_V3,01_2_ALTER_TC_EDB_V3 –
试试这个:
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]);
}
}
}
}
是的,我没有你,但不知道这个字母部分.. –
你应该显示你的尝试或你的问题会得到由于缺乏努力而可能关闭。你也应该详细说明你想要如何分类的工作。我假设你想要在下划线之前对文本进行排序,然后再对文本进行排序,但是如果文件没有版本号,那么会先出现还是最后出现? – juharr