Tengo el siguiente código:¿Puedo almacenar en caché las consultas LINQ parcialmente ejecutadas?
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) {...}
Dónde weight
es una Func<T, double>
.
El problema es que quiero que weight
se ejecute las veces que sea posible. Esto significa que debe ejecutarse como máximo una vez para cada elemento. Podría lograr esto guardándolo en una matriz. Sin embargo, si un peso devuelve un valor negativo, no quiero continuar la ejecución.
¿Hay alguna manera de lograr esto fácilmente dentro del marco de LINQ?
¿Por qué? Memoization es el término correcto para este concepto: http://en.wikipedia.org/wiki/Memoization – mellamokb
@ L.B: OK, ¿qué nombre preferirías para un * function memoizer *? –
@EricLippert No creo que ninguna de las respuestas esté dentro del marco LINQ (la pregunta original). Si, por otro lado, Memoize() ya era parte de LINQ, entonces THAT (imho) sería la respuesta a la pregunta del OP. Creo que su respuesta debería comenzar con: "No, pero puede extender la funcionalidad de esta manera:" Quizás esta no sea la intención literal del OP. – payo