[英]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.