我正在尝试重新排序数组中的字符串,具体取决于它们是否匹配字符串值。
我的程序正在获取目录中的文件列表,然后重命名和移动文件。但是我需要在其他文件之后重命名具有特定名称的某些文件。 (文件正在使用时间戳重命名,并按此顺序处理。)
示例文件名:
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 :(得分: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);