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

Xai*_*oft 1 .net c# linq

我有以下linq查询:

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

但是,正如你在上面看到的那样,我调用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
             );
Run Code Online (Sandbox Code Playgroud)

我知道上面是愚蠢的,因为我可以用d.GetFiles().Count()来做我的原始查询,但我很好奇使用Where而不是关键字where之间的区别.

Bri*_*sen 14

用于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
);
Run Code Online (Sandbox Code Playgroud)

正如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
  );
Run Code Online (Sandbox Code Playgroud)


Ree*_*sey 5

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;
Run Code Online (Sandbox Code Playgroud)