Практикум по программированию 2 на C# возможностей LINQ .NET Framework и научиться, используя LINQ, абстрагировать механизм, используемый приложением для запроса данных, от кода приложения и строить динамические запросы LINQ с помощью типов
Информатика. Тестовые вопросы к разделу 6.Выберите один ответ: a. using System, using System.Data, using System.Linq, using System.Windows.Form b. using System, using System.Linq, using System.Windows.Form c. using System, using System.Windows.Form
Пример кодаremark - только для новых машин с 2016 года выпуска есть тех осмотр is_stock - есть на складе С помощью LINQ запросов делаем следующие выборки: 1. Найти на всех складах машину марки Alfa Romeo что имеются на
ООО Гостиница Ульман Л. MySQL – М.: ДМК Пресс; СПб.: Питер, 2004. – 352с. 10. Фримен Адам , Раттц-мл. Джозеф LINQ. Язык интегрированных запросов в C# 2010 для профессионалов; Вильямс - М., 2011. – 656 c. 11. Шилдт
Разберите производительность и потенциальные проблемы этого C# LINQ-запроса: var res = items.Select(i=>Expensive(i)).Where(x=>x.Flag).ToList();…Разберите производительность и потенциальные проблемы этого C# LINQ-запроса: var res = items.Select(i=>Expensive(i)).Where(x=>x.Flag).ToList(); Где возможны лишние вычисления и как переписать для ленивой
Ответ на вопрос
Коротко — в текущем виде возможны лишние (дорогие) вычисления: поскольку у вас сначала `Select(Expensive)`, а в конце `ToList()`, то `Expensive` будет вызвана для каждого элемента последовательности при полной материализации. Численно — если в исходном `items` ровно \(N\) элементов, то будет выполнено \(N\) вызовов `Expensive`. Если только \(M\) элементов имеют `Flag == true` и \(M \ll N\), вы всё равно платите за все \(N\) вызовов.
Проблемы и подводные камни
- Ненужные вычисления: если `Flag` определяется только результатом `Expensive`, вы не можете избежать вызова `Expensive` для каждого проверяемого элемента, если фильтр ставится после проекции.
- Двойные вычисления: запись вроде `items.Where(i => Expensive(i).Flag).Select(i => Expensive(i)).ToList()` вызовет `Expensive` дважды для прошедших элементов — ошибка.
- Память: `ToList()` материализует весь результат; при больших коллекциях может быть расход памяти.
- Побочные эффекты и исключения: переупорядочивание операций или ленивость меняют момент и частоту вызовов `Expensive`.
- Параллельность: если `Expensive` CPU-bound, можно рассмотреть PLINQ, но нужно учитывать потокобезопасность.
Как переписать для ленивой оценки и уменьшения лишних вычислений
1) Если можно отфильтровать по свойствам исходного элемента (дешёвая проверка) — делайте `Where` раньше:
var res = items.Where(i => CheapPredicate(i)).Select(i => Expensive(i)).ToList();
тогда `Expensive` вызовется только для \(M\) элементов, где \(M \le N\).
2) Если нужно ленивое перечисление (не материализовать сразу):
var res = items.Select(i => Expensive(i)).Where(x => x.Flag);
`res` — `IEnumerable`; вычисление произойдёт по мере перечисления (и по-прежнему вызов `Expensive` для каждого перечисленного элемента).
3) Если нужно фильтровать по результату `Expensive`, но избежать лишних аллокаций и дублирования — явный итератор (лениво, без анонимных объектов):
IEnumerable Filtered()
{
foreach (var i in items)
{
var r = Expensive(i);
if (r.Flag) yield return r;
}
}
var res = Filtered(); // лениво, вызовы Expensive по мере перечисления
4) Если вы хотите остановиться после первых k совпадений (короткое замыкание):
var res = items.Select(i => Expensive(i)).Where(x => x.Flag).Take(k).ToList();
здесь благодаря ленивости LINQ `Expensive` вызовется не более, чем пока найдено \(k\) подходящих элементов.
5) Избегайте двух вызовов `Expensive` — если нужно одновременно фильтр и проекция от результата, кэшируйте результат один раз:
var res = items.Select(i => { var r = Expensive(i); return new { r }; })
.Where(x => x.r.Flag)
.Select(x => x.r)
.ToList();
(это всё ещё выполнит `Expensive` для всех элементов; полезно только чтобы не вызывать дважды).
Дополнительно: если `Expensive` CPU-bound и независима между элементами, подумайте об `AsParallel()`/PLINQ (требует потокобезопасности).
Вывод: если фильтр зависит только от результата `Expensive`, избежать вызова `Expensive` для "отфильтрованных" элементов нельзя — нужно либо фильтровать заранее по дешёвому условию, либо делать ленивое перечисление/раннее завершение (Take) или распараллеливание при необходимости.
Еще Как это исправить? Делаю скачивание файла на Windows Mobile в Visual Studio 2008 C# вот код:using System; using…Делаю скачивание файла на Windows Mobile в Visual Studio 2008 C# вот код:using System; using System.Linq; using System.Collections.Generic; using System.Text; using System.Net; namespace LimonMarket { public
Ответ на вопрос
Возможно, программа не может найти класс 'WebClient'. Это может быть связано с отсутствием директивы 'using' или ссылки на сборку. Чтобы исправить эту ошибку, вы можете добавить следующую директиву 'using' в верхней части вашего файла кода: using System.Nеt Это позволит импортировать необходимое namespace , содержащее класс 'WebClient'. Если после этого выдаёт ту же самую ошибку, возможно, вам нужно добавить ссылку на сборку, содержащую namespace System.Nеt. Для этого щелкните правой кнопкой мыши на своем проекте в Solution Explorer, выберите "Add Reference", а затем выберите соответствующую сборку из списка.Либо WebClient не доступен на вашей версии.
Еще Информатика Тестовые вопросы к разделу 6 using System, using System.Data, using System.Linq, using System.Windows.Form b. using System, using System.Windows.Form c. using System, using System.Linq, using System.Windows.Form d. using System, using