2013-02-13 12 views
8

मैं शायद अगर मैं बहुत कठिन कोशिश शब्दावली कसाई के लिए जा रहा हूँ में मानदंडों को पूरा की गिनती मिलता है, तो यह कोड के माध्यम से वर्णन करने के लिए आसान हो जाएगा:LINQ के साथ, आइटम है कि समूहीकरण

var fooGroup = fooList.GroupBy(x => x.SomeID);
//fooGroup is now of type IEnumerable<IGrouping<int, Foo>>
var someCount = fooGroup.Count(y => y.Where(f => f.Bar == "Bar"));

ऊपर इस त्रुटि के कारण संकलन नहीं होगा: "लैम्ब्डा अभिव्यक्ति कनवर्ट नहीं कर सकता प्रकार System.Func<System.Linq.IGrouping<int,Foo>,bool> को सौंपने के लिए क्योंकि ब्लॉक में प्रकार वापसी में से कुछ परोक्ष प्रतिनिधि वापसी प्रकार के लिए परिवर्तनीय नहीं हैं"

मैं जवाब मान बहुत आसान है , लेकिन मैं अपने सिर को चारों ओर लपेट नहीं सकता कि कैसे करना है इस।

+0

आपको एक उच्च स्तर पर समझा जाना चाहिए जो आप पूरा करने की कोशिश कर रहे हैं। उदाहरण के लिए, "मैं गिनना चाहता हूं कि कितने फूओ के पास एक निश्चित आईडी है।" यह कहना मुश्किल है कि आप क्या करने की कोशिश कर रहे हैं। –

उत्तर

9

आप एक समूह के साथ क्या करना समझ की एक पूरी बहुत कुछ नहीं है से कोशिश कर रहे हैं क्या। मैं निम्नलिखित का प्रस्ताव है।

यदि आप देख रहे हैं कि कितने तत्व Bar == "Bar" हैं, तो समूह के समक्ष इसे करें।

var someCount = fooList.Count(y => f.Bar == "Bar"); 

यदि आप उन समूहों को गिनना चाहते हैं जिनमें एक ही मानदंड से मेल खाता है।

var fooGroup = fooList.GroupBy(x => x.SomeID) 
    .Where(x => x.Any(z => z.Bar == "Bar")).Count(); 
+1

प्रत्येक व्यक्ति को सिंटैक्टिक रूप से अच्छे जवाब थे, लेकिन जेफ़री वह है जिसने मुझे खोद दिया रेत से बाहर सिर और बड़ी तस्वीर फिर से सोचो। कोड सेटअप करने का तरीका समझ में नहीं आया, और समूह के समक्ष गिनती करने के बाद, मुझे जो चाहिए वह मिला। धन्यवाद। – Matt

4

IEnumerable<IGrouping<int, Foo>> आपको समूहबद्ध करके मिलता है।

यह समूहों का IEnumerable है। समूह का एक प्रमुख प्रकार int है, जो इसलिए है क्योंकि आप int आईडी कॉलम द्वारा समूहित हैं। ग्रुपिंग में IEnumerable होता है जिसमें ऑब्जेक्ट्स की सूची होती है जिसमें सभी की यह कुंजी होती है। यह Foo प्रकार है।

फिर यह एक साधारण क्वेरी है। समूह से आप उन लोगों को ढूंढते हैं जिनके पास वांछित कुंजी है (यानी int आईडी), और फिर IEnumerable समूहों से गिनती का चयन करें।

var fooGrouping = fooList.GroupBy(x => x.SomeID); 
var someCount = fooGrouping.Where(grp => grp.Key == someKey).Select(p=>p.Count()); 
+0

क्या आप इस बारे में एक स्पष्टीकरण जोड़ सकते हैं कि यह कैसे काम करता है? – Matt

+0

बेशक, मुझे लगता है कि आपको वास्तव में कोड में समूह को और नीचे की आवश्यकता है और आपको किसी कारण से आईडी से इसकी गिनती प्राप्त करने की आवश्यकता है :) –

0

इस प्रयास करें:

var someCount = fooGroup.Sum(y => y.Where(f => f.Bar == "Bar").Count()); 

या और भी अधिक साफ

var someCount = fooGroup.Sum(y => y.Count(f => f.Bar == "Bar"));