Ответ 1
A List Consrehension - это тип набора нотации, в котором программист может описать свойства, которые должны соответствовать членам набора. Он обычно используется для создания набора, основанного на других, уже существующих, наборах или наборах, путем применения какого-либо типа комбинации, преобразования или сокращения к существующим наборам.
Рассмотрим следующую проблему: у вас есть последовательность из 10 чисел от 0 до 9, и вам нужно извлечь все четные числа из этой последовательности. На языке, таком как версия С# версии 1.1, вы были в значительной степени ограничены следующим кодом для решения этой проблемы:
ArrayList evens = new ArrayList();
ArrayList numbers = Range(10);
int size = numbers.Count;
int i = 0;
while (i < size)
{
if (i % 2 == 0)
{
evens.Add(i);
}
i++;
}
В приведенном выше коде не показана реализация функции Range, которая доступна в списке полного кода ниже. С появлением С# 3.0 и .NET Framework 3.5 в CY-программировании теперь доступна нотация на основе списка, основанная на Linq. Вышеупомянутый код С# 1.1 можно портировать на С# 3.0 следующим образом:
IEnumerable<int> numbers = Enumerable.Range(0, 10);
var evens = from num in numbers where num % 2 == 0 select num;
И, с технической точки зрения, вышеприведенный код С# 3.0 можно записать как однострочный, переместив вызов на Enumarable. Перейдите к выражению Linq, которое генерирует последовательность evens. В С# List Consrehension я уменьшаю заданные числа, применяя функцию (по модулю 2) к этой последовательности. Это создает последовательность эвенов намного более кратким образом и не допускает использования синтаксиса цикла. Теперь вы можете спросить себя: это чисто синтаксический сахар? Я не знаю, но я определенно исследую и, возможно, даже задаю вопрос сам. Я подозреваю, что это не просто синтаксический сахар, а некоторые истинные оптимизации, которые можно сделать, используя базовые монады.
Полный список кодов доступен здесь.