2009-07-29 21 views
19

我有以下代碼如何排序的FileInfo的[]數組

DirectoryInfo taskDirectory = new DirectoryInfo(this.taskDirectoryPath); 
FileInfo[] taskFiles = taskDirectory.GetFiles("*" + blah + "*.xml"); 

我想排序的文件名列表。

這是如何完成的,儘可能快速和容易地使用.net v2。

+0

BTW的其他許多方面,採用自然數比較瀏覽器排序名字,所以如果你想實現類似的行爲,你必須編寫你自己的比較器,它將名字分割成字符串和數字塊,並分別進行比較。 – arbiter 2009-07-29 12:03:29

回答

38

呼叫的Array.Sort,傳遞一個比較委託:

Array.Sort(taskFiles, delegate(FileInfo f1, FileInfo f2) { 
    return f1.Name.CompareTo(f2.Name); 
}); 

在C#3這成爲稍微簡單:

Array.Sort(taskFiles, (f1, f2) => f1.Name.CompareTo(f2.Name)); 

或者你可以使用一個StringComparer如果你想使用不區分大小寫的排序順序:

Array.Sort(taskFiles, 
      (x, y) => StringComparer.OrdinalIgnoreCase.Compare(x.Name, y.Name)); 

(或使用string.Compare(x.Name, y.Name, true),或任何的比較字符串:)

0
Comparison<FileInfo> comparison = new Comparison<FileInfo>(delegate(FileInfo a, FileInfo b) 
{ 
    return String.Compare(a.Name, b.Name); 
}); 

Array.Sort(taskFiles, comparison); 

但無論如何,我認爲GetFiles的結果已按名稱排序...

+0

「但無論如何,我認爲GetFiles的結果已經按名稱排序......」 - 來自MSDN:不保證返回的文件名的順序 – 2009-07-29 09:36:02

+0

GetFiles按照名稱排序僅返回NTFS驅動器上的文件,因爲NTFS將名稱存儲爲二叉樹!這不適用於FAT或任何其他文件系統。因此,您必須始終使用排序來確保輸出已排序。 – arbiter 2009-07-29 12:00:40

+0

@Marc:好點! @arbiter:謝謝你的解釋 – 2009-07-29 12:55:32

9
Array.Sort(taskFiles, delegate (FileInfo x, FileInfo y) { 
    return string.Compare(x.Name,y.Name); 
}); 
0
public class FileComparer : IComparer 
     { 
      public enum CompareBy 
      { 
       Name /* a-z */, 
       LastWriteTime /* oldest to newest */, 
       CreationTime /* oldest to newest */, 
       LastAccessTime /* oldest to newest */, 
       FileSize /* smallest first */, 

      } 
      // default comparison 
      int _CompareBy = (int)CompareBy.Name; 
      public FileComparer() 
      { 
      } 

      public FileComparer(CompareBy compareBy) 
      { 
       _CompareBy = (int)compareBy; 
      } 
      int IComparer.Compare(object x, object y) 
      { 
       int output = 0; 
       DirectoryInfo file1 = new DirectoryInfo(x.ToString()); 
       DirectoryInfo file2 = new DirectoryInfo(y.ToString()); 
       switch(_CompareBy) 
       { 
        case (int)CompareBy.LastWriteTime: 
         output = DateTime.Compare(file1.LastWriteTime, file2.LastWriteTime); 
         break; 
        case (int)CompareBy.CreationTime: 
         output = DateTime.Compare(file1.CreationTime, file2.CreationTime); 
         break; 
        case (int)CompareBy.LastAccessTime: 
         output = DateTime.Compare(file1.LastAccessTime, file2.LastAccessTime); 
         break; 
    //    case (int)CompareBy.FileSize: 
    //     output = Convert.ToInt32(file1.Length - file2.Length); 
    //     break; 
        case (int)CompareBy.Name: 
        default: 
         output = (new CaseInsensitiveComparer()).Compare(file1.Name, file2.Name); 
         break; 
       } 
       return output; 
      } 
     } 

/////////////////////////////////// 
ArrayList list=new ArrayList();   
      string folder = @"D:\DVRData\ICICI\Transaction\21-Dec-08\08_51_23_2231"; 
      string[] files = Directory.GetFiles(folder);    
      IComparer comp = new FileComparer(FileComparer.CompareBy.CreationTime); 
      Array.Sort(files, comp); 
      foreach(string file in files) 
      { 
       list.Add(file); 
      }