2016-03-09 4 views
-1

У меня есть два или более файла, которые я хочу сравнить. Я ищу файл с наивысшим значением. Что короткий и сладкий способ получить наиболее текущий файл с этой схемой именования:String сравнить имена файлов с номерами

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

Я мог бы, очевидно, разбить его и сравнить цифры, но тогда я должен следить, какой файл я имею в виду. Попытка избежать создания ненужных операций, если это возможно.

+2

Нет способа сделать это * за исключением * сломанное имя, находящее наибольшее число. – Jamiec

+1

Возможно, покажите нам, что вы пробовали до сих пор ... –

+0

Я просто ищу лучшие предложения ... Разбить его тривиально, потому что это тривиально. – visc

ответ

2

Вы можете заказать список, и это даст вам заказ вы требующий

var myList = new List<string>() 
{ 
    "update_12345.log", "update_23456.log", "update_34567.log" 
}; 
var lastString = myList.OrderByDescending(x => x).First(); 
+0

linq для победы, спасибо – visc

2

Вы могли бы сделать

String folder = Directory.GetFiles(mypath).OrderBy(f => f).Last() 
+0

вздох ты прав .. служит мне для типирование – BugFinder

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]; 
0

Поскольку результаты могут быть разными в зависимости от культур, вам нужно отсортировать только цифры. И вы можете сделать это без "потери дорожки" из Wich файла, который

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. лог

update_34567.log

Смежные вопросы