2008-08-28 13 views
17

मैं एक सामान्य शब्दकोश पूछने के लिए LINQ का उपयोग कर रहा हूं और फिर परिणाम को मेरी सूची दृश्य (वेबफॉर्म) के लिए डेटास्रोत के रूप में उपयोग करता हूं।मैं # #सूची में <T> सूची में IENumerable <T> कैसे परिवर्तित कर सकता हूं?

सरलीकृत कोड:

Dictionary<Guid, Record> dict = GetAllRecords(); 
myListView.DataSource = dict.Values.Where(rec => rec.Name == "foo"); 
myListView.DataBind(); 

मैंने सोचा था कि काम करेगा लेकिन वास्तव में यह एक System.InvalidOperationException फेंकता है:

आईडी 'myListView' कोई डेटा स्रोत होना आवश्यक है साथ ListView कि या तो आईसीओलेक्शन लागू करता है या डेटा स्रोत पेजिंग कर सकता है यदि AllowPaging सत्य है।

Dictionary<Guid, Record> dict = GetAllRecords(); 
List<Record> searchResults = new List<Record>(); 

var matches = dict.Values.Where(rec => rec.Name == "foo"); 
foreach (Record rec in matches) 
    searchResults.Add(rec); 

myListView.DataSource = searchResults; 
myListView.DataBind(); 

वहाँ पहले उदाहरण में एक छोटे से पकड़ लिया यह काम करने के लिए है:

आदेश में यह करने के वर्किंग मैं निम्नलिखित का सहारा लेना पड़ा है?

var matches = dict.Values.Where(rec => rec.Name == "foo").ToList(); 

ध्यान रखें कि कि अनिवार्य रूप से हो जाएगा:

+0

यह http://stackoverflow.com/questions/472669/c-freely-convert-between-listt-and-ienumerablet – John

उत्तर

29

इस प्रयास करें (क्या, यह एक के लिए सवाल शीर्षक के रूप में उपयोग और अधिक उपयुक्त कुछ करने के लिए संपादित करने के लिए स्वतंत्र महसूस करने के लिए सुनिश्चित नहीं था) मूल मान संग्रह से एक नई सूची बनाना, और इसलिए आपके शब्दकोश में कोई भी परिवर्तन स्वचालित रूप से आपके बाध्य नियंत्रण में दिखाई नहीं देगा।

1
myListView.DataSource = (List<Record>) dict.Values.Where(rec => rec.Name == "foo"); 
+0

[@lomaxx] (http://stackoverflow.com/ के विपरीत है प्रश्न/31708/कैसे-कर-i-convert-ienumerablet-to-listt-in-C# 31712): आपका पहला समाधान काम नहीं करता है। मैं परिणाम पर कहां से परिणाम कास्ट करने में सक्षम नहीं लग सकता। इसके परिणामस्वरूप निम्न रनटाइम अपवाद होता है: * 'System.Collections.Generic.List'1' [रिकॉर्ड] 'टाइप करने के लिए' d__0'1 [रिकॉर्ड] 'प्रकार का ऑब्जेक्ट डालने में असमर्थ। * आपका दूसरा समाधान शानदार काम करता है और तो [मैट हैमिल्टन्स] (http://stackoverflow.com/questions/31708/how-can-i-convert-ienumerablet-to-listt-in-c#31710) है। मैंने [मैट हैमिल्टन्स] स्वीकार किया है (http://stackoverflow.co –

3

तुम भी कोशिश कर सकते हैं:

var matches = new List<Record>(dict.Values.Where(rec => rec.Name == "foo")); 

मूल रूप से सामान्य संग्रह, बहुत सीधे कास्ट करने के लिए मुश्किल हो जाता है, ताकि आप वास्तव में लेकिन एक नए वस्तु बनाने के लिए थोड़ा विकल्प नहीं है।

9

मैं नए Linq सिंटैक्स का उपयोग पसंद करते हैं:

myListView.DataSource = (
    from rec in GetAllRecords().Values 
    where rec.Name == "foo" 
    select rec).ToList(); 
myListView.DataBind(); 

क्यों आप कुंजी का उपयोग नहीं करते जब आप एक शब्दकोश हो रही है? आप उस ओवरहेड के लिए भुगतान कर रहे हैं।

+0

आपके लिए उपरोक्त। – fuzz

+0

[@ केथ] (http: // stackoverflow।com/प्रश्न/31708/how-can-i-convert-ienumerablet-to-listt-in-C# 32016): मैं अपने कोड में कहीं और शब्दकोश में ग्रिड कुंजी का उपयोग कर रहा हूं, इसलिए मुझे एक रिकॉर्ड प्राप्त हो सकता है रिकॉर्ड आईडी वाक्यविन्यास पर असहमत होने के लिए सहमत हैं;) –

0

बस ज्ञान जोड़ना अगली वाक्य डी डीबी से किसी भी डेटा को पुनर्प्राप्त नहीं करता है। बस केवल क्वेरी बनाएं (इसके लिए यह iqueryable प्रकार है)। इस क्वेरी को लॉन्च करने के लिए आपको अंत में टोलिस्ट() या फर्स्ट() जोड़ना होगा।

dict.Values.Where(rec => rec.Name == "foo")