linq

2009-06-15 11 views
20

के साथ एक अवलोकन संग्रह को सॉर्ट करना मेरे पास एक अवलोकन संग्रह है और मैं इसे linq का उपयोग करके सॉर्ट करता हूं। सबकुछ बढ़िया है, लेकिन मेरी समस्या यह है कि मैं वास्तविक अवलोकन संग्रह को कैसे क्रमबद्ध करूं? इसके बजाय मैं बस कुछ आईनेमरेबल चीज़ों के साथ समाप्त होता हूं और मैं संग्रह को साफ़ करने और सामान को वापस जोड़ना समाप्त करता हूं। यह प्रदर्शन के लिए अच्छा नहीं हो सकता है। क्या किसी को ऐसा करने का बेहतर तरीका पता है?linq

+0

की संभावित डुप्लिकेट [क्रमबद्ध ObservableCollection सी #] (http://stackoverflow.com/questions/19112922/sort-observablecollectionstring-c-sharp) –

उत्तर

15

आप सिल्वरलाइट 3.0 का उपयोग कर रहे हैं, तो CollectionViewSource तो का उपयोग कर स्पष्ट तरीका है। उदाहरण नीचे देखें: (यह XAML के माध्यम से किया जा सकता है साथ ही साथ)

ObservableCollection<DateTime> ecAll = new ObservableCollection<DateTime>(); 
CollectionViewSource sortedcvs = new CollectionViewSource(); 
sortedcvs.SortDescriptions.Add(new System.ComponentModel.SortDescription("Date", 
    System.ComponentModel.ListSortDirection.Ascending)); 
sortedcvs.Source = ecAll; 
ListBoxContainer.DataContext = sortedcvs; 

और इसी XAML में ListBox के लिए निर्धारित

ItemsSource="{Binding}" 

या किसी ItemsControl नियंत्रण

3

ध्यान दें कि लिंक में, आपको अपनी क्वेरी से एक आईनेमरेबल दिया जाता है, और उस क्वेरी ने अभी तक निष्पादित नहीं किया है।

var query = from x in Data 
      where x.Tag == "Something" 
      select x; 

foreach(var item in query) 
    MyObservableCollection.Add(item); 

IEnumerable पर "OrderBy" विस्तार पर एक नज़र डालें:

foreach(var item in query.OrderBy(x => x.Name)) 
    MyObservableCollection.Add(item); 
+0

मैं के लिए कुछ इसी तरह के लिए एक आधार के रूप में इस्तेमाल मेरी कोड। मुझे लगता है कि लिंक सुंदर किक-गधे है :) – djcouchycouch

+0

मुझे यकीन नहीं है कि अगर आप डब्लूसीएफ सेवा से ऑब्जर्जेबल कोलेक्शन प्राप्त कर रहे हैं तो यह कितना अच्छा काम करेगा? क्या मुझे क्लाइंट पर एक नया अवलोकन करने योग्य चयन करने की आवश्यकता है और इसे "ऑर्डरबी" लागू करें? - धन्यवाद। – VoodooChild

+0

@ वूडू चिल्ड: यदि आपके पास पहले से ही एक आईनेमरेबल के बजाय एक अवलोकन करने योग्य चयन है, तो SO प्रश्न देखें: http://stackoverflow.com/questions/996126/sorting-an-observable-collection-with-linq –

8

के बाद से संग्रह नहीं है इसलिए, निम्न कोड केवल क्वेरी एक बार एक ObservableCollection में जोड़ने के लिए चलाता है, Sort तंत्र प्रदान करें, यह शायद सबसे व्यावहारिक विकल्प है। आप Move आदि का उपयोग करके मैन्युअल रूप से एक प्रकार को कार्यान्वित कर सकते हैं, लेकिन यह संभवतः इस तरह से करने से धीमा होगा।

var arr = list.OrderBy(x => x.SomeProp).ToArray(); 
    list.Clear(); 
    foreach (var item in arr) { 
     list.Add(item); 
    } 

