2010-07-27 15 views
7

तो, मैं अपने आराम क्षेत्र से बाहर एक सा कर रहा हूँ जब समारोह <>, जेनेरिक्स और लैम्ब्डा भाव के साथ काम कर लेकिन मुझे लगता है मैं सामान्य विचार (तरह), लेकिन अभी भी एक सा भ्रमित हो।सी # समारोह <> और जेनरिक

मैं SortableObservableCollection वर्ग को क्रियान्वित किया है (ऑनलाइन कहीं से लिया - जो कोई भी यह मैं इसे से मिल गया था करने के लिए धन्यवाद!) और इसे इस तरह प्रयोग किया जाता है:

_lookuplistViewModel.Sort(x => x.BrandName, ListSortDirection.Ascending); 

जहां x ऑब्जेक्ट प्रकार द्वारा कार्यान्वित किया जाता है क्रमबद्ध संग्रह। इस उदाहरण में, ब्रांडनाम लागू ऑब्जेक्ट के प्रकार की एक संपत्ति है, लेकिन मैं उपरोक्त कोड को सामान्य वर्ग में उपयोग करना चाहता हूं और उस संपत्ति में पास करना चाहता हूं जिस पर सॉर्ट करना है। क्रमबद्ध विधि इस प्रकार है:

public void Sort<TKey>(Func<T, TKey> keySelector, ListSortDirection direction) 
{ 
    switch (direction) 
    { 
    case ListSortDirection.Ascending: 
     { 
     ApplySort(Items.OrderBy(keySelector)); 
     break; 
     } 
    case System.ComponentModel.ListSortDirection.Descending: 
     { 
     ApplySort(Items.OrderByDescending(keySelector)); 
     break; 
     } 
    } 
} 

सामान्य वर्ग जिस पर क्रमबद्ध विधि कहा जाता है इस तरह परिभाषित किया गया है:

public class ExtendedLookupManagerViewModel<VMod, Mod> : LookupManagerViewModel 
where VMod : ExtendedLookupViewModel 
where Mod : ExtendedLookupModelBase 

और मैं इस तरह यह का एक उदाहरण बनाने के लिए करना चाहते हैं:

_medProd = new ExtendedLookupManagerViewModel<MedicinalProductViewModel, MedicinalProduct>(string property); 

जहां property वह संपत्ति है जिस पर सॉर्ट करना है। आदर्श रूप से यह सुरक्षित होना चाहिए, लेकिन एक स्ट्रिंग पर्याप्त होगा।

क्या कोई मुझे सही दिशा में चलाने में मदद कर सकता है?

+3

मैं lambdas और जेनरिक के साथ सुंदर ठीक हूँ, लेकिन मैं समझ नहीं क्या आप पूछ रहे हैं, आपके द्वारा पोस्ट किए गए कोड की पहली पंक्ति वह है जो आप अपनी आवश्यकताओं के विवरण से पूछ रहे हैं, लेकिन आपके कन्स्ट्रक्टर सिग के बारे में आप जो भी बात कर रहे हैं उसके साथ कुछ लेना देना प्रतीत नहीं होता है। मैं बहुत असमंजस में हूँ। आप अपना संग्रह किस प्रकार क्रमबद्ध करने की कोशिश कर रहे हैं? –

+0

आप बिल्कुल सही हैं, पहली पंक्ति काम करती है, लेकिन केवल अगर मैं जेनेरिक का उपयोग करने के बजाय विस्तारित लुकअप मैनेजर व्यूमोडेल से व्युत्पन्न एक विशिष्ट प्रकार का उपयोग करता हूं। BrandName MedicinalProductViewModel पर एक प्रॉपर्टी है, लेकिन यदि मैं किसी अन्य प्रकार का उपयोग करता हूं तो मुझे किसी अन्य प्रॉपर्टी का उपयोग करने में सक्षम होना चाहिए। मुझे लगता है कि सवाल यह है कि मैं x.brandName के बजाय पास पैरामीटर का उपयोग कैसे कर सकता हूं।उम्मीद है कि यह थोड़ा स्पष्ट बनाता है? – pilsdumps

उत्तर

2

