【问题标题】:Checking for exitence or counting files with a pattern and without a pattern检查是否存在或计算具有模式和不具有模式的文件
【发布时间】:2015-09-28 16:40:37
【问题描述】:

在更高版本的 .NET 中,有一种简洁的方法可以检查名称遵循某种模式的文件的数量或存在。

private int HowManyDonkeys(string path)
{
  return Directory.EnumerateFiles(path, "*donkey*");
}

private bool AreThereAnyDonkeys(string path)
{
  return Directory.EnumerateFiles(path, "*donkey*").Any();
}

但是,我想知道如何扭转它并列出不是驴的文件。一种方法是列出所有并减去不需要的数量,但它不是那么整洁。另一种方法是使用 LINQ 并像这样进行。

Directory.EnumerateFiles(path, "*")
  .Count(name => name.Contains("anti-donkey"));

Directory.EnumerateFiles(path, "*")
  .Any(name => name.Contains("anti-donkey"));

有没有更好的方法(即让我指定模式的过滤条件作为输入的对立面

【问题讨论】:

  • @Sybren 我可以使用 Any()Count,如示例所示,这消除了执行 Where() 的意义 首先。但这不是问题 - 我想知道是否可以在枚举方法中指定反模式。
  • @Kondrad Viltersten 使用 ! 运算符
  • EnumerateFiles 只允许简单的 DOS 搜索(* 和?),没有正则表达式。
  • @Sybren 你能举例说明如何使用否定运算符吗?另外,请注意我对 LINQ 部分的评论。
  • 为什么要在没有LINQ 的情况下这样做?

标签: c# linq file


【解决方案1】:

EnumerateFiles 只允许简单的 DOS 搜索(* 和?),没有正则表达式。

正如其他人所说,您可以使用 LINQ,但这不是您的问题。

【讨论】:

    【解决方案2】:

    获取文件:

    var files = Directory.EnumerateFiles("C:\\").Where(x => !x.Contains("donkey")).ToList();
    

    获取计数

    int count= Directory.EnumerateFiles("C:\\").Count(x => !x.Contains("donkey"));
    

    【讨论】:

    • 不要苛刻,但这是不对的。首先,不必要地添加 Where() 会使事情复杂化。其次,我已经在我的问题中给出了一个更好的 LINQ 示例。最后,它不回答我的 问题——它是关于不使用 使用LINQ 指定反模式。如果可能的话。此外, ToList() 在那里显然是不必要的。并且类型是 IEnumerable,因为方法的名称正在枚举 files,所以它会从视图中丢失。老实说,名字选择不当。
    • 你可以使用 Expression.Not(callExpression)。
    • 你可能想举个例子。我不熟悉类Expression。那是第三者工具吗?我的VS没认出来……还是你还在指LINQ和方法Not
    • 它在 System.LINQ.Expressions 下,您可以在其中定义匹配的表达式,然后使用 Not() 进行反匹配。我猜不是那么受欢迎并且对此没有足够的知识,但如果你可以看看 - stackoverflow.com/questions/1276485/…msdn.microsoft.com/en-us/library/bb299047(v=vs.110).aspx
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-08
    • 2013-06-18
    • 1970-01-01
    • 2017-06-24
    • 2014-06-16
    相关资源
    最近更新 更多