2009-10-02 41 views
1

我有以下LINQ查詢:如何使用lambda運算符修改此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()計數()的兩倍,這是其中=概念>運營商進來便利。

使用從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()計數。 (),但我很好奇使用Where而不是關鍵字Where的區別。

回答

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 
); 

裏德·科普塞指出,你可以使用&&合併兩個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 
); 
+0

+1不使用lambdas,但依然:優秀的答案! – 2009-10-02 20:51:07

+1

你也可以把兩個where語句結合起來,這可能更具可讀性。 – 2009-10-02 20:51:17

+0

不錯。這樣可行。好奇,這是唯一的方法嗎? – Xaisoft 2009-10-02 20:51:30

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; 
+0

再次感謝linq的幫助。當我說lambda表達時,我在想什麼,哈哈。 – Xaisoft 2009-10-02 20:52:56

+0

從技術上講,你可以使用lambda來做到這一點,但它需要一個嵌套選擇(這就是讓你做的),所以「讓」讓生活變得更容易。 – 2009-10-02 20:53:39

2

隨着lambda表達式就應該是這樣的:

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

也叫GetFiles()兩次。 lambda表達式無法解決它。

編輯:除了是醜陋的,真的是低效的,喜歡在其他的答案提出的let的解決方案,這個答案意味着顯示它是什麼樣子用lambda表達式編寫的。

看看「Paul Williams」的回答,他展示瞭如何用更好更好的方式與lambda表達式達成相同的目的,這在語義上等同於let解決方案。

+0

好吧,所以我想我不想離開,想用lambda表達式。我對lambda表達式的目的仍然有點困惑。我看到的唯一區別是在查詢中沒有指定「from d in」。 – Xaisoft 2009-10-02 20:55:18

+0

我們可以做得比這更好:它仍然調用.Count()兩次。 – 2009-10-02 20:57:43

+0

我不是想成爲一個解決方案,而是更多地展示如果做到這種(醜陋)方式會是什麼樣子。不要投我太多! :-) – jdehaan 2009-10-02 21:06:57

2

涉及「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表達式不是在這種情況下,「更好」的解決方案,只是不同。

+0

謝謝。看看我更新的帖子。 Where與使用where關鍵字的區別是什麼? – Xaisoft 2009-10-02 21:05:10

+0

好點,可以幫助我提醒匿名方法! +1 – jdehaan 2009-10-02 21:10:11

+0

我假設返回的行爲與常規方法中的返回行爲不同。我對麼?這不會從查詢中返回,它只會減少存儲在文件中的結果集。我的理解是否正確? – Xaisoft 2009-10-02 21:10:50