У меня есть следующий код:Можно ли кэшировать частично выполненные запросы LINQ?
IEnumerable<KeyValuePair<T, double>> items =
sequence.Select(item => new KeyValuePair<T, double>(item, weight(item)));
if (items.Any(pair => pair.Value<0))
throw new ArgumentException("Item weights cannot be less than zero.");
double sum = items.Sum(pair => pair.Value);
foreach (KeyValuePair<T, double> pair in items) {...}
Где weight
является Func<T, double>
.
Проблема в том, что я хочу, чтобы weight
выполнялся как можно несколько раз. Это означает, что он должен выполняться не более одного раза для каждого элемента. Я мог бы добиться этого, сохранив его в массиве. Однако, если какой-либо вес возвращает отрицательное значение, я не хочу продолжать выполнение.
Есть ли способ сделать это легко в рамках LINQ?
Почему? Memoization - правильный термин для этой концепции: http://en.wikipedia.org/wiki/Memoization – mellamokb
@ L.B: Хорошо, какое имя вы предпочитаете для * memoizer * функции *? –
@EricLippert Я не думаю, что любой из ответов находится в рамках LINQ (исходный вопрос). Если, с другой стороны, Memoize() уже была частью LINQ, тогда THAT (imho) будет ответом на вопрос OP. Я думаю, что ваш ответ должен начинаться с: «Нет, но вы можете расширить функциональность таким образом:« Возможно, это не буквальное намерение OP. – payo