2008-08-14 17 views
6

तो डब्ल्यूपीएफ कंपोजिट कोलेक्शन के विचारों के लिए मानक सॉर्टिंग या फ़िल्टरिंग व्यवहार का समर्थन नहीं करता है, इसलिए इस समस्या को हल करने के लिए सबसे अच्छा अभ्यास क्या होगा।एक समग्र संग्रह को छंटाई

विभिन्न प्रकार के दो या अधिक ऑब्जेक्ट संग्रह हैं। आप उन्हें एक क्रमबद्ध और फ़िल्टर करने योग्य संग्रह में जोड़ना चाहते हैं (मैन्युअल रूप से सॉर्ट या फ़िल्टर को कार्यान्वित करने के साथ)।

मैंने जिन दृष्टिकोणों पर विचार किया है उनमें से एक है केवल कुछ मूल गुणों के साथ एक नया ऑब्जेक्ट संग्रह बनाना, जिसमें मैं संग्रह को सॉर्ट करना चाहता हूं, और प्रत्येक प्रकार का ऑब्जेक्ट उदाहरण शामिल हूं।

class MyCompositeObject 
{ 
    enum   ObjectType; 
    DateTime  CreatedDate; 
    string   SomeAttribute; 
    myObjectType1 Obj1; 
    myObjectType2 Obj2; 
{ 
class MyCompositeObjects : List<MyCompositeObject> { } 

और फिर नया संयुक्त संग्रह बनाने के लिए मेरे दो ऑब्जेक्ट संग्रहों के माध्यम से लूप करें। जाहिर है यह एक क्रूर बल विधि का एक सा है, लेकिन यह काम करेगा। मुझे अपने नए समग्र ऑब्जेक्ट संग्रह पर सभी डिफ़ॉल्ट दृश्य सॉर्टिंग और फ़िल्टरिंग व्यवहार मिलेंगे, और मैं उस सूची आइटम को वास्तव में उस समग्र आइटम में संग्रहीत करने के आधार पर अपनी सूची आइटम को सही तरीके से प्रदर्शित करने के लिए डेटा टेम्पलेट डाल सकता हूं।

इसे और अधिक सुरुचिपूर्ण तरीके से करने के लिए क्या सुझाव हैं?

उत्तर

1

अपडेट:: अपने कस्टम फिल्टर समारोह के साथ

उपयोग List<T>.FindAll(Predicate<T> match)

class MyCompositeObject 
{ 
    DateTime CreatedDate; 
    string  SomeAttribute; 
    Object  Obj1; 
{ 
class MyCompositeObjects : List<MyCompositeObject> { } 

मैंने पाया कि प्रतिबिंब के कारण, विशिष्ट obj1 में संग्रहीत प्रकार है: मैं एक बहुत अधिक सुरुचिपूर्ण समाधान पाया रनटाइम पर हल किया गया और टाइप विशिष्ट डेटा टेम्पलेट को अपेक्षित के रूप में लागू किया गया है!

1

"ब्रूट फोर्स" विधि जिसका आप उल्लेख करते हैं वह वास्तव में आदर्श समाधान है। आपको याद है, सभी ऑब्जेक्ट्स रैम में हैं, कोई I/O बाधा नहीं है, इसलिए आप किसी भी आधुनिक कंप्यूटर पर एक सेकंड से भी कम समय में लाखों ऑब्जेक्ट्स को बहुत अधिक सॉर्ट और फ़िल्टर कर सकते हैं।

संग्रह के साथ काम करने के लिए सबसे खूबसूरत तरीका .NET में System.Linq नाम स्थान 3,5

धन्यवाद है - मैं भी वस्तुओं के लिए LINQ करार दिया, लेकिन मेरी चिंता का विषय है वहाँ नुकसान लचीलेपन का लिखे गए डेटा के लिए है टेम्पलेट्स, जिन्हें मुझे अपनी सूची में ऑब्जेक्ट्स प्रदर्शित करने की आवश्यकता है।

आप इस पल में अनुमान नहीं लगा सकते हैं कि कैसे लोगों को सॉर्ट और अपने ऑब्जेक्ट संग्रह फिल्टर करेगा, तब तुम System.Linq.Expressions पर नाम स्थान दिखना चाहिए जब आप पहली बार रनटाइम के दौरान मांग पर अपने लैम्ब्डा भाव का निर्माण करने (उपयोगकर्ता को अभिव्यक्ति बनाने के लिए, फिर संकलित करें, चलाएं और अंत में आप परिणामों के माध्यम से गणना करने के लिए प्रतिबिंब नामस्थान का उपयोग करें)। अपने सिर को इसके चारों ओर लपेटना और मुश्किल बात है, संभवतः (मुझे निश्चित रूप से) LINQ से भी अधिक ग्राउंड ब्रेकिंग सुविधा।

+0

लुब्स: धन्यवाद - मैंने LINQ को ऑब्जेक्ट्स भी माना है, लेकिन मेरी चिंता में टाइप किए गए डेटा टेम्पलेट्स के लिए लचीलापन का नुकसान है, जिसे मुझे अपनी सूची में ऑब्जेक्ट्स प्रदर्शित करने की आवश्यकता है। –

1

मैं अभी तक WPF से बहुत परिचित नहीं हूं लेकिन मैं इसे List<T> संग्रहों को सॉर्ट और फ़िल्टर करने के बारे में एक प्रश्न के रूप में देखता हूं।

(भीतर मैन्युअल तरह या फिल्टर लागू करने के लिए होने)

आप अपने खुद के प्रकार या फिल्टर कार्यों को लागू करने पर पुनर्विचार होगा? मेरे अनुभव में उपयोग करना आसान है। नीचे दिए गए उदाहरण एक अज्ञात प्रतिनिधि का उपयोग करते हैं लेकिन आप एक जटिल प्रकार या फ़िल्टर को लागू करने के लिए आसानी से अपनी विधि या कक्षा को परिभाषित कर सकते हैं। इस तरह के वर्ग में गुणों को कॉन्फ़िगर और बदलने और गतिशील रूप से फ़िल्टर करने के लिए गुण भी हो सकते हैं।

// Sort according to the value of SomeAttribute 
List<MyCompositeObject> myList = ...; 
myList.Sort(delegate(MyCompositeObject a, MyCompositeObject b) 
{ 
    // return -1 if a < b 
    // return 0 if a == b 
    // return 1 if a > b 
    return a.SomeAttribute.CompareTo(b.SomeAttribute); 
}; 

सूची से आइटम की एक उप-संग्रह प्राप्त करने के लिए एक समान दृष्टिकोण: अपने कस्टम के साथ

उपयोग List<T>.Sort(Comparison<T> comparison) समारोह की तुलना करें।

// Select all objects where myObjectType1 and myObjectType2 are not null 
myList.FindAll(delegate(MyCompositeObject a) 
{ 
    // return true to include 'a' in the sub-collection 
    return (a.myObjectType1 != null) && (a.myObjectType2 != null); 
} 
+0

ब्रायन: एक बार MyCompositeObject बनाया गया है, तो मुझे ICollectionView के हिस्से के रूप में सॉर्टिंग और फ़िल्टरिंग मिलती है .. समस्या का क्रूक्स अलग ऑब्जेक्ट प्रकार संग्रह से निपट रहा है और उन्हें एक संग्रह के रूप में व्यवहार कर रहा है। समग्र संग्रह संग्रह बनाने के लिए उत्तर हैं, लेकिन सॉर्टिंग फ़िल्टरिंग नहीं। –

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