【问题标题】:How to exclude sub directories based on array values如何根据数组值排除子目录
【发布时间】:2019-02-18 08:19:19
【问题描述】:

我需要从目录中获取完整路径,但使用数组排除某些路径,而不将完整路径输入到数组中。

我得到这样的目录路径:

List<string> dirs = di.GetDirectories("vault*", SearchOption.AllDirectories)
.Select(x => x.FullName).ToList();

目录是这样的:我需要在C之后根据父级过滤。

C:\A\vault
C:\B\vault
C:\C\vault

我有一个这样的数组:

string[] exclude = new string[] {"A", "B"};

执行以下操作不起作用,因为它需要我输入要在数组中排除的路径的全名,这可能会令人讨厌:

dirs.Except(exclude);

我怎样才能更好地做到这一点,以便我可以轻松地更新数组而没有更长路径的所有无关字符?示例:在将来添加要排除的附加路径。

【问题讨论】:

  • 您要排除所有包含 A 或 B 的路径(在您的示例中),.contain 不起作用吗?
  • 我已更新问题以显示目录结构。
  • regex 可能是最通用的方法,但如果在您的情况下,排除目录始终位于根 (c:) 之后,那么您可以使用数组中的根 + 值构建一个字符串,然后再次使用包含。
  • 您也可以实现自己的like 运算符,其工作方式类似于SQL like 运算符...可以在这里看到类似的实现:stackoverflow.com/questions/5374481/like-operator-in-linq

标签: c#


【解决方案1】:

我认为这应该可以正常工作:

string[] exclude = new string[] { "A", "B" };

List<string> dirs =
    di
        .GetDirectories("vault*", SearchOption.AllDirectories)
        .Where(x => !exclude.Contains(x.Name))
        .Select(x => x.FullName)
        .ToList();

我已经测试过了。 请注意,使用的 Contains 是针对 exclude - 所以这是检查 Name 是否存在于数组中,它没有进行某种形式的子字符串搜索。


为了更健壮一点,可能值得使用这个:

.Where(x => !exclude.Select(y => y.ToUpperInvariant()).Contains(x.Name.ToUpperInvariant()))

【讨论】:

  • 对于这组数据,是的。如果排除的字符串之一是a 怎么办?这将排除所有目录。
  • @ZoharPeled - 为什么?
  • @ZoharPeled 您检查了DirectoryInfoName 属性。它只包含该文件夹的确切名称,而不是完整路径。
【解决方案2】:

您必须更改 SearchPattern 类似:

 List<string> dirs = di.GetDirectories("C\\Vault*", SearchOption.AllDirectories)
           .Select(x => x.FullName).ToList();

已排除所有A and B

【讨论】:

  • 那不也排除C吗?
  • 根据你的string[] exclude = new string[] {"A", "B"}; 没有C不排除
  • 不,你是对的,C 不会被排除在外(不过,这不是我的问题)。但是,如果有路径C:\D\Vault 怎么办?那会被排除在外,不是吗?
猜你喜欢
  • 1970-01-01
  • 2011-01-15
  • 2012-09-25
  • 2012-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-08
  • 2018-01-08
相关资源
最近更新 更多