我有两个或更多我想要比较的文件。我正在寻找具有最高价值的文件。什么是使用这种命名方案获得最新文件的简短方法:
update_12345.log
update_23456.log
update_34567.log <- get this one
我显然可以将其分解并比较数字但是我必须跟踪我所指的文件。尽可能避免创建不必要的操作。
答案 0 :(得分:2)
您可以订购一份清单,它会为您提供您需要的订单
var myList = new List<string>()
{
"update_12345.log", "update_23456.log", "update_34567.log"
};
var lastString = myList.OrderByDescending(x => x).First();
答案 1 :(得分:2)
你可以做到
String folder = Directory.GetFiles(mypath).OrderBy(f => f).Last()
答案 2 :(得分:2)
有一个技巧。想象一下,你有
update_12345.log
update_23456.log
update_34567.log // <- actual solution
update_5.log // <- note this number
由于5
小于34567
,因此update_34567.log
仍然是答案;但是,如果您按字典顺序对名称进行排序(默认情况下为.Net),您将update_5.log
作为答案。如果是你的情况,那么快速解决方案可以
using System.Runtime.InteropServices;
...
[DllImport("shlwapi.dll", CharSet = CharSet.Unicode, ExactSpelling = true)]
private static extern int StrCmpLogicalW(string x, string y);
...
String[] updates = new String[] {
"update_12345.log",
"update_23456.log",
"update_34567.log",
"update_5.log"
}
// smart sorting, "-" for backward sorting
Array.Sort(updates, (left, right) => -StrCmpLogicalW(left, right));
String result = updates[0];
答案 3 :(得分:0)
由于结果可能因文化而异,因此您只需使用数字进行排序。并且你可以在没有“丢失轨道”的情况下做到这一点
public static void Main()
{
string[] files =
new string[] { "update_12345.log", "update_23456.log", "update_34567.log" };
var sorted = files
.Select(f => {var a = f.Split("_.".ToCharArray());
return new { name = f, number = a[1]};} )
.OrderByDescending(fnn => Convert.ToInt64(fnn.number));
// Print all
sorted.ToList().ForEach(x => Console.WriteLine(x.name) );
// Print Top 1 [1]
Console.WriteLine(sorted.ToList().First().name);
// Print Top 1 [2]
Console.WriteLine(sorted.ToList().Take(1).Single().name);
}
输出:
update_34567.log
update_23456.log
update_12345.log
update_34567.log
update_34567.log