我使用一个临时类来处理解析和比较以获得所需的输出。我已经包含了使所有内容恢复到您所请求的方式的代码,但是引入的“临时”类可能比路径更有价值(?)。
Usage:
var sorted = files.Select(f => new UpdateTo(f))
.OrderBy(u => u)
.Select(u => u.Path)
.ToArray();
代码:
class UpdateTo : IComparable<UpdateTo>
{
public decimal Version { get; private set; }
public int Order { get; private set; }
public string Path { get; private set; }
private const string Prefix = "UpdateTo";
public UpdateTo(string path)
{
/* No error-checking here -- BEWARE!! */
Path = path;
string toParse = Path.Substring(Path.IndexOf(Prefix, StringComparison.InvariantCultureIgnoreCase) + Prefix.Length);
var split = toParse.Split('-');
Version = decimal.Parse(split[0]);
Order = split.Length == 2 ? int.Parse(split[1]) : int.MaxValue;
}
public int CompareTo(UpdateTo other)
{
int versionCompare = Version.CompareTo(other.Version);
return versionCompare == 0 ? Order.CompareTo(other.Order) : versionCompare;
}
}
还有测试...
[Test]
public void ListSort()
{
const string first = @"C:\Migrations\UpdateTo1.1";
const string second = @"C:\Migrations\UpdateTo1.2-1";
const string third = @"C:\Migrations\UpdateTo1.2-2";
const string fourth = @"C:\Migrations\UpdateTo1.2";
const string fifth = @"C:\Migrations\UpdateTo1.4";
const string sixth = @"C:\Migrations\UpdateTo1.5-1";
const string seventh = @"C:\Migrations\UpdateTo1.5-2";
const string eighth = @"C:\Migrations\UpdateTo1.5";
var files = new List<string>{third, seventh, fourth, fifth, first, eighth, second, sixth};
var sorted = files.Select(f => new UpdateTo(f))
.OrderBy(u => u)
.Select(u => u.Path)
.ToArray();
Assert.AreEqual(first, sorted[0]);
Assert.AreEqual(second, sorted[1]);
Assert.AreEqual(third, sorted[2]);
Assert.AreEqual(fourth, sorted[3]);
Assert.AreEqual(fifth, sorted[4]);
Assert.AreEqual(sixth, sorted[5]);
Assert.AreEqual(seventh, sorted[6]);
Assert.AreEqual(eighth, sorted[7]);
}