字符串将文件名与数字进行比较

时间:2016-03-09 14:22:14

标签: c# arrays string

我有两个或更多我想要比较的文件。我正在寻找具有最高价值的文件。什么是使用这种命名方案获得最新文件的简短方法:

update_12345.log
update_23456.log
update_34567.log <- get this one

我显然可以将其分解并比较数字但是我必须跟踪我所指的文件。尽可能避免创建不必要的操作。

4 个答案:

答案 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.l​​og
  update_23456.log
  update_12345.log

     

update_34567.l​​og

     

update_34567.l​​og