帮助LINQ表达式

如何编写一个LINQ表达式(首选方法调用语法),它给出一个位于特定范围内的斐波那契数字列表,比如1到1000?

好; 获得更多“FP”答案:

using System; using System.Collections.Generic; using System.Linq; static class Program { static void Main() { Func> fib = null; fib = (n, m, cap) => n + m > cap ? Enumerable.Empty() : Enumerable.Repeat(n + m, 1).Concat(fib(m, n + m, cap)); var list = fib(0, 1, 1000).ToList(); } } 

请注意, 理论上这可以写成单个lambda,但这很难 。

从这里使用迭代器块回答:

  foreach (long i in Fibonacci() .SkipWhile(i => i < 1) .TakeWhile(i => i <= 1000)) { Console.WriteLine(i); } 

或列表:

 var list = Fibonacci().SkipWhile(i => i < 1).TakeWhile(i => i <= 1000) .ToList(); 

输出:

 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 

这是枚举器基础解决方案。 这是一个懒惰的评价。 因此,当MoveNext()完成时,会生成下一个数字。

  foreach (int k in Fibonacci.Create(10)) Console.WriteLine(k); class Fibonacci : IEnumerable { private FibonacciEnumertor fibEnum; public Fibonacci(int max) { fibEnum = new FibonacciEnumertor(max); } public IEnumerator GetEnumerator() { return fibEnum; } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return GetEnumerator(); } public static IEnumerable Create(int max) { return new Fibonacci(max); } private class FibonacciEnumertor : IEnumerator { private int a, b, c, max; public FibonacciEnumertor(int max) { this.max = max; Reset(); } // 1 1 2 3 5 8 public int Current { get { return c; } } public void Dispose() { } object System.Collections.IEnumerator.Current { get { return this.Current; } } public bool MoveNext() { c = a + b; if (c == 0) c = 1; a = b; b = c; ; return max-- > 0; } public void Reset() { a = 0; b = 0; } } } 

性能不高:

 val fibonacci = Enumerable .Range(0, 1000) .Aggregate(new List{1,0}, (b,j)=>{ b.Insert(0,b[0]+b[1]); return b; }); 

很晚,但是带有“yield”关键字的快速版本:-)

 IEnumerable Fibonacci(int limit) { int number = 1, old = 0; while (number < limit) { yield return number; int tmp = number; number += old; old = tmp; } } var list = Fibonacci(1000).ToList(); 

使用linq打印斐波纳契的最简单方法

  List lst = new List { 0, 1 }; for (int i = 0; i <= 10; i++) { int num = lst.Skip(i).Sum(); lst.Add(num); foreach (int number in lst) Console.Write(number + " "); Console.WriteLine(); }