साथ ही, आप किसी भी UI तत्व अनबाइंडिंग (या तो दृष्टिकोण के माध्यम से), जबकि छँटाई पर विचार हो सकता है कि आप केवल एक बार फिर से बाँध के लिए भुगतान:

दिलचस्प बात यह है कि अगर यह BindingList<T> था, तो आप RaiseListChangedEvents इस्तेमाल कर सकते हैं कम करने के लिए अधिसूचनाओं की संख्या:

var arr = list.OrderBy(x => x).ToArray(); 
    bool oldRaise = list.RaiseListChangedEvents; 
    list.RaiseListChangedEvents = false; 
    try { 
     list.Clear(); 
     foreach (var item in arr) { 
      list.Add(item); 
     } 
    } finally { 
     list.RaiseListChangedEvents = oldRaise; 
     if (oldRaise) list.ResetBindings(); 
    } 
+0

मुझे यह मिला सहायक, धन्यवाद! – Masha

+0

यदि आप प्रदर्शन के लिए इस मार्ग पर जा रहे हैं, तो मैं 'var order = list.OrderBy (x => x.SomeProp) का उपयोग करूंगा; list.Clear(); सूची। AddRange (आदेश दिया गया); 'आप अनावश्यक पुनरावृत्ति और ToArray() के निष्पादन से बचेंगे और केवल एक बार AddRange() के दौरान ऐसा करते हैं। (मुझे इसे सत्यापित करने के लिए डिकंपाइल करना होगा, क्योंकि AddRange एक आईनेमरेबल लेता है, यह इसे निष्पादित किए बिना बस स्टोर कर सकता है, और उसके बाद किसी भी सूची-विशिष्ट संचालन को कॉल करने से पहले फ़्लैटेड संग्रह को निष्पादित और संग्रहीत कर सकता है। अंत में समान प्रदर्शन, लेकिन यह बाद में चक्र हिट को तब तक रोक देता है।) – JoeBrockhaus

3

अवलोकन करने योग्य चयन क्रमबद्ध करने के लिए डिज़ाइन नहीं किए गए हैं। सूची क्रमबद्ध है, और यह अंतर्निहित तंत्र है जिसका उत्तर संदर्भ सूची सूची() द्वारा उपयोग किया जाता है, लेकिन अवलोकन योग्य चयन सूची से नहीं लिया गया है, इसलिए आप वहां भाग्य से बाहर हैं। इमो, "दाएं" समाधान ऑब्जर्जेबल कोलेक्शन को सॉर्ट करने का प्रयास नहीं करना है, लेकिन आईसीओलेक्शन व्यू को लागू करने और उसके नियंत्रण में इसका एक उदाहरण बांधना है। यह इंटरफ़ेस सॉर्टिंग के तरीकों को जोड़ता है और इसमें अतिरिक्त लाभ होता है जिसे सिल्वरलाइट नियंत्रण द्वारा मान्यता प्राप्त है (ठीक है, जो इसे डेटाग्रिड जैसे किसी भी तरह का समर्थन करते हैं) ताकि आपकी सॉर्टिंग सीधे यूआई परत से उपयोग की जा सके। यह सवाल उपयोगी हो सकता है:

Silverlight and icollectionview

0

व्युत्पन्न मैं लिंक का उल्लेख किया पीछा इस में पोस्ट http://mokosh.co.uk/post/2009/08/04/how-to-sort-observablecollection/comment-page-1/#comment-75

लेकिन मुद्दों सिल्वरलाइट में

काम करने के लिए यह हो रही

मैं जब मैं Terms.Sort फोन (नई TermComparer()) रिकॉर्ड अभी भी यूआई

पर अवर्गीकृत प्रदर्शित कर रहे हैं कुछ सुझाव है कि सकता है क्या गलत हो रहा हो सकता है एक संपत्ति सार्वजनिक SortableObservableCollection शर्तें बनाया।धन्यवाद

+0

आपको नियम-संपत्ति पर एक संपत्ति बदलती घटना को जुटाना होगा – Jack

0

मैं CodePlex पर इस पाया:

Sorted Collections

अभी तक हालांकि यह उपयोग नहीं किया है।

रिक

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