2011-09-18 11 views
6

मैं इस कोडLINQ का उपयोग कर दो Sum संचालनों को एक साथ कैसे जोड़ा जाए?

Dim sum As Integer = scores.Sum(Function(score) score.Fraction * score.Score) 
Dim count As Integer = scores.Sum(Function(score) score.Fraction) 

या सी # में:

var sum=scores.Sum(score=>score.Fraction * score.Score); 
var count=scores.Sum(score=>score.Fraction); 

मैं इन कैसे मर्ज और प्राप्त है कि संग्रह केवल एक बार प्रगणित है सकते हैं? मुझे कुछ उदाहरण मिल गए लेकिन अगर मुझे गलत नहीं लगता है तो भी वे संग्रह को फिर से दोहराते हैं।

उत्तर

11
var sum = 0; 
var count = 0; 

foreach(var score in scores){ 
    sum += score.Fraction * score.Score; 
    count += score.Fraction; 
} 

... मेरा मुद्दा यह है कि LINQ का उपयोग क्यों करें - इसका मतलब कुछ चीजों को आसान बनाना है, लेकिन LINQ के साथ यह आसान नहीं है।

+0

मुझे लगता है कि स्नैजनेस को यहां पठनीयता के लिए रास्ता देना है ;-) – Dabblernl

10

आप Aggregate साथ यह कर सकते हैं, हालांकि यह एक दर्द का एक सा है - और प्रत्येक यात्रा के लिए एक अतिरिक्त वस्तु बनाता है: एक ValueTuple<T1, T2> struct बनाने के द्वारा

var sums = scores.Aggregate(new { Sum = 0, Count = 0 }, 
    (current, item) => new { Sum = current.Sum + item.Score * item.Fraction, 
           Count = current.Count + item.Fraction }); 

जाहिर है आप इस और अधिक कुशल बनाने सकता है - जैसे टपल , लेकिन एक संरचना के रूप में।

संपादित करें: मैं पेटार के बिंदु से सहमत हूं - अगर यह सभी आपको करने की ज़रूरत है, तो LINQ वास्तव में इस स्थिति में सहायक नहीं है।

संबंधित मुद्दे