2015-07-21 2 views
0

У меня есть список, который возвращается из службы WCF, для списка файлов на сервере. Который я позже использую, чтобы заполнить TreeView в моем приложении-клиентеСортировочный список <FileInfo> в натуральном отсортированном виде.

Мне нужен список, который должен быть упорядочен в естественном порядке.

Для бывших: У меня есть список что-то вроде List-1, и мой ожидаемый результат List-2 , но я получаю List-3 как мой вывод (список приводится ниже см)

List-1   List-2   List-3 
abc.jpg   abc.jpg   abc.jpg 
abc10.jpg  abc10.jpg  abc10.jpg 
abc100.jpg  abc97.jpg  abc100.jpg 
abc98.jpg  abc98.jpg  abc101.jpg 
abc97.jpg  abc100.jpg  abc102.jpg 
abc102.jpg  abc101.jpg  abc97.jpg 
abc101.jpg  abc102.jpg  abc98.jpg 

До сих пор. Я просмотрел сообщение stackoverflow:

[1]: C# Sort files by natural number ordering in the name? [2]: Sorting a FileInfo[] based using Natural Sorting on the filename (SQL files).

Ни один из них не нашел, чтобы работать в моем случае, любая помощь будет оценена :)

+0

В именах файлов всегда содержатся нечисловые символы, а затем необязательные номера? –

+0

Как насчет [Природный порядок сортировки в C#] (http://stackoverflow.com/questions/248603/natural-sort-order-in-c-sharp) или [Натуральная сортировка в C#] (http: //www.interact -sw.co.uk/iangblog/2007/12/13/natural-sorting)? – crashmstr

+0

Нет, это может быть что угодно .. Как мы даем имена файлов в любой файловой системе – csharpcoder

ответ

3

Здесь вы идете; удобное расширение списка для естественной сортировки:

using System; 
using System.Collections.Generic; 
using System.Runtime.InteropServices; 

namespace Demo 
{ 
    // A List extension class for natural sorting. 

    public static class ListExt 
    { 
     [DllImport("shlwapi.dll", CharSet = CharSet.Unicode)] 
     private static extern int StrCmpLogicalW(string lhs, string rhs); 

     // Version for lists of any type. 
     public static void SortNatural<T>(this List<T> self, Func<T, string> stringSelector) 
     { 
      self.Sort((lhs, rhs) => StrCmpLogicalW(stringSelector(lhs), stringSelector(rhs))); 
     } 

     // Simpler version for List<string> 
     public static void SortNatural(this List<string> self) 
     { 
      self.Sort(StrCmpLogicalW); 
     } 
    } 

    // Demonstrate using the List extension. 

    public class Program 
    { 
     private static void Main(string[] args) 
     { 
      var names = new List<FileInfo> 
      { 
       new FileInfo("abc.jpg"), 
       new FileInfo("abc10.jpg"), 
       new FileInfo("abc100.jpg"), 
       new FileInfo("abc98.jpg"), 
       new FileInfo("abc97.jpg"), 
       new FileInfo("abc102.jpg"), 
       new FileInfo("abc101.jpg") 
      }; 

      names.SortNatural(x => x.Name); 

      foreach (var name in names) 
       Console.WriteLine(name); 
     } 
    } 
} 

Выход из этой программы:

abc.jpg 
abc10.jpg 
abc97.jpg 
abc98.jpg 
abc100.jpg 
abc101.jpg 
abc102.jpg 

Это имеет преимущество в API StrCmpLogicalW() метода Windows, который делает сравнение естественного порядка сортировки и использует P/Вызовите его.

+0

Извините Watson, но я не хочу этого делать, поскольку это уже большое приложение, добавление Dll для простой задачи не будет достаточно хорошим, их также должны быть более легкими способами. – csharpcoder

+2

@MakIndia Вы не добавляете DLL; что DLL уже входит в состав Windows API и уже будет установлена ​​во всех версиях Windows. Я серьезно сомневаюсь, что вы найдете более простой способ, чем это (что эффективно использует только одну строку кода, чтобы объявить P/Invoke и одну строку, чтобы называть это ...) –

+0

Просто уточняю мои сомнения: будет ли это всегда там, я имею в виду во всех версиях окон 7,8, а также о его разрешениях доступа. Что, если система имеет ограниченный доступ, все равно будет работать нормально. – csharpcoder

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