2009-10-07 7 views
7

मैं काम नहीं कर सकता हूं कि मैं एक सूची के "खोज" को कैसे कर सकता हूं जिसका उपयोग मैं उस समय के उपयोग के आधार पर करता हूं जिसे मैं रन टाइम पर पास करूंगा। यदि आप मेरा नीचे कोड देखते हैं, तो मैं सूची में कस्टम क्लास ढूंढने में सक्षम होना चाहता हूं जिसके लिए यह पथ पैरामीटर एक्स के बराबर है, जहां एक्स को रन टाइम पर परिभाषित किया जाएगा।सी # सूची। ढूँढें विधि - मैं भविष्य में मूल्य कैसे पास कर सकता हूं?

किसी भी विचार सूची में ऐसे खोज कैसे करें? या यह एक इटरेटर लिखने और मैन्युअल रूप से खोजने के बिना संभव नहीं है? किस मामले में शायद एक कुंजी संग्रह है जिसे मुझे इसके बजाय उपयोग करना चाहिए?

private List<CustomClass> files; 

    public void someMethod() 
    { 
     Uri u= new Uri(www.test.com); 
     CustomClass cc = this.files.find(matchesUri(u)); // WON'T LET ME DO THIS 
    } 

    private static bool matchesUri(List<CustomClass> cc, Uri _u) 
    { 
     return cc.Path == _u;   } 


public class CustomClass 
{ 
    private Uri path; 

    public Uri Path 
    { 
     get { return this.path; } 
     set { this.path = value; } 
    } 
} 

पीएस। मैं आप

CustomClass cc = this.files.Find(p=> p.Path == u); 

खोजें() विधि अशक्त लौटाता है यदि कोई तत्व मिला था विधेय से मेल खाता है लिख सकते हैं मैं काफी http://msdn.microsoft.com/en-us/library/x0b5b5bc.aspx

उत्तर

12

एक लैम्ब्डा का उपयोग करें:

Uri u = new Uri("www.test.com"); 
CustomClass cc = this.files.Find(cc => cc.Path == u); 

या आप अभी भी एक नामित विधि चाहते हैं:

static bool matchesUri(CustomClass cc, Uri _u) 
{ 
    return cc.Path == _u; 
} 

Uri u = new Uri("www.test.com"); 
CustomClass cc = this.files.Find(cc => matchesUri(cc, u)); 
+0

