2010-02-02 19 views
19

में तत्व जोड़ें मेरे पास एक अवलोकन करने योग्य चयन है, और मैं इसे एक आईएलआईस्ट की सामग्री सेट करना चाहता हूं। अब मैं सिर्फ .. संग्रह का एक नया उदाहरण बना सकते हैं:IList से ObservableCollection

public ObservableCollection<Bar> obs = new ObservableCollection<Bar>(); 
public void Foo(IList<Bar> list) 
{ 
    obs = new ObservableCollection<Bar>(list); 
} 

लेकिन यह कैसे मैं वास्तव में IList की सामग्री लेने के लिए और अपने मौजूदा ObservableCollection में जोड़ सकते हैं? क्या मुझे सभी तत्वों पर लूप करना है, या क्या कोई बेहतर तरीका है? के बाद से कोई AddRangeObservableCollection के लिए बराबर

public void Foo(IList<Bar> list) 
{ 
    foreach (var elm in list) 
     obs.Add(elm); 
} 

उत्तर

39

आप

public void Foo(IList<Bar> list) 
{ 
    list.ToList().ForEach(obs.Add); 
} 

या एक विस्तार पद्धति के रूप में कर सकता है,

public static void AddRange<T>(this ObservableCollection<T> collection, IEnumerable<T> items) 
    { 
     items.ToList().ForEach(collection.Add); 
    }  
+0

Thx! ToList के साथ गया था। अभी के लिए दृष्टिकोण। यदि मुझे इसे एक से अधिक स्थानों की आवश्यकता है तो विस्तार विधि पर विचार करें .. – stiank81

+0

'एन्यूमेरेबल। टॉलिस्ट 'एक्सटेंशन विधि अनिवार्य रूप से एक नई' सूची ' आवंटित करती है। मैं शायद राययल के जवाब की सिफारिश करता हूं। –

+3

@ रिचर्ड - यह सच है हालांकि हुड के तहत यह नई सूची (सूची) करता है - जो आंतरिक रूप से कॉल करता है ((आईसीओलेक्शन ) सूची)। कॉपीो (टी []) जो IList (उदाहरण के लिए ) के अधिकांश कार्यान्वयन में कॉल करता है एक मूल (बाहरी) सरणी प्रति समारोह। यह काफी कुशल होना चाहिए और सदस्यों के पुनरावृत्ति के बजाय आवश्यक संदर्भों की परमाणु प्रति में केवल (अधिकतर) शामिल होना चाहिए। –

1

लूपिंग, एक ही रास्ता है।

8

यदि आप सी # 3 + का उपयोग कर रहे हैं तो आप अपनी खुद की विस्तार विधि लिख सकते हैं।

public static void AddRange<T>(this ObservableCollection<T> coll, IEnumerable<T> items) 
{ 
    foreach (var item in items) 
    { 
     coll.Add(item); 
    } 
} 
+0

एक्सटेंशन विधि विचार –

+1

के लिए +1 माइक्रोसॉफ्ट के [प्रिज्म] (http://compositewpf.codeplex.com/) WPF के लिए प्रोजेक्ट में एक समान एक्सटेंशन विधि शामिल है (हालांकि, उनका संस्करण 'शून्य' के बजाय संग्रह देता है, विधि श्रृंखला का समर्थन करने के लिए)। बस Microsoft.Practices.Composite.dll का संदर्भ लें और 'माइक्रोसॉफ्ट का उपयोग करें। प्रैक्टिस। कॉम्पोजिट;'। – totorocat

0

यहाँ के ObservableCollection<T> के लिए एक वंशज है: यह कोड सुनिश्चित करना है कि यह काम करता है कुछ बुनियादी परीक्षण किया गया है एक संदेश कुशल AddRange जोड़ें, साथ ही इकाई परीक्षण:

ObservableCollection Doesn't support AddRange method, so I get notified for each item added, besides what about INotifyCollectionChanging?

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