Правильное использование «доходности»

Нет более простого способа «деактивировать», о котором я могу думать, но ваша замена может быть упрощена:

var makeComp = (function(){

    var accents = {
            a: 'àáâãäåæ',
            c: 'ç',
            e: 'èéêëæ',
            i: 'ìíîï',
            n: 'ñ',
            o: 'òóôõöø',
            s: 'ß',
            u: 'ùúûü',
            y: 'ÿ'
        },
        chars = /[aceinosuy]/g;

    return function makeComp(input) {
        return input.replace(chars, function(c){
            return '[' + c + accents[c] + ']';
        });
    };

}());
847
задан Sachin Joseph 24 October 2017 в 19:02
поделиться

7 ответов

Я склонен использовать возврат урожая, когда я вычисляю следующий объект в списке (или даже следующая группа объектов).

Используя Вашу Версию 2, у Вас должен быть полный список перед возвратом. При помощи возврата урожая у Вас действительно только должен быть следующий объект перед возвратом.

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

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

В Вашем конкретном примере, у Вас есть полный список продуктов, таким образом, я использовал бы Версию 2.

766
ответ дан abelenky 24 October 2017 в 19:02
поделиться

Возвратите список непосредственно. Преимущества:

  • Это более ясно
  • <забастовка>, список является допускающим повторное использование. (итератор не) не на самом деле верный, Jon

Спасибо, необходимо использовать итератор (урожай) от того, когда Вы думаете, что, вероятно, не должны будете выполнять итерации полностью до конца списка, или когда это не имеет никакого конца. Например, клиент, звонящий, собирается быть поиском первого продукта, который удовлетворяет некоторый предикат, Вы могли бы рассмотреть использование итератора, хотя это - изобретенный пример, и существуют, вероятно, лучшие способы выполнить его. В основном, если Вы знаете заранее, что целый список должен будет быть вычислен, просто сделайте это впереди. Если Вы думаете, что это не будет, затем рассмотреть использование версии итератора.

3
ответ дан recursive 24 October 2017 в 19:02
поделиться

И что относительно этого?

public static IEnumerable<Product> GetAllProducts()
{
    using (AdventureWorksEntities db = new AdventureWorksEntities())
    {
        var products = from product in db.Product
                       select product;

        return products.ToList();
    }
}

я предполагаю, что это намного более чисто. У меня нет VS2008 под рукой для проверки, все же. В любом случае, если продукты реализуют IEnumerable (поскольку это кажется - это используется в foreach операторе), я возвратил бы его непосредственно.

7
ответ дан petr k. 24 October 2017 в 19:02
поделиться

Это отчасти помимо точки, но так как вопросом являются отмеченные лучшие практики, я буду идти вперед и добавлять свои два цента. Для этого типа вещи я значительно предпочитаю превращать его в свойство:

public static IEnumerable<Product> AllProducts
{
    get {
        using (AdventureWorksEntities db = new AdventureWorksEntities()) {
            var products = from product in db.Product
                           select product;

            return products;
        }
    }
}

Несомненно, это - немного больше шаблона, но код, который использует это, будет выглядеть намного более чистым:

prices = Whatever.AllProducts.Select (product => product.price);

по сравнению с

prices = Whatever.GetAllProducts().Select (product => product.price);

Примечание: я не сделал бы этого ни для каких методов, которые могут требовать времени, чтобы сделать их работу.

8
ответ дан Mark A. Nicolosi 24 October 2017 в 19:02
поделиться

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

второй пример преобразовывает перечислитель/итератор в список с ToList () метод. Это означает, что вручную выполняет итерации по всем объектам в перечислителе и затем возвращает плоский список.

8
ответ дан Soviut 24 October 2017 в 19:02
поделиться

Это собирается походить на причудливое предложение, но я изучил, как использовать yield ключевое слово в C# путем чтения представления генераторов в Python: David M. Beazley http://www.dabeaz.com/generators/Generators.pdf . Вы не должны знать, что много Python понимает представление - я не сделал. Я нашел его очень полезным в объяснении не, как работают генераторы, но и почему необходимо заботиться.

26
ответ дан Robert Rossney 24 October 2017 в 19:02
поделиться

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

нет никакого права, или неправильно ответьте этому. Какой предпочтителен, просто зависит от ситуации. Например, если существует предел времени, когда необходимо завершить запрос, и необходимо сделать что-то полусложное с результатами, вторая версия могла быть предпочтительной. Но остерегайтесь больших наборов результатов, особенно при выполнении этого кода в 32-разрядном режиме. Я несколько раз кусался исключениями OutOfMemory при выполнении этого метода.

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

12
ответ дан Jason Baker 24 October 2017 в 19:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: