2008-09-12 11 views
40

मैं सी # का उपयोग कर रहा हूं।आप एक अनुमानित प्रतिनिधि इनलाइन कैसे घोषित करते हैं?

तो मेरे पास एक वस्तु है जिसमें कुछ फ़ील्ड हैं, वास्तव में कोई फर्क नहीं पड़ता। मेरे पास इन वस्तुओं की एक सामान्य सूची है।

List<MyObject> myObjects = new List<MyObject>(); 
myObjects.Add(myObject1); 
myObjects.Add(myObject2); 
myObjects.Add(myObject3); 

तो मैं कुछ मानदंडों के आधार पर अपनी सूची से वस्तुओं को हटाना चाहता हूं। उदाहरण के लिए, myObject.X >= 10. मैं ऐसा करने के लिए RemoveAll(Predicate<T> match) विधि का उपयोग करना चाहता हूं।

मुझे पता है कि मैं एक प्रतिनिधि को परिभाषित कर सकता हूं जिसे RemoveAll में पारित किया जा सकता है, लेकिन मैं जानना चाहता हूं कि एक अज्ञात प्रतिनिधि के साथ इस इनलाइन को परिभाषित करने के बजाय, केवल एक ही स्थान पर उपयोग किए जाने वाले प्रतिनिधि कार्यों का एक समूह बनाने के बजाय।

स्पष्ट प्रतिनिधि

myObjects.RemoveAll(delegate (MyObject m) { return m.X >= 10; }); 

लैम्ब्डा

myObjects.RemoveAll(m => m.X >= 10); 

अलावा:

उत्तर

52

दो विकल्प, एक स्पष्ट प्रतिनिधि या एक प्रतिनिधि एक लांबा निर्माण के रूप में प्रच्छन्न है प्रदर्शन के अनुसार दोनों बराबर हैं। वास्तव में, संकलित होने पर दोनों भाषा संरचनाएं एक ही आईएल उत्पन्न करती हैं। इसका कारण यह है # 3.0 सी मूल रूप से सी # 2.0 पर एक विस्तार है है, इसलिए यह सी # 2.0 निर्माणों :)

15

लैम्ब्डा सी # 3.0 तरीका करने के लिए संकलित:

myObjects.RemoveAll(m => m.x >= 10); 

गुमनाम प्रतिनिधि सी # 2.0 रास्ता:

myObjects.RemoveAll(delegate (MyObject m) { 
    return m.x >= 10; 
}); 

और, वीबी लोगों के लिए, वीबी 9.0 लैम्ब्डा रास्ता:

myObjects.RemoveAll(Function(m) m.x >= 10) 

दुर्भाग्य से, वीबी एक का समर्थन नहीं करता अज्ञात प्रतिनिधि

+0

क्यों वीबी गुमनाम प्रतिनिधियों चाहते चाहिए जब यह lambdas है? और हां, अगले संस्करण में बहु-लाइन लैम्ब्डा और लैम्ब्डा होंगे जो एक मान (= 'उप ') नहीं लौटाएंगे। –

+2

कारणों के कारण आपने अभी कहा - मल्टीलाइन कथन, और फ़ंक्शंस जो मान वापस नहीं करते हैं। यह जानना अच्छा है कि यह अगले संस्करण में होगा, लेकिन सी # ने 2005 के बाद से यह किया है। –

10
//C# 2.0 
    RemoveAll(delegate(Foo o){ return o.X >= 10; }); 

या

//C# 3.0 
    RemoveAll(o => o.X >= 10); 

या

Predicate<Foo> matches = delegate(Foo o){ return o.X >= 10; }); 
    //or Predicate<Foo> matches = o => o.X >= 10; 
    RemoveAll(matches); 
0

विधेय एक प्रतिनिधि जो एक परम लेता है और एक बूलियन देता है।

हम

RemoveAll(p=> p.x > 2); 

2) अज्ञात फ़ंक्शन का उपयोग करते हुए निम्न तरीकों

1) इनलाइन लैम्ब्डा अभिव्यक्ति का उपयोग में भी ऐसा ही कर सकते हैं

RemoveAll(delegate(myObject obj){ 

    return obj.x >=10; 
}) 

3) विधेय का उपयोग करना प्रतिनिधि

Predicate<myObject> matches = new Predicate<myObject>(IsEmployeeIsValid); 
RemoveAll(matches); 

Predicate<Foo> matches = delegate(Foo o){ return o.X >= 20; }); 
RemoveAll(matches); 

3) क्या स्पष्ट रूप एक प्रतिनिधि की घोषणा और एक समारोह

public delegate bool IsInValidEmployee (Employee emp); 

IsInValidEmployee invalidEmployeeDelegate = new IsInValidEmployee(IsEmployeeInValid); 
myObjects.RemoveAll(myObject=>invalidEmployeeDelegate(myObject); 

की ओर इशारा करते // वास्तविक समारोह

public static bool IsEmployeeInValid(Employee emp) 
{ 
    if (emp.Id > 0) 
     return true; 
    else 
     return false; 
} 
संबंधित मुद्दे