2014-07-14 2 views
7

हम एक सरल संरचना जो सिर्फ सूचियों की एक सूची है, इसलिए की तरह ...सूचियों की सूची में वस्तुओं की कुल गणना प्राप्त करने के लिए लिंक का उपयोग करना संभव है?

var fooInfo = new List<List<Foo>>(); 

वहाँ एक आसान तरीका हम LINQ का उपयोग कर सकते भीतरी से सभी वस्तुओं की कुल वापस जाने के लिए है, तो मैं सोच रहा हूँ है सूचियों। उदाहरण के लिए, अगर हम इस था ...

fooInfo.add(new List<Foo>()); // First list within the outer list 
fooInfo.add(new List<Foo>()); // Second list within the outer list 
fooInfo.add(new List<Foo>()); // Third list within the outer list 

// Add two items to the first inner list 
fooInfo[0].add(new Foo()); 
fooInfo[0].add(new Foo()); 

// Add one item to the second inner list 
fooInfo[1].add(new Foo()); 

// Add four items to the third inner list 
fooInfo[2].add(new Foo()); 
fooInfo[2].add(new Foo()); 
fooInfo[2].add(new Foo()); 
fooInfo[2].add(new Foo()); 

... हम तीन सूचियों दो, एक और चार आइटम के साथ क्रमशः है, कुल 'फू' वस्तुओं सात हैं, जिसका अर्थ है जाएगा। यही वह नंबर है जिसे मैं अपने स्वयं के लूपिंग कोड लिखने और मैन्युअल रूप से उन्हें लिखने के बजाय linq के माध्यम से पुनर्प्राप्त करने की उम्मीद कर रहा हूं।

उदा।

var totalFoos = fooInfo.LINQToGetTotalFoos(); 

बजाय ....

int totalFoos = 0; 

foreach(var childList in fooInfo) 
    totalFoos += childList.Count(); 

उत्तर

9

एक साधारण Enumerable.Sum पर्याप्त होगा।

var totalFoos = fooInfo.Sum(childList => childList.Count); 

यह Int32 मूल्यों के अनुक्रम है कि एक इनपुट अनुक्रम के प्रत्येक तत्व पर समारोह को बदलने लागू द्वारा प्राप्त कर रहे हैं की राशि की गणना करता है।

आप SelectMany का उपयोग कर सकते हैं लेकिन इसका प्रदर्शन बेहतर होगा।

5

उपयोग SelectMany और Count:

var nbOfItems = source.SelectMany(x => x).Count(); 

या Select, Count और Sum:

var nbOfItems = source.Select(x => x.Count()).Sum(); 

उत्तरार्द्ध बेहतर प्रदर्शन करेगा, क्योंकि यह SelectMany जैसी सभी वस्तुओं पर गणना नहीं करेगा।

+0

@ निखिलग्रावल 'एनमेरेबल काउंटर()' यदि लक्ष्य 'आईसीओलेक्शन ' लागू करता है (और उसके कारण 'गणना' संपत्ति है), और यदि ऐसा होता है तो इसका उपयोग करता है। – MarcinJuraszek

+0

हां। वैध बिंदु। मेरी चिंता 'IENumerable.Count' के बजाय' List.Count' का उपयोग करना था। इससे आपके प्रश्न हल्का हो जाएंगे। –

+0

इसे पढ़ें http://stackoverflow.com/questions/981254/is-the-linq-count-faster-or-slower-than-list-count-or-array-length –

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