代码之家  ›  专栏  ›  技术社区  ›  missingfaktor Kevin Wright

Linq表达式帮助

  •  4
  • missingfaktor Kevin Wright  · 技术社区  · 15 年前

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

    6 回复  |  直到 15 年前
        1
  •  14
  •   Marc Gravell    15 年前

    好的;对于更多的“fp”答案:

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

    注意 理论上 这可以写成单个lambda,但是 very hard .

        2
  •  3
  •   Community CDub    7 年前

    使用来自的迭代器块答案 here :

        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
    
        3
  •  2
  •   particle    15 年前

    下面是枚举器基本解决方案。这是一个懒惰的评价。所以当moveNext()完成时,会生成下一个数字。

       foreach (int k in Fibonacci.Create(10))
           Console.WriteLine(k);
    
    
        class Fibonacci : IEnumerable<int>
        {
            private FibonacciEnumertor fibEnum;
            public Fibonacci(int max) {
                fibEnum = new FibonacciEnumertor(max);
            }
            public IEnumerator<int> GetEnumerator() {
                return fibEnum;
            }
    
    
            System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() {
                return GetEnumerator();
            }
            public static IEnumerable<int> Create(int max) {
                return new Fibonacci(max);
            }
    
            private class FibonacciEnumertor : IEnumerator<int>
            {
                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;
                }
            }
        }
    
        4
  •  2
  •   onof    14 年前

    不太好用:

    val fibonacci = Enumerable
                      .Range(0, 1000)
                      .Aggregate(new List<int>{1,0}, (b,j)=>{
                                    b.Insert(0,b[0]+b[1]);
                                    return b; });
    
        5
  •  1
  •   MaxKlaxxMiner    12 年前

    晚了,但一个快速版本有“yield”关键字:—)

    IEnumerable<int> 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();
    
        6
  •  0
  •   Sivakishore Teru    8 年前

    使用LINQ打印Fibonacci的最简单方法

            List<int> lst = new List<int> { 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();
            }