2009-10-30 14 views
10

Aşağıdaki nesne verildiğinde:Linq: Bir koleksiyondan toplamı belirli bir değere ulaşıncaya kadar nasıl sorgulanır?

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

, Linq kullanarak, bir List<Product> değerini belirli bir miktar >= alana kadar nasıl sorgularım? Başka bir deyişle, listem

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

gibi görünüyorsa, listeyi sorgulamak ve bir Sum >=8 elde edene kadar örnekleri almak istiyorum. Bu durumda listedeki ilk iki öğeyi alırdım. Eğer >= 12 toplamı isteseydim, her üçünü alırdım.

Bunu benim için bir döngü yazabileceğimi biliyorum, ama aynı şeyi elde etmek için Linq kullanarak biraz kaygan bir astar olduğunu hayal ediyordum.

Teşekkürler

cevap

16

İşte hızlı bir 2 astar.

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

Seçtiğiniz sabit veya değişkenle 500'ü değiştirin. İşte

DÜZENLEME

Sadece o zaman, toplamı tutacak bir değişken oluşturmak where maddesi ile test edilmiştir listedeki her öğe olarak ona ekleme en mquander daha verimli bir çözüm

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

Bu çok tatlı .. – jlembke

+9

Bunun yerine aynı şeyi yapmak daha verimli olurdu. Burada(), .TakeWhile() işlevini kullanın ve başlangıçtaki toplamın 500'den büyük olup olmadığını kontrol edin (sonunda çok az öğe alırsınız.) Ardından 500 bariyer olduğunda yineleme dururdu. kırık. – mquander

+0

@mquander, her iki güzel nokta da – JaredPar

1

olduğunu :

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

İlginç bir şekilde, Linq'i ne kadar çok kullanırsam, kaynağı sql-ish tarzında sorguladığım durumlar haricinde, uzantı söz dizimine doğru daha fazla eğlendim. Bu yaygın bir linq kullanım şekli mi acaba? –

+0

Muhtemelen - benim için hala erken günler. – GraemeF

+2

Kullanım paterni, deneyimlediğim şey ... Filtrelemek istediğinizde bunu yazmanın ve seçmek için bir nokta var. Yine de "let" cümlelerini kullanmak için sorgu anlama sözdizimine dönüyorum. –

İlgili konular