बस अपने कन्स्ट्रक्टर सिग को सॉर्ट विधि के लिए सिग से मेल करें, और सॉर्ट() को कॉल करते समय संग्रह में उपयोग करने के लिए पैरा को कैश करें। तो "स्ट्रिंग प्रॉपर्टी" नहीं बल्कि बल्कि सिग विधि के लिए जो कुछ भी है।

पारित कर दिया पैरामीटर फिर एक समारोह है कि प्रकार विशिष्ट है और तत्व में आप निर्देशन हो सकता है हो सकता है, इन्स्टेन्शियशन होगा

_medProd = new ExtendedLookupManagerViewModel<MedicinalProductViewModel, MedicinalProduct>(x => x.BrandName, ListSortDirection.Ascending); 
+0

धन्यवाद दोस्तों, समस्या हल हो गई, और हिंडसाइट में मैं एक मपेट हूं। मैंने फनक सॉर्टबी विस्तारित लुकअप मैनेजर व्यू मॉडेल के निर्माता में जोड़ा, और इसे ऊपर जिमी द्वारा वर्णित के रूप में बुलाया। अब सॉर्ट करने के लिए कॉल _lookuplistViewModel.Sort (_sortby, ListSortDirection.Ascending) है; फिर से धन्यवाद। – pilsdumps

1

ठीक है, आपके क्रमबद्ध विधि TKey में केवल सामान्य है - टी जहां से आता है? मुझे संदेह है कि यह Func<VMod, TKey> या Func<Mod, TKey> होना चाहिए, लेकिन मुझे यह पता नहीं है कि आपने जो दिखाया है उससे।

MedicinalProductViewModel या MedicinalProduct की संपत्ति होगी? मान लिया जाये कि यह MedicinalProduct है, अपने विधि घोषित किया जाना चाहिए के रूप में:

public void Sort<TKey>(Func<Mod, TKey> keySelector, ListSortDirection direction) 

उस समय मैं यह काम करेंगे ... शक

+0

टी SortableObservableCollection का प्रकार है (पब्लिक क्लास SortableObservableCollection : ObservableCollection )। ब्रैंडनाम दोनों की संपत्ति है क्योंकि वीएमओडी एक व्यूमोडेल रैपिंग मॉड (मॉडल) है। समस्या यह है कि ब्रांड नाम एक विशिष्ट प्रकार (यानी औषधीय प्रोडक्ट व्यू मॉडेल) की एक संपत्ति है, इसलिए मुझे सॉर्ट विधि चलाने के लिए इस ऑब्जेक्ट प्रकार का उपयोग करना होगा। मैं विस्तारित लुकअप व्यू मॉडेल से व्युत्पन्न किसी भी प्रकार का उपयोग करने में सक्षम होना चाहता हूं और ब्रैंडनाम के बजाय सॉर्ट करने के लिए प्रॉपर्टी निर्दिष्ट करना चाहता हूं लेकिन मुझे नहीं पता कि मेरे पास पैरामीटर के साथ x.brandName को कैसे बदला जाए। – pilsdumps

+0

@pilsdumps: लेकिन आप 'SortableObservableCollection ' पर सॉर्ट नहीं कर रहे हैं - आप इसे 'एक्सटेंडेड लुकअप मैनेजर व्यूमोडेल ' पर कॉल कर रहे हैं। क्या आपने सुझाए गए परिवर्तन की कोशिश की है? (शायद 'मॉड' के बजाए' वीएमओडी 'का उपयोग कर रहे हैं?) –

2

आप एक स्ट्रिंग संपत्ति तर्क को स्वीकार नहीं किया जाना चाहिए, बल्कि एक Func<T, IComparable> जहां टी शायद या तो VMod या Mod है, जो आप सॉर्ट करने का प्रयास कर रहे हैं उसके आधार पर।

+0

ठीक है, मैंने इसे माना होगा, लेकिन मुझे यकीन है कि मैं इसे कैसे पास करूंगा। मुझे लगता है कि टीके पर टीके की कुंजी (संपत्ति) है, इसलिए मैं इसे करने के बारे में कैसे जाउंगा? _medProd = new ExtendedLookupManagerViewModel (Func pilsdumps

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