2013-07-29 16 views
10

Come posso trasmettere ListView.Items a List<string>?Cast ListView Elementi da elencare <string>?

questo è ciò che ho provato:

List<string> list = lvFiles.Items.Cast<string>().ToList(); 

ma ho ricevuto questo errore:

Unable to cast object of type 'System.Windows.Forms.ListViewItem' to type 'System.String'.

risposta

28

Un ListViewItemCollection è esattamente quello che sembra - una raccolta di ListViewItem elementi. È non una raccolta di stringhe. Il tuo codice non riesce al momento dell'esecuzione per la stessa ragione che questo codice fallirebbe in fase di compilazione:

ListViewItem item = lvFiles.Items[0]; 
string text = (string) item; // Invalid cast! 

Se si desidera un elenco di stringhe, ciascuna delle quali è preso dal Text proprietà di un ListViewItem, si può fare così facilmente:

List<string> list = lvFiles.Items.Cast<ListViewItem>() 
           .Select(item => item.Text) 
           .ToList(); 
+0

Perché posso vedere solo il nome del file invece dell'intero percorso? – user2214609

+2

@ user2214609: Non ne ho idea, dato che non sapevamo nemmeno che il 'ListView' conteneva nomi di file. Sembra che dovresti chiedertelo come una domanda a parte - il contenuto della proprietà 'Text' su un' ListViewItem' che è popolato con un nome file è una questione * molto * diversa dalla conversione di una raccolta di valori 'ListViewItem' in un' Lista '. –

+0

Cosa posso fare se non ho affatto funzioni di Cast o LINQ? (Progetto WinForm) –

5

Procedimento Cast sarà essenzialmente tenta di eseguire una scatola/Unbox, così sarà sicuro se gli articoli nella lista non sono già stringhe. Prova a modificare:

List<string> list = lvFiles.Items.Cast<ListViewItem>() 
           .Select(x => x.ToString()).ToList(); 

O questo

List<string> list = lvFiles.Items.Cast<ListViewItem>() 
           .Select(x => x.Text).ToList(); 
+0

Will not tuo primo esempio vi darà una lista in cui ogni elemento è la stringa "System.Windows.Forms. ListViewItem "? –

+0

Sembra che darà "ListViewItem: {text here}" – Blorgbeard

+0

@AdamV Non sono sicuro in cima alla testa cosa restituirà 'ListViewItem.ToString' (motivo per cui ho fornito la soluzione alternativa). 'ListViewItem' fa [override' ToString'] (http://msdn.microsoft.com/en-us/library/9syath98.aspx) quindi presumo che faccia qualcosa di più di un semplice ritorno del proprio tipo di nome. –

4

provare qualcosa di simile

List<string> list = lvFiles.Items.Cast<ListViewItem>().Select(x=> x.ToString()).ToList(); 
+0

@Downvoter non dimenticare di commentare –

3

Prova questa utilizzando il metodo Select:

per la lista di testo:

List<string> listText = lvFiles.Items.Select(item => item.Text).ToList(); 

per i valori della lista:

List<string> listValues = lvFiles.Items.Select(item => item.Value).ToList(); 

O forse, per entrambi:

Dictionary<string, string> files = lvFiles.Items.ToDictionary(key => key.Value, item => item.Text);