2009-05-12 17 views
22

मैं एक wpf ऐप पर काम कर रहा हूं जिसमें बहुत सारे डेटा (10 000 से 100 000) पंक्तियों के साथ एक सूचीदृश्य शामिल है। उपयोगकर्ता फ़िल्टर सूची को काफी उन्नत (और धीमा) बनाने के लिए इस सूचीदृश्य में सभी प्रकार के फ़िल्टर लागू कर सकता है। अभी के लिए, मेरे कोड के प्रासंगिक हिस्सा इस तरह दिखता है:डेटा के बड़े सेट के साथ WPF का ICollectionView.filter

ICollectionView view = CollectionViewSource.GetDefaultView(hugeList.ItemsSource); 
view.Filter = new Predicate<object>(FilterCallback); 

private bool FilterCallback(object item) 
{ 
    //Filter logic 
} 

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

+0

+1 अच्छा सवाल! आप किस समाधान के साथ आए थे? – gehho

+0

यह संभव है कि प्रदर्शन समस्या ग्रिड बाध्यकारी/प्रतिपादन पक्ष पर है और वास्तविक फ़िल्टर तर्क से संबंधित नहीं है ... – Schneider

उत्तर

20

अपने फ़िल्टर फ़ंक्शन पर ध्यान दें। सुनिश्चित करें कि आप कोई अनावश्यक मुक्केबाजी/अनबॉक्सिंग नहीं कर रहे हैं और आप इसमें व्यापक गणना नहीं कर रहे हैं। आपको ध्यान देना चाहिए कि किस प्रकार का संग्रह दृश्य आप उपयोग कर रहे हैं, कुछ दूसरों की तुलना में तेज़ हैं। Bea's post on sorting से:

  • एक CollectionView अपने स्रोत IEnumerable लागू करता है, तो बनाया जाता है। यदि स्रोत IENumerable केवल लागू करता है, तो आप संग्रह को सॉर्ट या समूह करने में सक्षम नहीं होंगे (आप इसे केवल फ़िल्टर कर सकते हैं)। इसके अलावा, यदि स्रोत में बड़ी संख्या में आइटम हैं या यदि आप गतिशील संचालन जैसे प्रविष्टियां और हटाना करते हैं तो perf सबसे अच्छा नहीं होगा। यदि यह आपका परिदृश्य है, तो आपको अपने स्रोत को एक मजबूत इंटरफेस लागू करने पर विचार करना चाहिए। आईसीओलेक्शन थोड़ा बेहतर है क्योंकि यह एक गिनती संपत्ति प्रदान करता है।

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

  • बाइंडिंगलिस्ट कोलेक्शन व्यू एवलॉन द्वारा बनाए गए दृश्य का प्रकार है जब स्रोत संग्रह IBindingList लागू करता है। यह वह विचार है जिसे हम ADO.NET परिदृश्य में सौदा करते हैं। यह सॉर्टिंग और ग्रुपिंग का समर्थन करता है, लेकिन पारंपरिक फ़िल्टरिंग नहीं। इसकी बजाय, इसमें एक अतिरिक्त कस्टमफिल्टर संपत्ति है जो डेटाव्यू पर फ़िल्टरिंग का प्रतिनिधि है (अधिक जानकारी के लिए ADO.NET पर मेरी पोस्ट देखें)।

रूप @mihi कहा आप एक अलग धागे को छानने किक कर सकते हैं, लेकिन मैं एकाधिक फिल्टर समवर्ती (एक डेटाबेस तालिका में कॉलम) 60 चर के साथ एक वस्तु पर 50,000 आइटम के साथ एक ObservableCollection पर चलने के लिए ~ CollectionViews का इस्तेमाल किया है ध्यान देने योग्य अंतराल के बिना।

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

+2

क्या आप कुछ नमूना कोड जोड़ सकते हैं यह दिखाने के लिए कि आप फ़िल्टरिंग को एक अलग थ्रेड में कैसे स्थानांतरित करेंगे? मुझे यह एक अलग थ्रेड पर काम नहीं कर रहा है। – Luke

+5

@ ब्रायन: मेरे पास एक समान स्थिति है और मैं अपना फ़िल्टर प्रदर्शन सुधारना चाहता हूं। आपने अपने उत्तर में लिखा है कि किसी को 'भविष्यवाणी ' का उपयोग करने से बचना चाहिए क्योंकि इसे मुक्केबाजी/अनबॉक्सिंग संचालन की आवश्यकता है और इसमें रिटर्न प्रकार शामिल नहीं है। वास्तव में उससे आपका क्या मतलब है? इसमें 'बूल' का रिटर्न प्रकार है, और यह' 'अनुमानित होना चाहिए क्योंकि' ListCollectionView' की 'फ़िल्टर' प्रॉपर्टी उस तरह परिभाषित की गई है। क्या इसके आसपास जाने और किसी अन्य फ़िल्टर दृष्टिकोण का उपयोग करने का कोई तरीका है? या आपका इरादा क्या था? हो सकता है कि मैंने इसे गलत समझा ... – gehho

+0

@gehho मुझे लगता है कि मैं उन चीजों के लिए विचारों को फेंक रहा था जो मंदी पैदा कर सकते थे। 100 में से 99 बार यह फ़िल्टरिंग तर्क में कुछ धीमा होने जा रहा है जो समस्या पैदा कर रहा है। –

3

क्या आपने किसी अन्य धागे में फ़िल्टरिंग या प्रेषक का उपयोग करने पर विचार किया है?

WPF Threads: Build more responsive apps with the dispatcher आपको उपलब्ध कुछ थ्रेडिंग विकल्पों का एक अच्छा अवलोकन देता है।

+1

मैंने इसे माना है, लेकिन मैं 'ICollectionView' को एक अलग थ्रेड में एक्सेस नहीं कर सकता यूआई धागा? –

+2

नहीं, लेकिन आप फ़िल्टरिंग तर्क को किसी अन्य थ्रेड में निष्पादित कर सकते हैं और डिस्पैचर का उपयोग करके यूआई थ्रेड पर संग्रह को संशोधित कर सकते हैं। इनवोक –

+1

यहां इस समाधान का एक अच्छा उदाहरण है: http://www.codeproject.com/Articles/32426/Deferring- ListCollectionView-filter-updates-for- –

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