2015-07-21 102 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 

这需要在Windows API StrCmpLogicalW()方法,其确实的自然排序顺序比较的优点,并且使用P /调用来调用它。

+0

对不起,Watson,但我不想这样做,因为它已经是一个大的应用程序,添加一个简单的任务的Dll将不够好,他们应该是一些更简单的方法。 – csharpcoder

+2

@MakIndia您并未添加DLL;该DLL已经是Windows API的一部分,并且已经安装在所有版本的Windows上。我严重怀疑你会找到比这更简单的方法(这实际上只使用一行代码来声明P/Invoke和一行来调用它...) –

+0

只是澄清我的疑惑:它会永远存在我的意思在Windows 7,8的所有版本中,它的访问权限如何,如果系统访问权限有限,仍然可以正常工作。 – csharpcoder