Список элементов ListView для списка <string>?
Как мне сделать ListView.Items
на List<string>
?
Это то, что я пробовал:
List<string> list = lvFiles.Items.Cast<string>().ToList();
но я получил эту ошибку:
Невозможно передать объект типа "System.Windows.Forms.ListViewItem" для ввода "System.String".
Ответы
Ответ 1
A 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();
Ответ 2
Метод Cast
будет по существу пытаться выполнить box/unbox, поэтому он будет терпеть неудачу, если элементы в списке уже не являются строками. Вместо этого попробуйте:
List<string> list = lvFiles.Items.Cast<ListViewItem>()
.Select(x => x.ToString()).ToList();
Или это
List<string> list = lvFiles.Items.Cast<ListViewItem>()
.Select(x => x.Text).ToList();
Ответ 3
Попробуйте что-то вроде этого
List<string> list = lvFiles.Items.Cast<ListViewItem>().Select(x=> x.ToString()).ToList();
Ответ 4
Попробуйте использовать метод 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);