2010-01-14 2 views
1

HavingTakeWhile с использованием синтаксиса запросов

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

Wow - Я разместил это в своем блоге только восемь часов назад: http://madprops.org/blog/while-link-keyword/ –

ответ

5

Вы не хотите - в выражениях запроса C# ничего не найдено, что соответствует TakeWhile (или Take, Skip, SkipWhile и т. Д.). C выражения # запроса являются относительно ограничены, но охватывают китов:

  • Выберите (через select и let)
  • Где (через where)
  • SelectMany (через вторичные from положений)
  • OrderBy/ThenBy (и нисходящий) (по статьям orderby)
  • Присоединиться (через join) Оговорки
  • GroupBy (через groupby положения)
  • GroupJoin (через join ... into статей)

VB 9's query support немного более обширны, но лично мне нравится C# 's подход - он держит язык относительно простой, но вы все еще можете сделайте все, что хотите, с помощью точечной нотации.

+0

Также я не думаю, что вписывается в выражение запроса ... it легко смешивается с регулярным «императивом» при построении. – Skurmedel

+0

Мне лично не нравится подход C#, но я согласен с вами. Мне не нравится, когда язык выглядит как FoxPro. Я хочу, чтобы у C# не было такого синтаксиса вообще (я согласен, что он иногда выглядит лучше). –

+0

@Skurmedel: TakeWhile находится в поддержке запросов VB9; Я не думаю, что это действительно * плохо *, но не особенно необходимо. @Mehrdad: Мне нравится это для соединений и везде, где вводятся прозрачные идентификаторы. На самом деле, у меня есть новый раздел в C# в Depth 2nd edition, обсуждающий плюсы и минусы :) –

0

В LINQ нет встроенного синтаксиса. Кроме того, писать его в LINQ было бы более многословным и на самом деле не помогло бы ясности, поэтому в этом случае нет никакой реальной необходимости.

Кроме того, вы должны использовать Take, а не TakeWhile.

+3

-1 для подсказки с помощью Take. Точка использования TakeWhile должна продолжаться до тех пор, пока он не достигнет числа Фибоначчи, большего или равного 100. Он не может предсказать, сколько элементов будет (без предварительного знания последовательности Фибоначчи). TakeWhile именно то, что требуется. –

+0

Мой плохой - я неправильно читаю его, пытаясь взять первые 100 чисел Фибоначчи. –

+1

Удалено вниз, затем :) –