【问题标题】:Property with Enumerable or list具有可枚举或列表的属性
【发布时间】:2011-01-08 13:57:39
【问题描述】:

我正在研究 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 也是一个 Enumerable + 我可能想为其添加一些参数化。 我并不是真的在寻找优化或东西或诸如使用 之类的东西,因为这个数字很快就会变大,它只是一个简单的例子。只是一些论据赞成和反对每种方法。为什么以及何时应该使用哪种方法?

【问题讨论】:

    标签: c# linq list enumerable


    【解决方案1】:

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

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

    第二种方法的一个优点是,返回一个列表允许您对数组进行索引,而不是从头开始一个一个地处理元素。如果您确实知道需要多少个元素,并且知道列表足够小以适合内存,则可以使用第二个版本。

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

    如果您只有第一个版本,您可以使用Fibinocci().Take(20).ToList() 轻松模拟第二个版本。

    【讨论】:

    • 另外:使用列表,在计算完所有数字之前,您无法对结果进行任何处理。使用 IEnumerable,您可以立即开始处理结果并随时计算下一个数字。你有点用“以流的方式”覆盖了这一点,但不是很清楚。
    • 将第一个重写为无参数函数。现在我可以做: var result = Fibonacci().TakeWhile(n => n
    • 我会颠倒过来,先跳过。无需对前 10 个术语进行 n
    【解决方案2】:

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

    【讨论】:

    • 是的,它是具有一些数学功能的实用程序类的一部分,但我有点卡住了。将其用作财产感觉不对。将其更改为无参数函数。
    【解决方案3】:

    如果您将第一个版本放在foreach 中,那么除非您特别突破,否则它将永远不会终止。使用它时的潜在错误来源。也许这就是你想要的,但需要警惕。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多