如果它们与另一个字符串匹配,则重新排序字符串数组中的元素?

问题描述:

我想重新排列数组中的字符串,根据它们是否匹配字符串值。如果它们与另一个字符串匹配,则重新排序字符串数组中的元素?

我的程序正在获取目录中的文件列表,然后重命名并移动这些文件。但是我需要某些具有特定名称的文件在其他文件后重命名。 (这些文件正在使用时间戳进行重命名并按该顺序处理)。

示例文件名:

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

您可以使用自定义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

谢谢,我认为这正是我所需要的。 –

如果你的项目您的项目与两个不同的排序字段创建新的序列,然后你可以使用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) 

其实我最终做的只是一个简单的泡泡排序,因为我处理的文件数量非常小。我从将数组中的文件存储到列表中进行了更改。

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);