IEnumerable की गणना विधि नहीं है


83

मेरे पास निम्न विधि है:

public bool IsValid
{
  get { return (GetRuleViolations().Count() == 0); }
}

public IEnumerable<RuleViolation> GetRuleViolations(){
  //code here
}

ऐसा क्यों है कि जब मैं .Count()ऊपर करता हूं तो यह लाल रंग में रेखांकित होता है?

मुझे निम्नलिखित त्रुटि मिली:

त्रुटि 1 'System.Collections.Generic.IEnumerable' में 'काउंट' की कोई परिभाषा नहीं है और न ही कोई विस्तार विधि 'काउंट' टाइप '' System.Collections.Generic.IEBumerable '' के पहले तर्क को स्वीकार करते हुए पाया जा सकता है (क्या आप एक याद कर रहे हैं? निर्देश या असेम्बली रेफरेंस का उपयोग करते हुए?) c: \ users \ a \ document \ visual studio 2010 \ Projects \ NerdDinner \ NerdDinner \ मॉडल \ Dinner.cs 15 47 NerdDinner


एक ही समस्या थी। किसी कारण से आप इसे राइट-क्लिक नहीं कर सकते हैं और इसे ठीक करने के लिए "रिज़ॉल्व ..." चुनें :(
micahhoover

आह! मेरे पास System.Linq शामिल है लेकिन फिर भी यह त्रुटि मिलती है। (हालांकि वह त्रुटि संदेश के रूप में पहले arg को "System.Linq.IQueryable" का नाम देता है।)
Hot Licks

एक सामान्य नोट पर: (।) की कमियों का तरीका है - यह lightheartedly का उपयोग न करें! मैंने इसके बारे में अपनी टिप्पणी में नीचे लिखा है stackoverflow.com/a/65112753/863651 इसकी समीक्षा करने के लिए स्वतंत्र महसूस करें
XDS

जवाबों:


160

आप जोड़ना:

using System.Linq;

अपने स्रोत के शीर्ष पर और सुनिश्चित करें कि आपको System.Core असेंबली का संदर्भ मिल गया है।

Count()System.Linq.EnumerableLINQ से ऑब्जेक्ट्स के लिए स्टेटिक क्लास और System.Linq.QueryableLINQ से SQL और अन्य आउट-ऑफ-प्रोसीजर प्रदाताओं के लिए एक विस्तार विधि है ।

संपादित करें: वास्तव में, Count()यहां का उपयोग अपेक्षाकृत अक्षम है (कम से कम LINQ से वस्तुओं में)। आप सभी जानना चाहते हैं कि क्या कोई तत्व हैं या नहीं, है ना? उस मामले में, Any()एक बेहतर फिट है:

public bool IsValid
{
  get { return !GetRuleViolations().Any(); }
}

यदि यह संदर्भ आपको कोई त्रुटि देता है, तो सत्यापित करें कि आपकी परियोजना का लक्ष्य ढाँचा (प्रोजेक्ट गुण, अनुप्रयोग टैब) .NET फ्रेमवर्क 3.5 या 4 में सेट है। एक्सटेंशन विधियाँ 2.0 या इससे पहले काम नहीं करेंगी।
विल्व

1
मैं का उपयोग कर रहा है System.Linq; लेकिन यह मेरे मुद्दे को हल नहीं करता है ... मैं यह कैसे सुनिश्चित कर सकता हूं कि मुझे System.Core विधानसभा का संदर्भ मिला है?
१26:२० पर अहेरलंबांग

ओह कोई बात नहीं, मैंने इसे ठीक कर दिया ... System.data.linq और System.Linq के बीच अलग क्या है
aherlambang

@Alexander: वे पूरी तरह से अलग नामस्थान हैं। System.Data.LinqLINQ to SQL के लिए विशिष्ट है।
जॉन स्कीट

1
@skyfoot: नहीं, यह वास्तव में नहीं होगा। यह आपको 4 देगा। यदि आप अन्यथा सोचते हैं, तो कृपया एक छोटे लेकिन पूर्ण कार्यक्रम के साथ एक प्रश्न पोस्ट करें जो समस्या को प्रदर्शित करता है।
जॉन स्कीट

7

Any()या Count()Linq में विधियाँ केवल सामान्य प्रकारों के लिए काम करती हैं।

IEnumerable<T>

यदि आपके पास एक IEnumerableप्रकार के बिना एक सरल है , तो उपयोग करने का प्रयास करें

IEnumerable<object> 

बजाय।


2

IEnumerationनामक विधि नहीं है Count()। यह सिर्फ "तत्वों का अनुक्रम" है। उदाहरण के लिए उपयोग करें Listयदि आपको स्पष्ट रूप से तत्वों की संख्या की आवश्यकता है। यदि आप Linq का उपयोग करते हैं, तो ध्यान रखें, कि एक्सटेंशन विधि Count()वास्तव में हर बार आपके द्वारा कॉल करने वाले तत्वों की संख्या को फिर से गिन सकती है।


0

भविष्य में इस पद पर ठोकर खाने वाले थके हुए यात्री की मदद करने के लिए .Count () के नुकसान पर सावधानी का एक छोटा और मीठा सामान्य शब्द !

लघु कथा:

निम्नलिखित काम करता है-कोई संदेह नहीं है, लेकिन अगर कोई एंबुलेबल्स किसी अंतर्निहित सरणी या सूची द्वारा समर्थित नहीं है, जो 'काउंट' है, जो आसान / प्री -कॉम्प्लेक्टेड है, तो छोटा प्रदर्शन जुर्माना हो सकता है :

public bool IsValid
{
   get { return SomeMethodReturningEnumerable().Count() <= threshold; }  <--- small performance issue here
}

public IEnumerable<SomeObject> SomeMethodReturningEnumerable(){
   yield return foo;
   yield return bar; etc
}

कॉल .Count () विधि संभवत: प्रत्येक और प्रत्येक आइटम के माध्यम से गणना करने योग्य है और फिर थ्रेशोल्ड से समग्र गणना की तुलना करेगी । हम चालाक होने के नाते थोड़ा बेहतर कर सकते हैं:

    public bool IsValid
    {
       get { return !SomeMethodReturningEnumerable().HasMoreThan(threshold); }  <--- neato!
    }

    public static bool HasLessThan<T>(this IEnumerable<T> sequence, int count) => !sequence.HasMoreThan(count - 1);

    public static bool HasLessOrEqualTo<T>(this IEnumerable<T> sequence, int count) => !sequence.HasMoreThan(count);

    public static bool HasMoreOrEqualTo<T>(this IEnumerable<T> sequence, int count) => sequence.HasMoreThan(count - 1);

    public static bool HasMoreThan<T>(this IEnumerable<T> sequence, int count) => sequence.EnumerationCounterImpl(count, equals_vs_greaterThan: false);

    public static bool HasExactly<T>(this IEnumerable<T> sequence, int count) => sequence.EnumerationCounterImpl(count, equals_vs_greaterThan: true);

    public static bool EnumerationCounterImpl<T>(this IEnumerable<T> sequence, int count, bool equals_vs_greaterThan = true) //0
    {
        if (equals_vs_greaterThan && count < 0)
            throw new ArgumentException($"{nameof(count)} is less than zero!");

        if (!equals_vs_greaterThan && count < 0)
            return true;

        var staticCount = (sequence as ICollection)?.Count                              
                          ?? (sequence as ICollection<T>)?.Count
                          ?? (sequence as IReadOnlyCollection<T>)?.Count;

        if (staticCount != null)
            return staticCount > count;

        using (var enumerator = sequence.GetEnumerator()) //1 optimization
        {
            for (int i = 0; i < count + 1; i++)
            {
                if (enumerator.MoveNext())
                    continue;

                return false;
            }

            return !equals_vs_greaterThan //     ==
                   || enumerator.MoveNext(); //  >
        }

        //0 https://blog.slaks.net/2015-01-12/linq-count-considered-occasionally-harmful/
        //1 using the enumerator directly is slightly faster than using LINQ methods   it avoids allocating an extra iterator
        //  state machine compared to using skip()
    }

वहाँ! समस्या फिर से हल हो गई लेकिन इस बार हम प्रदर्शन के प्रति सचेत हैं!


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.