繁体   English   中英

如何使用Lambda运算符修改此linq查询?

[英]How do I modify this linq query using the lambda operator?

我有以下linq查询:

 var files = (from d in new DirectoryInfo(@"c:\program files").GetDirectories()
                         where d.GetFiles().Count() > 10
                         where d.GetFiles().Count() < 100
                         select d
             );

但是,如您在上面看到的,我两次调用d.GetFiles()。Count(),这是=>运算符概念派上用场的地方。

使用jdehaan的语法,为什么我不能像这样直接做:

var files = (from d in new DirectoryInfo(@"c:\program files").GetDirectories()
                         where(x => x.GetFiles().Count() > 10) &&
                         (x.GetFiles().Count() < 100))
                         select d
             );

我知道上面的内容很愚蠢,因为我可以使用d.GetFiles()。Count()进行原始查询,但是我对使用Where和关键字where之间的区别感到好奇。

使用let在查询中分配,像这样

var files = (from d in new DirectoryInfo(@"c:\program files").GetDirectories()
   let f = d.GetFiles().Count()
   where f > 10
   where f < 100
   select d
);

正如Reed Copsey指出的那样,您可以使用&&合并两个where子句。

另外,由于GetFiles返回一个数组,因此可以使用Length属性代替Count方法。

  var files = (from d in new DirectoryInfo(@"c:\program files").GetDirectories()
     let f = d.GetFiles().Length
     where f > 10 && f < 100
     select d
  );

Lambda表达式在这里无济于事,但let关键字可能...

var files = from d in new DirectoryInfo(@"c:\program files").GetDirectories()
                  let c = d.GetFiles().Count()
                  where c > 10 && c < 100
                  select d;

使用lambda表达式时,它将如下所示:

var files = new DirectoryInfo(@"c:\program files").GetDirectories().
    Where(x => (x.GetFiles().Count() > 10) && (x.GetFiles().Count() < 100));

您还两次调用GetFiles() Lambda表达式无助于解决它。

编辑:除了难看之外,它确实效率低下,更喜欢其他答案中给出的let解决方案,该答案旨在显示使用lambda表达式编写的内容。

看看“保罗·威廉姆斯”的答案,他展示了如何以更好和更好的方式使用lambda表达式达到同一目标,这在语义上等同于let解决方案。

涉及“ let”关键字的答案可能是您要使用的答案。

我提供了这个替代答案,以向您展示如何使用“ =>”完成同一件事。

首先,请确保您正在using System.Linq;

var files = new DirectoryInfo(@"c:\program files").GetDirectories().Where(d =>
  {
    int c = d.GetFiles().Count();
    return c > 10 && c < 100;
  });

如您所见,在这种情况下,lambda表达式不是“更好”的解决方案,只是有所不同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM