2009-10-14 12 views
50

Sto utilizzando C# e il targeting per .NET Framework 3.5. Sto cercando un piccolo, succinto ed efficiente codice per copiare tutti gli articoli in un ListBox in un List<String> (List generico).Il modo più succinto per convertire ListBox.it in un elenco generico

Al momento ho qualcosa di simile al codice qui sotto:

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

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

che funziona, ovviamente, ma non posso fare a meno di avere la sensazione che ci deve essere un modo migliore di fare questo con alcune delle nuove funzionalità linguistiche. Stavo pensando a qualcosa come il metodo List.ConvertAll ma questo si applica solo agli elenchi generici e non alle raccolte ListBox.ObjectCollection.

+0

Quali sono gli oggetti nella casella di riepilogo? – stevehipwell

+0

Siamo spiacenti, dovrebbe aver dichiarato esplicitamente che si trattava di stringhe. – jamiei

+0

un metodo di estensione è quello che mi piace – nawfal

risposta

87

Un po 'di LINQ dovrebbe farlo: -

var myOtherList = lbMyListBox.Items.Cast<String>().ToList(); 

Naturalmente è possibile modificare il parametro Type del cast a qualsiasi tipo che avete memorizzato nel Proprietà articoli.

+0

Buona risposta, grazie. – jamiei

+0

È 'Lista Mylist = new List (lbMyListBox.Items.Cast ());' meglio o non fa differenza? La domanda, immagino, è se, in questo modo, eviti la creazione di un'altra lista o meno. – ThunderGr

5

ne dite di questo:

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

Che dire:

myOtherList.AddRange(lbMyListBox.Items); 

EDIT sulla base di commenti e la risposta di DavidGouge:

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

darà il seguente errore: impossibile convertire da 'System.Windows.Forms.ListBox.ObjectCollection' a 'System.Collections.Generic.IEnumerable ' –

+0

ObjectCollection è IEnumerable ma non IEnumerable che è richiesto da AddRange. – AnthonyWJones

+0

questo non mi compila nemmeno per me – nawfal

26

Di seguito lo farà (utilizzando LINQ):

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

Il OfType chiamata sarà assicurati che vengano utilizzati solo gli elementi negli elementi della lista che sono stringhe.

Utilizzando Cast, se uno degli elementi non sono stringhe, si otterrà un'eccezione.

+2

Buono a sapersi! : D – DavidGouge

+1

Ovviamente utilizzando OfType, l'elenco risultante potrebbe contenere elementi. Se il set di elementi dovrebbe essere di un tipo specifico, utilizza Cast perché non nasconde un bug in cui sono stati aggiunti tipi errati al ListBox (operazione semplice).Additionaly OfType salterà gli elementi che hanno un operatore di conversione per il tipo di output previsto mentre Cast invocherà l'operatore del convertitore. – AnthonyWJones

+1

Sì. Avrei dovuto davvero dire "oggetti che non sono applicabili a stringhe". Il problema di OfType è un buon punto, ma se il ListBox dovrebbe contenere solo stringhe, fermerà un crash nel caso in cui qualcos'altro si insinua erroneamente nello – adrianbanks

1

Non hai bisogno di altro. Si ottiene Elenco di tutti i valori da Listbox

private static List<string> GetAllElements(ListBox chkList) 
     { 
      return chkList.Items.Cast<ListItem>().Select(x => x.Value).ToList<string>(); 
     } 
Problemi correlati