2010-01-14 22 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