Недвижимость с Enumerable или списком - PullRequest
3 голосов
/ 23 января 2010

Я играю с LINQ и смежными предметами, и мне было интересно узнать следующее.

У меня есть 2 метода получения последовательности Фибоначчи. Я начал с:

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 +, возможно, я бы хотел добавить к нему некоторую параметризацию. Я на самом деле не ищу оптимизаций или чего-то такого, как use , потому что число быстро растет, это просто быстрый пример. Просто некоторые аргументы за и против каждого метода. Почему и когда я должен использовать какой метод?

Ответы [ 3 ]

4 голосов
/ 23 января 2010

Важное различие между ними заключается в том, что в вашей второй версии вы должны заранее знать, когда вы хотите остановиться, но в первой версии вы можете начать итерацию, а затем решить, когда остановиться. Вам не нужно знать заранее.

Вам также не нужно хранить весь список в памяти сразу с первой версией. Вы можете обрабатывать данные в потоковом режиме.

Преимущество второго заключается в том, что возвращение списка позволяет индексировать массив, а не обрабатывать элементы один за другим с самого начала. Вы можете использовать вторую версию, если знаете, сколько элементов вы хотите, и знаете, что список достаточно мал, чтобы поместиться в памяти.

Обратите внимание, что эти различия не имеют никакого отношения к тому, используете ли вы свойство или вызов функции. Первым можно переписать вызов функции, не имеющий параметров.

Если у вас есть только первая доступная версия, вы можете легко эмулировать вторую версию, используя Fibinocci().Take(20).ToList().

0 голосов
/ 23 января 2010

Если вы поместите первую версию в foreach, то она никогда не прекратится, если вы специально не выйдете. Потенциальный источник ошибки при его использовании. Может быть, это то, что вы хотите, но это то, что нужно с осторожностью.

0 голосов
/ 23 января 2010

Зачем вам использовать свойство (статическое или иное). Генерирование числа Фибоначчи - это свойство чего ...? Также, как правило, свойство никогда не должно выполнять каких-либо «значительных» вычислений / обработок, поэтому вы определенно хотите использовать здесь функцию.

...