Ледача оцінка / відкладене виконання
Блоки ітераторів "return yield" не виконуватимуть жодного з кодів, поки ви насправді не покличете для цього конкретного результату. Це означає, що їх також можна ефективно поєднати. Спільна вікторина: скільки разів наступний код повторюватиме файл?
var query = File.ReadLines(@"C:\MyFile.txt")
.Where(l => l.Contains("search text") )
.Select(l => int.Parse(l.SubString(5,8))
.Where(i => i > 10 );
int sum=0;
foreach (int value in query)
{
sum += value;
}
Відповідь рівно одна, і це лише до того моменту, поки це не буде foreach
. Незважаючи на те, що у мене є три окремі функції оператора linq, ми все одно прокручуємо вміст файлу лише один раз.
Це має інші переваги, крім продуктивності. Наприклад, я можу написати досить простий і загальний метод, щоб прочитати і попередньо відфільтрувати файл журналу один раз, і використовувати той самий метод у декількох різних місцях, де кожне використання додає різні фільтри. Таким чином, я підтримую хорошу продуктивність, одночасно ефективно використовуючи код.
Нескінченні списки
Дивіться мою відповідь на це запитання як хороший приклад:
функція C # Фібоначчі повертає помилки
По суті, я реалізую послідовність Фібоначчі за допомогою блоку ітераторів, який ніколи не зупиниться (принаймні, не раніше, ніж досягти MaxInt), а потім використовую цю реалізацію безпечним способом.
Покращена семантика та відокремлення питань
Знову ж таки, використовуючи приклад файлу зверху, тепер ми можемо легко відокремити код, який зчитує файл, від коду, який відфільтровує непотрібні рядки з коду, який насправді аналізує результати. Цей перший, особливо, дуже багаторазовий.
Це одна з тих речей, яку набагато важче пояснити прозою, ніж просто комусь із простим візуальним 1 :
Якщо ви не можете побачити зображення, воно відображає дві версії одного і того ж коду з підсвічуванням для різних питань. Код linq має всі кольори добре згруповані, тоді як традиційний імперативний код має кольори, змішані між собою. Автор стверджує (і я погоджуюсь), що цей результат є типовим для використання linq проти використання імперативного коду ... що linq робить кращу роботу з організації вашого коду, щоб мати кращий потік між розділами.
1 Я вважаю, що це першоджерело: https://twitter.com/mariofusco/status/571999216039542784 . Також зверніть увагу, що цей код - Java, але C # буде подібним.