我取消了一些代码来比较两个目录,它们都工作得很好,但是为了我的目的,我想对它进行改进,这样我就可以根据稍微不同的需求回收代码了。原始代码列出了所有目录,但我想添加一个开关,这样我就可以决定是列出所有目录还是只列出顶级目录。下面是我的代码片段;
public void DoCompare(string pathA, string pathB, bool allDirs)
{
DirectoryInfo dir1 = new DirectoryInfo(pathA);
DirectoryInfo dir2 = new DirectoryInfo(pathB);
if (allDirs)
{
IEnumerable<FileInfo> list1 = dir1.GetFiles("*.*", SearchOption.AllDirectories);
IEnumerable<FileInfo> list2 = dir2.GetFiles("*.*", SearchOption.AllDirectories);
}
else
{
IEnumerable<FileInfo> list1 = dir1.GetFiles("*.*", SearchOption.TopDirectoryOnly);
IEnumerable<FileInfo> list2 = dir2.GetFiles("*.*", SearchOption.TopDirectoryOnly);
}
//A custom file comparer defined later
FileCompare myFileCompare = new FileCompare();
bool areIdentical = list1.SequenceEqual(list2, myFileCompare);现在,如果没有if (allDirs),这就很好了。当我放进去时,list1和list 2在最后一行代码中是不可见的。实际错误是“当前上下文中不存在名称list1”。我试图在if之外声明它们,但这依赖于它们返回的结果,如果没有这个决定,这是不可能的。那么,如何使这些在if语句之外可见呢?
发布于 2017-07-21 08:57:23
它是不可访问的,因为它是在外部范围内不可见的内部范围中声明的。但是您只想根据SeachOption更改bool,那么为什么不简单地:
SearchOption opt = allDirs ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly;
IEnumerable<FileInfo> list1 = dir1.GetFiles("*.*", opt);
IEnumerable<FileInfo> list2 = dir2.GetFiles("*.*", opt);
bool areIdentical = list1.SequenceEqual(list2, new FileCompare());如果你不能这样做,你必须在外面声明:
IEnumerable<FileInfo> list1;
IEnumerable<FileInfo> list2;
if(allDirs)
{
list1 = ...
list2 = ...
}
else
{
list1 = ...
list2 = ...
}
// now you can access them here because they are declared in the same scope发布于 2017-07-21 08:56:10
它们无法访问,因为它们是在if/else的作用域中定义的。有关作用域中变量的可访问性的更多信息
您可以将它们定义在外部,如Mark的答案中所示,但是将if of更改为只处理哪个SearchOption。这样您就没有代码重复:
var option = allDirs ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly;
IEnumerable<FileInfo> list1 = (new DirectoryInfo(pathA)).GetFiles("*.*", option);
IEnumerable<FileInfo> list2 = (new DirectoryInfo(pathB)).GetFiles("*.*", option);
bool areIdentical = list1.SequenceEqual(list2, new FileCompare());发布于 2017-07-21 08:55:42
这很简单,在if语句之外声明它们,然后在内部分配:
public void DoCompare(string pathA, string pathB, bool allDirs)
{
DirectoryInfo dir1 = new DirectoryInfo(pathA);
DirectoryInfo dir2 = new DirectoryInfo(pathB);
IEnumerable<FileInfo> list1; // declare list1 here
IEnumerable<FileInfo> list2; // declare list2 here
if (allDirs)
{
list1 = dir1.GetFiles("*.*", SearchOption.AllDirectories);
list2 = dir2.GetFiles("*.*", SearchOption.AllDirectories);
}
else
{
list1 = dir1.GetFiles("*.*", SearchOption.TopDirectoryOnly);
list2 = dir2.GetFiles("*.*", SearchOption.TopDirectoryOnly);
}
//A custom file comparer defined later
FileCompare myFileCompare = new FileCompare();
bool areIdentical = list1.SequenceEqual(list2, myFileCompare);
}它是不可访问的,因为它是在外部范围内不可见的内部范围中声明的。
还可以使用条件运算符?简化该方法。
IEnumerable<FileInfo> list1 = dir1.GetFiles("*.*", allDirs ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly);https://stackoverflow.com/questions/45233284
复制相似问题