धन्यवाद दोस्तों - वैसे - क्या मैं (यदि मैं सी # पर अधिक था) तो क्या मैं डॉको में विधि के सिंटैक्स को देखकर यह काम कर सकता था? (यानी पैरामीटर्स, मैच, टाइप: सिस्टम .. ::। <(Of <(T>)> 0, भविष्यवाणी <(Of <(T>)>) प्रतिनिधि जो तत्व की शर्तों को परिभाषित करने के लिए परिभाषित करता है ... – Greg

+0

पैरामीटर प्रकार के प्रकार को प्रतिबंधित करता है प्रतिनिधि आप विधि को पास कर सकते हैं, और इस प्रकार उस प्रतिनिधि को बनाने के लिए विधि या लैम्बडा के हस्ताक्षर का उपयोग करना होगा। यह किसी भी अन्य प्रतिनिधि प्रकार की तुलना में अब और अपने आप में, lambdas के उपयोग को इंगित नहीं करता है। लैम्बडास के लिए दस्तावेज़ीकरण यहां है: http://msdn.microsoft.com/en-us/library/bb397687.aspx –

+1

प्रतिनिधि फ़ंक्शन पॉइंटर के समान है। हस्ताक्षर को देखकर ('प्रतिनिधि बूल भविष्यवाणी (टी ओबीजे)') आप देख सकते हैं कि एक अनुमान एक कार्य (विधि) है जो ** ** प्रकार का ** एकल पैरामीटर लेता है, और ** बूल ** देता है । – Groo

1

पर doco में विधेय सामान का पालन नहीं करते स्वीकार करना होगा।

0
public void someMethod() 
{ 
    Uri u= new Uri("www.test.com"); 
    CustomClass cc = this.files.find(p => { return p.Path == u; }); 
} 
+0

क्यों कथन lambda? –

+0

पीईबीसीएक। दिमाग़ का दही। अपना चयन ले लो। –

0

खोज के लिए अनाम विधि का उपयोग कर की कोशिश करो और किसी भी स्थानीय चर आप इसके अंदर इच्छा का उपयोग । यदि यह संतोषजनक नहीं है, तो अपनी सामान्य परिभाषित प्रतिनिधि विधि को कॉल करें।

1

पूर्णता खातिर ही, यहाँ के लिए आप एक लैम्ब्डा उपयोग करने के लिए नहीं करना चाहता था, तो आप क्या करेंगे है:

public void someMethod() 
{ 
    Uri u = new Uri("www.test.com"); 
    UriMatcher matcher = new UriMatcher(u); 
    CustomClass cc = this.files.Find(matcher.Match); 
} 

ध्यान दें कि आप कर रहे हैं:

// Predicate must be a method with a single parameter, 
// so we must pass the other parameter in constructor 

public class UriMatcher 
{ 
    private readonly Uri _u; 
    public UriMatcher(Uri u) 
    { 
     _u = u; 
    } 

    // Match is Predicate<CustomClass> 
    public bool Match(CustomClass cc) 
    { 
     return cc.Path == _u; 
    } 
} 

और फिर के रूप में उपयोग एक विधि के संदर्भ में, विधि के परिणाम नहीं - Match बनाम Match()

इस धागे को भी देखें: Predicate Delegates in C#

0

एक अज्ञात प्रतिनिधि का उपयोग करते हुए .NET 2.0 उत्तर (ध्यान दें कि यह केवल सी # के लिए काम करता है, वीबी.नेट में अज्ञात प्रतिनिधि नहीं हैं)।

public void someMethod() 
{ 
    Uri u= new Uri("www.test.com"); 
    CustomClass cc = this.files.find(delegate(CustomClass oTemp) { return oTemp.Path == u;}); 
} 
0

पावेल की पोस्ट जवाब के रूप में चिह्नित में, मुझे लगता है कि लाइन:

CustomClass cc = this.files.Find(cc => cc.Path == u); 

होना चाहिए बजाय की तरह: है

CustomClass cc = this.files.Find(cc2 => cc2.Path == u); 

इस के बाईं ओर expresion => है, क्योंकि एक परिवर्तनीय परिभाषा (प्रकार अभिव्यक्ति से अनुमानित है) - संकलक अन्यथा एक पुनर्वितरण त्रुटि प्रदान करेगा।

यह अभिव्यक्ति के रूप में भी कोई स्पष्ट परिभाषा के साथ लिखा जा सकता है:

CustomClass cc = this.files.Find((CustomClass cc2) => cc2.Path == u); 
0

यहाँ एक समाधान है कि मैं प्रयोग किया जाता है।मुझे कई तर्क पारित करने की आवश्यकता थी और कुछ भी ऐसा नहीं करना चाहता था जो मुझे रनटाइम के दौरान विधि को संपादित करने से रोक सके, इसलिए मैं इसके साथ आया।

स्पष्ट रूप से यदि आप चाहते थे कि आप इसे तर्क तर्कों का उपयोग करके एक सामान्य विधि (सही शब्द?) में बदल सकें। यह एक विधि में lambdas की समस्या के आसपास भी हो जाता है। निश्चित नहीं है कि यह अनाम विधियों पर भी लागू होता है या नहीं, लेकिन यह पहले से ही अलग है इसलिए कोई बड़ा सौदा नहीं है।

मुझे नहीं पता कि प्रतिबिंब प्रदर्शन प्रदर्शन करेगा या नहीं।

private Predicate<ItemData> FindItemData(string search, string fieldName) 
{ 
    var field = typeof(ItemData).GetField(fieldName); 
    return delegate(ItemData item) { return (string)field.GetValue(item) == search; }; 
} 

//in another method... 
itemlist.Find(FindItemData(e.Row[2].ToString(), "ItemName")); 
+0

मैं कहूंगा कि मैंने दो बार जांच नहीं की है कि यह मुझे संपादन करने दे, लेकिन अन्यथा यह बहुत अच्छी तरह से काम करता है। –

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