代码之家  ›  专栏  ›  技术社区  ›  Oxymoron

具有可枚举或列表的属性

  •  3
  • Oxymoron  · 技术社区  · 15 年前

    我在玩Linq和相关主题,想知道以下内容。

    我有两种方法可以得到斐波那契序列。 我从以下开始:

    public static IEnumerable<int> Fibonacci
        {
            get
            {
                int i = 0;
                int j = 1;
                int temp = 0;
    
                while (true)
                {
                    yield return i;
    
                    temp = i;
                    i = j;
                    j = temp + i;
                }
            }
        }  
    

    但这让我想,为什么我要选择这个而不是:

    public static IList<int> Fibonacci(long to)
        {            
            IList<int> fibList = new List<int>();
            int i = 0;
            int j = 1;
            int temp, index = 0;
    
            while (index < to)
            {
                fibList.Add(i);
    
                temp = i;
                i = j;
                j = temp + i;
    
                index++;
            }
            return fibList;
        }
    

    ilist也是一个可枚举的+我可能想给它添加一些参数化。 我并不是真的在寻找优化,或者类似于使用的东西,因为这个数字会很快变大,这只是一个很快的例子。只是一些支持和反对每种方法的论点。为什么以及何时应该使用哪种方法?

    3 回复  |  直到 15 年前
        1
  •  4
  •   Mark Byers    15 年前

    两者之间的一个重要区别是,对于第二个版本,您必须提前知道何时要停止,但是在第一个版本中,您可以开始迭代,然后决定何时停止。你不必事先知道。

    您也不必将整个列表与第一个版本同时存储在内存中。您可以以流式方式处理数据。

    第二种方法的一个优点是,返回一个列表允许您索引到数组中,而不是从一开始就逐个处理元素。如果您知道需要多少元素,并且知道列表足够小,可以使用第二个版本。

    请注意,这些差异与使用属性或函数调用无关。您可以将第一个重写为不带参数的函数调用。

    如果只有第一个版本可用,则可以使用 Fibinocci().Take(20).ToList() .

        2
  •  0
  •   Noldorin    15 年前

    为什么要使用属性(静态或其他)。斐波那契数的生成是什么性质的…?此外,根据经验,属性不应执行任何“重要”计算/处理,因此您肯定希望在此处使用函数。

        3
  •  0
  •   Michael Bray    15 年前

    如果你把第一个版本放在 foreach 那么,除非你特意爆发,否则它永远不会终止。使用错误时的潜在来源。也许这就是你想要的,但这是值得警惕的。