如果它们与另一个字符串匹配,则重新排序字符串数组中的元素?
我想重新排列数组中的字符串,根据它们是否匹配字符串值。如果它们与另一个字符串匹配,则重新排序字符串数组中的元素?
我的程序正在获取目录中的文件列表,然后重命名并移动这些文件。但是我需要某些具有特定名称的文件在其他文件后重命名。 (这些文件正在使用时间戳进行重命名并按该顺序处理)。
示例文件名:
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
}
您可以使用自定义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
列表时也可以使用。
谢谢,我认为这正是我所需要的。 –
如果你的项目您的项目与两个不同的排序字段创建新的序列,然后你可以使用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);
你执行如何订购例如一个字符串数组 在谷歌搜索'C#计算器如何订购strings' – MethodMan
的数组,你可以把这些文件中的其他人使用后键入这是一个简单的谷歌搜索'outFiles.Where(f =>!f.Contains(“ - IAT”))。Concat(outFiles.Where(f => f.Contains(“ - IAT”))''但除此之外,你还没有说过什么为了达到目的 - 你提到它们是按照时间戳的顺序处理的? – stuartd
@stuartd这应该是我的观点的答案。我本来想补充一点,但是你殴打我 – Pikoh