Реализация Enumerable.Range - PullRequest
       8

Реализация Enumerable.Range

1 голос
/ 05 октября 2009

Что такое точная реализация Enumerable.Range в .Net; предпочтительнее .Net 4? Это возвратный цикл? Пользовательская реализация (IEnumerable, IEnumerator) или?

Ответы [ 4 ]

1 голос
/ 05 октября 2009

принятый ответ на этот вопрос должен дать вам ответ:

public static class Enumerable {
    public static IEnumerable<int> Range(int start, int count) {
        var end = start + count;
        for(var current = start; current < end; ++current) {
            yield return current;
        }
    }
}

Это не точный код, так как в методе Range происходит много ошибок и т. Д., А внутри он вызывает другие методы, однако приведенный выше код приведен является «сущностью» подпрограммы Range.

Изучение кода в Отражатель должен предоставить вам гораздо больше информации.

1 голос
/ 28 мая 2010

Небольшая, но существенная разница в выходных данных Reflector (а также проверка аргументов и дополнительный уровень интернализации, упомянутые в ответе CraigTP и его комментариях):

public static IEnumerable<int> Range(int start, int count) {
    for(int current = 0; current < count; ++current) {
        yield return start + current;
    }
}

То есть вместо другой локальной переменной они применяют дополнительное прибавление к каждому доходу.

1 голос
/ 05 октября 2009

Вы можете использовать Reflector , чтобы увидеть реализацию самостоятельно. Он проверяет аргументы и выдает исключение во время вызова, поэтому сам метод Range не является методом итератора. Он вызывает другой метод, который является методом итератора. Нельзя публиковать точный код из-за лицензионных ограничений .

0 голосов
/ 02 мая 2019

.NET 4

В феврале 2014 года Microsoft включила браузер с исходным кодом .NET онлайн . Таким образом, на ваш вопрос теперь можно получить официальный источник:

Enumerable.Range использует пользовательский итератор .

Лицензия по-прежнему не позволяет размещать код здесь, но вы можете посмотреть его самостоятельно по этой ссылке:


.NET Core

.NET Core лицензируется по более разрешительной лицензии MIT. Я не юрист, поэтому я не знаю, означает ли это, что я могу скопировать и вставить его в StackOverflow или нет, но вот прямая ссылка на их Enumerable.Range реализацию:

...