Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Linq: How to query items from a collection until the sum reaches a certain value

Tags:

c#

linq

Given the following object:

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

using Linq, how would I query a List<Product> until I got a sum >= a given quantity? In other words, if my list looked like

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

I want to query the List and pull instances until I get a Sum >=8. In this case I'd get the first two items in the List. If I wanted sum >= 12, I'd get all three.

I know I can write a loop to do this for me, but I was fantasizing that there was some slick one-liner using Linq to achieve the same thing.

Thanks

like image 301
jlembke Avatar asked Oct 30 '09 21:10

jlembke


2 Answers

Here is a quick 2 liner.

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

Replace 500 with the constant or variable of your choosing.

EDIT

Here is mquander's more efficient solution

var sum = 0;
var query = col.TakeWhile(x => { var temp = sum; sum += x.Quantity; return temp < 500; });
like image 107
JaredPar Avatar answered Sep 28 '22 02:09

JaredPar


You just create a variable to hold the sum, then add to it as each item in the list is tested with the where clause:

int sum = 0;
from product in list where (sum += product.Quantity) < 8 select product
like image 40
GraemeF Avatar answered Sep 28 '22 02:09

GraemeF