我正在玩LINQ及相关科目,并对以下内容感到疑惑。
我有两种获得Fibonacci序列的方法。 我开始时:
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 +我可能想为它添加一些参数化。 我并不是在寻找优化或东西,比如使用&lt;长&gt;因为数字变得很快,它只是一个简单的例子。只是一些参数赞成和con每个方法。为什么以及何时应该使用哪种方法?
答案 0 :(得分:4)
两者之间的一个重要区别在于,对于您的第二个版本,您必须提前知道何时要停止,但在第一个版本中,您可以开始迭代,然后决定何时停止。你不必提前知道。
您也不必使用第一个版本一次将整个列表存储在内存中。您可以以流方式处理数据。
第二个优点是返回列表允许您索引数组,而不是从头开始逐个处理元素。如果你知道你想要多少元素,你可以使用第二个版本,并且你知道列表足够小以适应内存。
请注意,这些差异与您使用属性还是函数调用无关。您可以将第一个重写为不带参数的函数调用。
如果您只有第一个版本,则可以使用Fibinocci().Take(20).ToList()
轻松模拟第二个版本。
答案 1 :(得分:0)
为什么要使用属性(静态或其他)。产生的斐波纳契数是......的属性?此外,根据经验,属性永远不应执行任何“重要”计算/处理,因此您肯定希望在此处使用函数。
答案 2 :(得分:0)
如果您将第一个版本放在foreach
中,那么它将永远不会终止,除非您特别突破。使用它时潜在的错误来源。也许那就是你想要的,但这是值得警惕的。