使用Where查询进行多项可选检查(指定文件搜索选项)

时间:2015-01-22 17:56:39

标签: c# linq

我创建了复选框,用户可以将其设置为文件搜索:

  1. 排除系统文件:开/关
  2. 排除隐藏文件:开/关
  3. 排除read_only文件:开/关
  4. 现在我不知道如何在这段代码中使用这三种不同的布尔语句:

    DirectoryInfo DirInfo = new DirectoryInfo(sCopyFilesFromFilePath);                    
    GetDirsToCopy = 
       DirInfo.EnumerateDirectories(".", SearchOption.AllDirectories).Where( ? );
    

1 个答案:

答案 0 :(得分:2)

您可以使用含义。逻辑a -> b被翻译为!a || b,因此:

DirInfo.EnumerateDirectories(".", SearchOption.AllDirectories)
       .Where(x => !excludeSystem || (x.Attributes&FileAttributes.System) == 0);
       .Where(x => !excludeHidden || (x.Attributes&FileAttributes.Hidden) == 0);
       .Where(x => !excludeReadOnly || (x.Attributes&FileAttributes.ReadOnly) == 0);

我们假设excludeSystemexcludeHiddenexcludeReadOnly是您首先从复选框中提取的bool

你当然也可以用Where写一个。{/ p>

解释(一个.Where):

给出以下表达式

x => !excludeSystem || (x.Attributes&FileAttributes.System) == 0

您可以将其视为谓词。假设excludeSystemfalse,则!excludeSystemtrue,因此所有目录都会成功。如果不是,则执行第二个操作数(x.Attributes&FileAttributes.System) == 0

第一个操作数首先在&的{​​{1}}和Attributes上进行按位x。如果FileAttributes.System因此包含Attributes,则结果将不同于零。在那种情况下,第二次测试失败。换句话说,如果文件被排除且文件是系统文件,则返回FileAttributes.System

<强>优化

如果你认为你会迭代数千个目录,你可以通过加快测试速度来提高代码效率:

false

这将(几乎)始终保持高效,但它会使代码变得不那么漂亮。