2010-01-14 23 views
1

TakeWhile使用的查詢語法

public static IEnumerable<long> FibonacciNumbers() { 
long current = 0; 
long next = 1; 

while (true) { 
    long previous = current; 
    current = next ; 
    next = previous + next; 
    yield return current; 
} 
} 

我能拿到第一斐波那契數小於100

var series = FibonacciNumbers().TakeWhile(num => num < 100); 

只是好奇,我會怎麼做,使用查詢語法?

+0

哇 - 我發佈這個到我的博客只有八小時前:http://madprops.org/blog/while-link-keyword/ – 2010-01-14 11:05:13

回答

5

你不會 - 在對應於TakeWhile(或Take,Skip,SkipWhile等)的C#查詢表達式中沒有任何內容。 C#查詢表達式是相對限定,但覆蓋BIGGIES:

  • 選擇(經由selectlet
  • 凡(經由where
  • 的SelectMany(通過次級from條款)
  • 的OrderBy/ThenBy(和降序)(通過orderby條款)
  • 加入(通過join條款)
  • 的GroupBy(通過groupby條款)
  • 羣組加入(通過join ... into條款)

VB 9's query support更廣泛一點,但我個人喜歡C#的方法 - 它使語言比較簡單,但你仍然可以通過點符號來做所有你想要的。

+0

另外我不認爲,而適合查詢表達式......它很容易與構造中的常規「命令式」混淆。 – Skurmedel 2010-01-14 11:11:49

+0

我個人不喜歡C#方法,但我同意你的看法。我不喜歡讓語言看起來像FoxPro。我希望C#根本沒有這種語法(我同意它有時看起來更好)。 – 2010-01-14 11:13:34

+0

@Skurmedel:TakeWhile在VB9的查詢支持;我不認爲這真的很糟糕,但並非特別必要。 @Mehrdad:我喜歡它的連接和透明標識符被引入的任何地方。實際上,我在C#深入討論了優點和缺點:)中有一個新的部分:) – 2010-01-14 11:30:04

0

LINQ中沒有內置的語法。另外,將它寫入LINQ將會更加冗長,並且不會真正幫助清晰,所以在這種情況下沒有真正的需要。

此外,您應該使用 Take而不是 TakeWhile這裏。

+3

-1表示使用Take。使用TakeWhile的要點是繼續前進,直到他達到大於或等於100的斐波那契數。他無法預測將會有多少元素(沒有事先了解斐波那契數列)。 TakeWhile正是需要的。 – 2010-01-14 11:05:53

+0

我的不好 - 我誤把它當作試圖取前100個斐波納契數字。 – 2010-01-14 11:09:30

+1

刪除downvote然後:) – 2010-01-14 11:29:05