Для программистов, которые не имеют опыта функционального программирования, есть ли ошибки, которых следует избегать?
Хороший вопрос.Как указывает Иуда, самым большим из них является то, что выражение запроса создает запрос , оно не выполняет запрос, который оно создает.
Непосредственным следствием этого факта является то, что выполнение одного и того же запроса дважды может вернуть разные результаты.
Непосредственным следствием этого факта является выполнение запроса во второй раз.время не повторно использует результаты предыдущего выполнения , поскольку новые результаты могут отличаться.
Еще один важный факт: запросы лучше всего задают вопросы, а не изменяют состояние. Старайтесь избегать любых запросов, которые прямо или косвенно приводят к тому, что что-то меняет свое значение.Например, многие люди пытаются сделать что-то вроде:
int number;
from s in strings let b = Int32.TryParse(s, out number) blah blah blah
Это просто требует мира боли, потому что TryParse изменяет значение переменной, которая находится за пределами запроса.
В этом конкретном случае вам лучше сделать
int? MyParse(string s)
{
int result;
return Int32.TryParse(s, out result) ? (int?)result : (int?)null;
}
...
from s in strings let number = MyParse(s) where number != null blah blah blah...