एक समग्र संग्रह छंटनी

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

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

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

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

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

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

0
ro fr bn

3 उत्तर

अद्यतन: मुझे एक और अधिक सुरुचिपूर्ण समाधान मिला:

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

मैंने पाया कि प्रतिबिंब के कारण, ओबीजे 1 में संग्रहीत विशिष्ट प्रकार रनटाइम पर हल किया गया है और प्रकार के विशिष्ट डेटा टेम्पलेट को अपेक्षित के रूप में लागू किया गया है!

0
जोड़ा

I'm not yet very familiar with wpf but I see this as a question about sorting and filtering List collections.

(सॉर्ट या फ़िल्टर मैन्युअल रूप से कार्यान्वित करने के साथ)

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

Use List.Sort(Comparison comparison) with your custom compare function:

// Sort according to the value of SomeAttribute
List 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);
};

सूची से वस्तुओं का उप-संग्रह प्राप्त करने के लिए एक समान दृष्टिकोण।

Use List.FindAll(Predicate match) with your custom filter function:

// 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 के हिस्से के रूप में सॉर्टिंग और फ़िल्टरिंग मिलती है .. समस्या का क्रूक्स अलग ऑब्जेक्ट प्रकार संग्रह से निपट रहा है और उन्हें एक संग्रह के रूप में व्यवहार कर रहा है। समग्र संग्रह संग्रह बनाने के लिए उत्तर हैं, लेकिन सॉर्टिंग फ़िल्टरिंग नहीं।
जोड़ा लेखक Christopher Scott, स्रोत

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

संग्रह के साथ काम करने का सबसे शानदार तरीका System.Linq नामस्थान .NET 3.5 में है

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

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

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