LINQ против методов расширения
От: _NN_ www.nemerleweb.com
Дата: 04.12.16 13:30
Оценка:
Есть ли синтаксическая возможность не генерировать код переменной 'counter' в "F" и при этом оставаться в синтаксисе LINQ-а ?

static int? getValue(int i){return i;}

// Изначальный вариант
static void F(int i)
{
    var q = 
        from counter in Enumerable.Range(1,10).Take(5)
        let result = getValue(i)
        where result.HasValue
        select result.Value;
}

// F через методы расширения
static void F2(int i)
{
    var q =
        Enumerable.Range(1, 10)
            .Take(5)
            .Select(counter => new { counter, result = getValue(i) })
            .Where(t => t.result.HasValue)
            .Select(t => t.result.Value);
}

// Тут нет лишней переменной
static void F3(int i)
{
    var q =
        Enumerable.Range(1, 10)
            .Take(5)
            .Select(_ => getValue(i))
            .Where(t => t.HasValue)
            .Select(t => t.Value);
}
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: LINQ против методов расширения
От: TK Лес кывт.рф
Дата: 04.12.16 13:52
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Есть ли синтаксическая возможность не генерировать код переменной 'counter' в "F" и при этом оставаться в синтаксисе LINQ-а ?


Сейчас полно оптимизаторов что заменят linq на рукописные реализации на этапе сборки.
Например: https://github.com/antiufo/roslyn-linq-rewrite
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re: LINQ против методов расширения
От: Jack128  
Дата: 04.12.16 14:26
Оценка: 15 (2) +1
Здравствуйте, _NN_, Вы писали:

_NN>Есть ли синтаксическая возможность не генерировать код переменной 'counter' в "F" и при этом оставаться в синтаксисе LINQ-а ?



        from counter in Enumerable.Range(1,10).Take(5)
        select getValue(i) into result
        where result.HasValue
        select result.Value;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.