के साथ एक अवलोकन संग्रह को सॉर्ट करना मेरे पास एक अवलोकन संग्रह है और मैं इसे linq का उपयोग करके सॉर्ट करता हूं। सबकुछ बढ़िया है, लेकिन मेरी समस्या यह है कि मैं वास्तविक अवलोकन संग्रह को कैसे क्रमबद्ध करूं? इसके बजाय मैं बस कुछ आईनेमरेबल चीज़ों के साथ समाप्त होता हूं और मैं संग्रह को साफ़ करने और सामान को वापस जोड़ना समाप्त करता हूं। यह प्रदर्शन के लिए अच्छा नहीं हो सकता है। क्या किसी को ऐसा करने का बेहतर तरीका पता है?linq
linq
उत्तर
आप सिल्वरलाइट 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 नियंत्रण
ध्यान दें कि लिंक में, आपको अपनी क्वेरी से एक आईनेमरेबल दिया जाता है, और उस क्वेरी ने अभी तक निष्पादित नहीं किया है।
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);
मैं के लिए कुछ इसी तरह के लिए एक आधार के रूप में इस्तेमाल मेरी कोड। मुझे लगता है कि लिंक सुंदर किक-गधे है :) – djcouchycouch
मुझे यकीन नहीं है कि अगर आप डब्लूसीएफ सेवा से ऑब्जर्जेबल कोलेक्शन प्राप्त कर रहे हैं तो यह कितना अच्छा काम करेगा? क्या मुझे क्लाइंट पर एक नया अवलोकन करने योग्य चयन करने की आवश्यकता है और इसे "ऑर्डरबी" लागू करें? - धन्यवाद। – VoodooChild
@ वूडू चिल्ड: यदि आपके पास पहले से ही एक आईनेमरेबल के बजाय एक अवलोकन करने योग्य चयन है, तो SO प्रश्न देखें: http://stackoverflow.com/questions/996126/sorting-an-observable-collection-with-linq –
के बाद से संग्रह नहीं है इसलिए, निम्न कोड केवल क्वेरी एक बार एक 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();
}
मुझे यह मिला सहायक, धन्यवाद! – Masha
यदि आप प्रदर्शन के लिए इस मार्ग पर जा रहे हैं, तो मैं 'var order = list.OrderBy (x => x.SomeProp) का उपयोग करूंगा; list.Clear(); सूची। AddRange (आदेश दिया गया); 'आप अनावश्यक पुनरावृत्ति और ToArray() के निष्पादन से बचेंगे और केवल एक बार AddRange() के दौरान ऐसा करते हैं। (मुझे इसे सत्यापित करने के लिए डिकंपाइल करना होगा, क्योंकि AddRange एक आईनेमरेबल लेता है, यह इसे निष्पादित किए बिना बस स्टोर कर सकता है, और उसके बाद किसी भी सूची-विशिष्ट संचालन को कॉल करने से पहले फ़्लैटेड संग्रह को निष्पादित और संग्रहीत कर सकता है। अंत में समान प्रदर्शन, लेकिन यह बाद में चक्र हिट को तब तक रोक देता है।) – JoeBrockhaus
अवलोकन करने योग्य चयन क्रमबद्ध करने के लिए डिज़ाइन नहीं किए गए हैं। सूची क्रमबद्ध है, और यह अंतर्निहित तंत्र है जिसका उत्तर संदर्भ सूची सूची() द्वारा उपयोग किया जाता है, लेकिन अवलोकन योग्य चयन सूची से नहीं लिया गया है, इसलिए आप वहां भाग्य से बाहर हैं। इमो, "दाएं" समाधान ऑब्जर्जेबल कोलेक्शन को सॉर्ट करने का प्रयास नहीं करना है, लेकिन आईसीओलेक्शन व्यू को लागू करने और उसके नियंत्रण में इसका एक उदाहरण बांधना है। यह इंटरफ़ेस सॉर्टिंग के तरीकों को जोड़ता है और इसमें अतिरिक्त लाभ होता है जिसे सिल्वरलाइट नियंत्रण द्वारा मान्यता प्राप्त है (ठीक है, जो इसे डेटाग्रिड जैसे किसी भी तरह का समर्थन करते हैं) ताकि आपकी सॉर्टिंग सीधे यूआई परत से उपयोग की जा सके। यह सवाल उपयोगी हो सकता है:
व्युत्पन्न मैं लिंक का उल्लेख किया पीछा इस में पोस्ट http://mokosh.co.uk/post/2009/08/04/how-to-sort-observablecollection/comment-page-1/#comment-75
लेकिन मुद्दों सिल्वरलाइट में
काम करने के लिए यह हो रहीमैं जब मैं Terms.Sort फोन (नई TermComparer()) रिकॉर्ड अभी भी यूआई
पर अवर्गीकृत प्रदर्शित कर रहे हैं कुछ सुझाव है कि सकता है क्या गलत हो रहा हो सकता है एक संपत्ति सार्वजनिक SortableObservableCollection शर्तें बनाया।धन्यवाद
आपको नियम-संपत्ति पर एक संपत्ति बदलती घटना को जुटाना होगा – Jack
की संभावित डुप्लिकेट [क्रमबद्ध ObservableCollection सी #] (http://stackoverflow.com/questions/19112922/sort-observablecollectionstring-c-sharp) –