2013-07-29 3 views
10

Как я могу отличить ListView.Items до List<string>?Список ListView Items to List <string>?

Это то, что я пробовал:

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

, но я получил эту ошибку:

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

ответ

28

ListViewItemCollection это именно то, что это звучит как - совокупность ListViewItem элементов. Это не коллекция строк. Ваш код не во время выполнения по той же причине, что этот код потерпит неудачу во время компиляции:

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

Если вы хотите получить список строк, каждый из которых берутся из Text имущества ListViewItem, вы можете сделать что легко:

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

Почему я могу видеть только имя файла, а не весь путь? – user2214609

+2

@ user2214609: Я понятия не имею, учитывая, что мы даже не знали, что в «ListView» содержатся имена файлов. Похоже, вы должны спросить об этом в качестве отдельного вопроса - содержимое свойства «Text» в элементе «ListViewItem», заполненном именем файла, является очень важным для преобразования коллекции значений ListViewItem в ' Список '. –

+0

Что я могу сделать, если у меня нет функций Cast или каких-либо функций LINQ? (Проект WinForm) –

5

Метод Cast существенно попытаться выполнить ящик/распаковывать, так что это не сработает, если пункты в списке уже нет строк. Попробуйте вместо этого:

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

Или это

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

ваш первый пример не даст вам список, где каждый элемент является строка «System.Windows.Forms. ListViewItem "? –

+0

Похоже, что это даст «ListViewItem: {текст здесь}» – Blorgbeard

+0

@AdamV Я не уверен, что вернется «ListViewItem.ToString» (вот почему я дал альтернативное решение). 'ListViewItem' делает [переопределяет' ToString'] (http://msdn.microsoft.com/en-us/library/9syath98.aspx), поэтому я предполагаю, что он делает что-то немного больше, чем просто возвращает его собственное имя типа. –

4

Попробуйте что-то вроде этого

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

@Downvoter не забудьте прокомментировать –

3

Попробуйте это с помощью Select метод:

для списка текста:

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

для значений списка:

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

Или, может быть, для обоих:

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