簡體   English   中英

具有Enumerable或list的屬性

[英]Property with Enumerable or list

我正在玩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 +我可能想要為它添加一些參數化。 我並不是在尋找優化或其他東西,比如使用<long>,因為數字變得很快,它只是一個簡單的例子。 只是一些參數贊成和con每個方法。 為什么以及何時應該使用哪種方法?

兩者之間的一個重要區別在於,對於第二個版本,您必須提前知道何時要停止,但在第一個版本中,您可以開始迭代,然后決定何時停止。 你不必提前知道。

您也不必使用第一個版本一次將整個列表存儲在內存中。 您可以以流方式處理數據。

第二個優點是返回列表允許您索引數組而不是從頭開始逐個處理元素。 如果你知道你想要多少元素,你可以使用第二個版本,並且你知道列表足夠小以適應內存。

請注意,這些差異與您是使用屬性還是函數調用無關。 您可以將第一個重寫為不帶參數的函數調用。

如果您只有第一個版本可用,則可以使用Fibinocci().Take(20).ToList()輕松模擬第二個版本Fibinocci().Take(20).ToList()

為什么要使用屬性(靜態或其他)。 產生的斐波納契數是......的屬性? 此外,根據經驗,屬性永遠不應執行任何“重要”計算/處理,因此您肯定希望在此處使用函數。

如果你把第一個版本放在foreach ,它將永遠不會終止,除非你特別突破。 使用它時潛在的錯誤來源。 也許那就是你想要的,但這是值得警惕的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM