我创建了这个方法:
private void DeletionCheck()
{
DirectoryInfo listDirs = new DirectoryInfo(MainDirectory);
var dirs = listDirs.EnumerateDirectories().OrderBy(d => d.Name);
for (var directoryIndex = 1; directoryIndex <= dirs.Count(); directoryIndex++)
{
if (directoryIndex != dirs[directoryIndex - 1].Name)
{
Directory.Move(listDirs[directoryIndex - 1], directoryIndex);
}
}
}
第一个错误就在这一行:
dirs[directoryIndex - 1]
错误:
错误60无法将[]索引应用于“System.Linq.IOrderedEnumerable”类型的表达式
第二个错误出现在这一行:
listDirs[directoryIndex - 1]
错误:
错误61无法将带有[]的索引应用于“System.IO.DirectoryInfo”类型的表达式
我想在这个方法中做的是检查MainDirectory
中的sun目录是否被删除,然后按名称对所有其他目录进行排序,并重命名它们以按名称重新排序。
因为所有子目录名都以数字结尾,例如:
Event 000001
Event 000002
因此,要解析每个子目录的编号,并使用目录名称的数字部分进行排序和排序。
答案 0 :(得分:4)
使用列表或数组而不是没有索引器的(未执行的)LINQ查询:
var dirs = listDirs.EnumerateDirectories().OrderBy(d => d.Name).ToList();
请注意,大多数LINQ方法都是懒惰执行的(也称为延迟执行)。这意味着每次使用foreach
或隐式执行ToList
或Count
(!)的方法时,都会再次评估查询。
更新:我想您还想将目录名与之前的目录名进行比较。所以改变这个
if (directoryIndex != dirs[directoryIndex - 1].Name)
到
if (dirs[directoryIndex].Name != dirs[directoryIndex - 1].Name)
您不能也不想将int
与目录名进行比较。
同样适用于需要目标目录而不是索引的Directory.Move
。所以改变
Directory.Move(listDirs[directoryIndex - 1], directoryIndex);
to(也使用Directory.Info.FullName
)
Directory.Move(listDirs[directoryIndex - 1].FullName, listDirs[directoryIndex].FullName);