Список элементов 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);