2009-09-23 24 views
53

तथ्य यह है कि यह एक LINQ परिणाम है, शायद इस प्रश्न के लिए प्रासंगिक नहीं हो सकता है, लेकिन मैं इसका उल्लेख कर रहा हूं - क्योंकि यह संदर्भ है जिसके परिणामस्वरूप इस सवाल का परिणाम हुआ है।कास्ट LINQ परिणाम अवलोकन करने योग्य चयन

मैं एक LINQ क्वेरी चलाता हूं। नतीजा एक है;

IEnumerable<MyClass> 

मैं परिणाम को एक पर्यवेक्षण चयन में रखना चाहता हूं;

ObservableCollection<MyClass> 

मैं यह कलाकार कैसे करूं? (IENumerable के माध्यम से चलने और पर्यवेक्षण चयन में तत्वों की प्रतिलिपि के बिना)। मुझे पता है कि LINQ के पास कुछ ..() फ़ंक्शंस हैं, लेकिन ऐसा लगता है कि यह इस कलाकार के लिए मेरी मदद नहीं करता ..?

उत्तर

91

बस का उपयोग करें:

ObservableCollection<Foo> x = new ObservableCollection<Foo>(enumerable); 

कि आवश्यक नकल करेंगे। लाइव क्वेरी में बदलावों का निरीक्षण करने का कोई तरीका नहीं है - हालांकि ObservableQuery<T> का विचार एक दिलचस्प (हालांकि चुनौतीपूर्ण) है।

आप एक विस्तार विधि यह करने के लिए चाहते हैं, यह आसान है:

public static ObservableCollection<T> ToObservableCollection<T> 
    (this IEnumerable<T> source) 
{ 
    if (source == null) 
    { 
     throw new ArgumentNullException("source"); 
    } 
    return new ObservableCollection<T>(source); 
} 
+4

कोई भी अब सिल्वरलाइट 3.0 में इसे कैसे प्राप्त करें, जहां केवल डिफ़ॉल्ट नया ऑब्जर्जेबल कोलेक्शन () कन्स्ट्रक्टर उपलब्ध है? –

+0

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

+0

@ न्यूट्रीनो: मैं तर्क दूंगा कि प्रश्न में प्रस्तुत किए गए एक की तुलना में यह एक अलग समस्या है। यह एक वैध समस्या है, मुझे नहीं लगता कि यह ओपी था। –

10

आप इस के लिए एक ObservableCollectionconstructor उपयोग कर सकते हैं:

ObservableCollection<MyClass> obsCol = 
     new ObservableCollection<MyClass>(myIEnumerable); 
13
var linqResults = foos.Where(f => f.Name == "Widget"); 

var observable = new ObservableCollection<Foo>(linqResults); 
0

IEnumerable केवल इंटरफेस है।

आपको सामग्री को IENumerable से ऑब्जर्जेबल कोलेक्शन में कॉपी करने की आवश्यकता होगी। जब आप एक नया

0

बनाते हैं तो मैंने कुछ वर्षों पहले इस लाइब्रेरी को लिखा था जब आप अपने IENumerable को ObersvableCollection के निर्माता में पास कर सकते हैं।

https://github.com/wasabii/OLinq

यह वास्तव में क्या आप शायद चाहते हैं नहीं है, यह अधिक है। यह एक लिंक क्वेरी प्रदाता है जो अभिव्यक्ति वृक्ष को पार करता है, संदर्भित संग्रह से जुड़ा हुआ है, और एक और संग्रह का खुलासा करता है जो परिवर्तनों पर घटनाओं को उत्सर्जित करता है।

इसमें कुछ लिंक ऑपरेटर गायब हैं। लेकिन कोड बेस का विस्तार करना मुश्किल नहीं है।

+0

मैं इसके लिए NuGet पैकेज भी बनाए रख रहा हूं। https: //www.nuget।संगठन/पैकेज/OLinq/ – wasabi

+0

मैं आपके पैकेज का उपयोग करना चाहता था, लेकिन रीडेमे में प्रदान किया गया उदाहरण काम नहीं कर रहा है, 'कहां अज्ञात है' –

+1

के बाद 'ToObservableView' को कॉल करें README के ​​बारे में सुनिश्चित नहीं है। ऐसा लगता है कि किसी ने अतीत में इसे मक्का दिया था। एक IQueryable लौटाता है। लेकिन वास्तविक वस्तु एक ObservableQuery है। मेरे पास कास्ट करने के लिए AsObservableQuery() विधि है। > collection.AsObservableQuery()। जहां (i => i> 2) .sObservableQuery()। ToObservableView() विपरीत नहीं .अनुक्रमित और AsParallelQuery और उन सभी अन्य। – wasabi

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