2009-10-14 11 views
50

मैं सी # का उपयोग कर रहा हूं और .NET Framework 3.5 को लक्षित कर रहा हूं। मैं ListBox में List<String> (जेनेरिक List) में सभी आइटमों की प्रतिलिपि बनाने के लिए कोड का एक छोटा, संक्षिप्त और कुशल टुकड़ा ढूंढ रहा हूं।ListBox.items को एक सामान्य सूची में बदलने के लिए सबसे संक्षिप्त तरीका

फिलहाल मैं नीचे दिए गए कोड के लिए इसी तरह कुछ है:

 List<String> myOtherList = new List<String>(); 
     // Populate our colCriteria with the selected columns. 

     foreach (String strCol in lbMyListBox.Items) 
     { 
      myOtherList.Add(strCol); 
     } 

कौन सा ज़ाहिर है, काम करता है, लेकिन मैं मदद नहीं कर सकता लेकिन अहसास को महसूस करें कि वहाँ के साथ ऐसा करने का एक बेहतर तरीका होना चाहिए कुछ नई भाषा विशेषताएं। मैं List.ConvertAll विधि की तरह कुछ सोच रहा था लेकिन यह केवल जेनेरिक सूचियों पर लागू होता है और ListBox.ObjectCollection संग्रह नहीं करता है।

+0

सूची बॉक्स में ऑब्जेक्ट्स क्या हैं? – stevehipwell

+0

क्षमा करें - स्पष्ट रूप से कहा जाना चाहिए कि वे स्ट्रिंग्स थे। – jamiei

+0

एक विस्तार विधि है जो मुझे – nawfal

उत्तर

87

LINQ के बारे में थोड़ी यह करना चाहिए: -

var myOtherList = lbMyListBox.Items.Cast<String>().ToList(); 
बेशक

आप जो कुछ भी प्रकार आप में संग्रहीत किए गए करने के लिए कास्ट का प्रकार पैरामीटर संशोधित कर सकते हैं आइटम संपत्ति

+0

अच्छा जवाब, धन्यवाद। – jamiei

+0

'सूची मेरी सूची = नई सूची (lbMyListBox.Items.Cast ()); बेहतर या इससे कोई फर्क नहीं पड़ता? सवाल, मुझे लगता है, अगर ऐसा है, तो आप किसी अन्य सूची के निर्माण से बचें या नहीं। – ThunderGr

5

इस बारे में कैसे:

List<string> myOtherList = (from l in lbMyListBox.Items.Cast<ListItem>() select l.Value).ToList(); 
2

के बारे में क्या:

myOtherList.AddRange(lbMyListBox.Items); 

संपादित करें टिप्पणी के आधार पर और DavidGouge का जवाब:

myOtherList.AddRange(lbMyListBox.Items.Select(item => ((ListItem)item).Value)); 
+0

यह निम्न त्रुटि देगा: 'System.Windows.Forms.ListBox.ObjectCollection' से 'System.Collections.Generic.IEnumerable ' –

+0

ऑब्जेक्ट कोलेक्शन INumerable है लेकिन IENumerable नहीं है जो AddRange द्वारा आवश्यक है। – AnthonyWJones

+0

यह मेरे लिए भी संकलित नहीं करता है – nawfal

26

निम्नलिखित (LINQ का उपयोग कर) यह करना होगा:

List<string> list = lbMyListBox.Items.OfType<string>().ToList(); 

OfType कॉल करेंगे सुनिश्चित करें कि केवल सूची बॉक्स के आइटम्स में आइटम स्ट्रिंग हैं।

Cast का उपयोग करते हुए, यदि कोई आइटम स्ट्रिंग नहीं है, तो आपको अपवाद मिलेगा।

+2

यह जानना अच्छा है! : डी – DavidGouge

+1

निश्चित रूप से ऑफटाइप का उपयोग करके परिणामस्वरूप सूची में आइटम गुम हो सकते हैं। यदि आइटमों का सेट एक विशिष्ट प्रकार के कास्ट होने की उम्मीद है, क्योंकि यह उस बग को छुपाता नहीं है जहां ListBox में गलत प्रकार जोड़े गए हैं (जो करना आसान है)।Additionaly OfType उन आइटम्स को छोड़ देगा जिनके पास रूपांतरण आउटपुट अपेक्षित आउटपुट प्रकार पर होगा जबकि कास्ट कनवर्टर ऑपरेटर का आह्वान करेगा। – AnthonyWJones

+1

हां। मुझे वास्तव में कहा जाना चाहिए "सामान जो तारों के लिए जातिहीन नहीं हैं"। ऑफटाइप मुद्दा एक अच्छा बिंदु है, लेकिन यदि सूची बॉक्स में केवल स्ट्रिंग होनी चाहिए, तो इस मामले में एक क्रैश रुक जाएगा जहां – adrianbanks

1

आपको और आवश्यकता नहीं है। आपको सूची बॉक्स

private static List<string> GetAllElements(ListBox chkList) 
     { 
      return chkList.Items.Cast<ListItem>().Select(x => x.Value).ToList<string>(); 
     } 
संबंधित मुद्दे