2009-10-30 10 views
10

Dado el objeto siguiente:Linq: Cómo consultar los artículos en una colección hasta que la suma alcanza un determinado valor

public class Product { 
    string Name {get;} 
    int Quantity {get;} 
} 

usando LINQ, ¿cómo iba a consultar un List<Product> hasta que consiguiera una suma >= una cantidad dada? En otras palabras, si mi lista parecía

Name  Quantity 
----------------- 
prod1  5 
prod2  6 
prod7  7 

Quiero consultar la lista de instancias y tire hasta que consiga una suma >=8. En este caso, obtendría los primeros dos artículos en la Lista. Si quisiera suma >= 12, obtendría los tres.

Sé que puedo escribir un bucle para hacer esto por mí, pero estaba fantaseando que había un poco de una línea lisa utilizando Linq para lograr lo mismo.

Gracias

Respuesta

16

Aquí hay un trazador de líneas rápido 2.

var sum = 0; 
var query = col.Where(x => { var temp = sum; sum += x.Quantity; return temp < 500; }); 

Reemplace 500 con la constante o variable de su elección.

EDITAR

Aquí es la solución más eficiente de mquander

var sum = 0; 
var query = col.TakeWhile(x => { var temp = sum; sum += x.Quantity; return temp < 500; }); 
+1

Eso es dulce ... – jlembke

+9

Sería más eficiente hacer exactamente lo mismo excepto en lugar de. Where(), para usar .TakeWhile(), y verificar si la suma al inicio es mayor que 500, no al final (de lo contrario tomará uno de los pocos elementos). Entonces la iteración cesará cuando la barrera 500 sea roto. – mquander

+0

@mquander, ambos puntos buenos, actualizó la respuesta – JaredPar

1

Usted acaba de crear una variable para contener la suma, a continuación, añadir a la misma, ya que cada elemento de la lista se prueba con la cláusula where :

int sum = 0; 
from product in list where (sum += product.Quantity) < 8 select product 
+0

Curiosamente, cuanto más utilizo Linq, más me inclino por la sintaxis del método de extensión, excepto en casos en los que consulto la fuente de manera muy similar. Me pregunto si ese es un patrón común de uso de linq. –

+0

Posiblemente, todavía es pronto para mí. – GraemeF

+2

Ese patrón de uso es lo que he experimentado ... No tiene mucho sentido escribir eso y seleccionar la cláusula si solo quieres filtrar. Sin embargo, volví a la sintaxis de comprensión de consultas para usar las cláusulas "let". –

Cuestiones relacionadas