2017-05-25 50 views
0

我想重新排列數組中的字符串,根據它們是否匹配字符串值。如果它們與另一個字符串匹配,則重新排序字符串數組中的元素?

我的程序正在獲取目錄中的文件列表,然後重命名並移動這些文件。但是我需要某些具有特定名稱的文件在其他文件後重命名。 (這些文件正在使用時間戳進行重命名並按該順序處理)。

示例文件名:

File-302.txt 
File-302-IAT.txt 
File-303.txt 
File-303-IAT.txt 
File-304.txt 
File-304-IAT.txt 
File-305.txt 
File-305-IAT.txt 

基本上什麼,我試圖完成,是我想所有含有「-IAT」將文件移動到如果數組結束,所以,當我遍歷,IAT文件將在非「IAT」夥伴文件後處理。

這裏是我的代碼,但那裏有沒有太多的它:

string[] outFiles = Directory.GetFiles(workingDir); 

for (int i = 0; i <= outFiles.Length - 1; i++ 
{ 
    //code to rename the file in the array 
} 
+0

你執行如何訂購例如一個字符串數組 在谷歌搜索'C#計算器如何訂購strings' – MethodMan

+2

的數組,你可以把這些文件中的其他人使用後鍵入這是一個簡單的谷歌搜索'outFiles.Where(f =>!f.Contains(「 - IAT」))。Concat(outFiles.Where(f => f.Contains(「 - IAT」))''但除此之外,你還沒有說過什麼爲了達到目的 - 你提到它們是按照時間戳的順序處理的? – stuartd

+0

@stuartd這應該是我的觀點的答案。我本來想補充一點,但是你毆打我 – Pikoh

回答

4

您可以使用自定義IComparer<string>實現您的排序規則:

class IatEqualityComparer : IComparer<string> 
{ 
    public int Compare(string a, string b) 
    { 
     if (a == b) 
      return 0; 
     var aWithoutExtension = Path.GetFileNameWithoutExtension(a); 
     var bWithoutExtension = Path.GetFileNameWithoutExtension(b); 
     var aIsIat = aWithoutExtension.EndsWith("IAT", StringComparison.InvariantCultureIgnoreCase); 
     var bIsIat = bWithoutExtension.EndsWith("IAT", StringComparison.InvariantCultureIgnoreCase); 
     if (aIsIat && !bIsIat) 
      return 1; 
     if (!aIsIat && bIsIat) 
      return -1; 
     return a.CompareTo(b); 
    } 
} 

(在Windows中,文件名不區分大小寫,因此當您在文件名中查找像IAT這樣的特定模式時,您必須非常小心。它幾乎總是按預期除了在生產,有一次該文件與iat而不是IAT結束...)

可以使用Array.Sort然後數組排序:

Array.Sort(outFiles, new IatEqualityComparer()); 

這將整理陣列就位。其結果是:

 
File-302.txt 
File-303.txt 
File-304.txt 
File-305.txt 
File-302-IAT.txt 
File-303-IAT.txt 
File-304-IAT.txt 
File-305-IAT.txt 

IComparer<string>整理到位,並與LINQ OrderBy列表時也可以使用。

+0

謝謝,我認爲這正是我所需要的。 –

1

如果你的項目您的項目與兩個不同的排序字段創建新的序列,然後你可以使用LINQ到投影相應的分類,然後提取從得到的序列中的文件名:

outFiles 
    .Select(fn => new{ 
     order = Path.GetFileNameWithoutExtension(fn).EndsWith("-IAT") ? 1 : 0, 
     fn 
    }) 
    .OrderBy(x => x.order) 
    .ThenBy(x => x.fn) 
    .Select(x => x.fn) 
0

其實我最終做的只是一個簡單的泡泡排序,因爲我處理的文件數量非常小。我從將數組中的文件存儲到列表中進行了更改。

List<string> outFiles = new List<string>(Directory.GetFiles(workingDir)); 
bool noSort; 

do 
{ 
    noSort = true; 
    for (int i = 0; i <= outFiles.Count - 2; i++) 
    { 
     if (outFiles[i].EndsWith("IAT.TXT")) 
     { 
      if (!outFiles[i + 1].EndsWith("IAT.TXT")) 
      { 
       string temp = outFiles[i + 1]; 
       outFiles[i + 1] = outFiles[i]; 
       outFiles[i] = temp; 
       noSort = false; 
      } 
     } 
    } 
} 
while (noSort == false); 
相關問題