c# - Func बनाम एक्शन बनाम भविष्यवाणी




delegates (2)

Func और Action बीच का अंतर यह है कि क्या आप प्रतिनिधि को एक मूल्य ( Func उपयोग करें) या नहीं ( Action उपयोग करें) वापस करना चाहते हैं।

Func शायद सबसे अधिक LINQ में उपयोग किया जाता है - उदाहरण के लिए अनुमानों में:

 list.Select(x => x.SomeProperty)

या फ़िल्टरिंग:

 list.Where(x => x.SomeValue == someOtherValue)

या मुख्य चयन:

 list.Join(otherList, x => x.FirstKey, y => y.SecondKey, ...)

List<T>.ForEach : जैसी चीजों के लिए आमतौर पर Action का उपयोग किया जाता है: सूची में प्रत्येक आइटम के लिए दिए गए क्रिया को निष्पादित करें। मैं Func से कम अक्सर इसका उपयोग करता हूं, हालांकि मैं कभी-कभी Control.BeginInvoke और Dispatcher.BeginInvoke जैसी चीज़ों के लिए पैरामीटर रहित संस्करण का उपयोग करता हूं।

Predicate सिर्फ एक विशेष cased Func<T, bool> वास्तव में, सभी Func से पहले पेश की गई है और अधिकांश Action प्रतिनिधियों के साथ आया था। मुझे संदेह है कि अगर हमारे पास पहले से ही उनके विभिन्न गानों में Func और Action था, तो Predicate नहीं की गई थी ... हालांकि यह प्रतिनिधि के उपयोग के लिए एक निश्चित अर्थ प्रदान करता है , जबकि Func और Action का व्यापक रूप से असमानता के लिए उपयोग किया जाता है प्रयोजनों।

FindAll और RemoveAll जैसी विधियों के लिए FindAll List<T> में उपयोग की RemoveAll

इस प्रश्न का उत्तर यहां दिया गया है:

वास्तविक उदाहरणों और उनके उपयोग के साथ, क्या कोई मुझे समझने में मदद कर सकता है:

  1. हमें Func प्रतिनिधि की आवश्यकता कब होगी?
  2. हमें कार्य प्रतिनिधि की आवश्यकता कब होगी?
  3. हमें प्रतिनिधियों को भविष्यवाणी करने की आवश्यकता कब होती है?

Func - जब आप ऐसे फ़ंक्शन के लिए प्रतिनिधि चाहते हैं जो पैरामीटर ले सकता है या नहीं कर सकता है और कोई मान देता है। LINQ से सबसे आम उदाहरण का चयन किया जाएगा:

var result = someCollection.Select( x => new { x.Name, x.Address });

क्रिया - जब आप ऐसे फ़ंक्शन के लिए प्रतिनिधि चाहते हैं जो पैरामीटर ले सकता है या नहीं कर सकता है और कोई मान वापस नहीं करता है। मैं इन्हें अक्सर अज्ञात ईवेंट हैंडलर के लिए उपयोग करता हूं:

button1.Click += (sender, e) => { /* Do Some Work */ }

भविष्यवाणी - जब आप एक Func का एक विशेष संस्करण चाहते हैं जो मानदंडों के एक सेट के खिलाफ मूल्य का मूल्यांकन करता है और एक बूलियन परिणाम देता है (एक मैच के लिए सच है, अन्यथा गलत है)। दोबारा, इन्हें LINQ में अक्सर चीजों के लिए उपयोग किया जाता है जैसे कहां:

var filteredResults = 
    someCollection.Where(x => x.someCriteriaHolder == someCriteria);

मैंने बस दो बार चेक किया है और यह पता चला है कि LINQ भविष्यवाणियों का उपयोग नहीं करता है। निश्चित नहीं है कि उन्होंने यह निर्णय क्यों लिया ... लेकिन सैद्धांतिक रूप से यह अभी भी एक ऐसी स्थिति है जहां एक भविष्य फिट होगा।





delegates