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

时间:2017-05-25 16:04:29

标签: c# .net arrays sorting

我正在尝试重新排序数组中的字符串,具体取决于它们是否匹配字符串值。

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

示例文件名:

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
}

3 个答案:

答案 0 :(得分: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

使用LINQ IComparer<string>对列表进行排序时,也可以使用OrderBy

答案 1 :(得分: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)

答案 2 :(得分: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);