Преобразование коллекции элементов из списка в общий список

Я хочу найти лучший способ заполнения общего списка из проверенного списка в С#.

Я могу сделать следующее достаточно легко:

List<string> selectedFields = new List<string>();

foreach (object a in chkDFMFieldList.CheckedItems) {
         selectedFields.Add(a.ToString());
         } 

Должен быть более гибкий метод для приведения коллекции CheckedItems к моему списку.


person Alex    schedule 23.01.2009    source источник


Ответы (3)


Попробуйте это (используя System.Linq):

OfType() — это метод расширения, поэтому вам нужно использовать System.Linq

List<string> selectedFields = new List<string>();
selectedFields.AddRange(chkDFMFieldList.CheckedItems.OfType<string>());

Или просто сделайте это в одной строке:

List<string> selectedFields = chkDFMFieldList.CheckedItems.OfType<string>().ToList();
person Matt Hamilton    schedule 23.01.2009
comment
Есть ли способ узнать тип ItemCollection? Таким образом, метод работает с любым ItemCollection, не зная его типа. - person Carlos Blanco; 15.02.2013
comment
OfType‹string›() -- Сегодня я узнал кое-что новое! Спасибо, Мэтт! - person Joe Gayetty; 19.02.2016

Это не совсем ответ на ваше требование, а публикация более общего ответа. Вы можете сделать это разными способами:

1)

T[] items = new T[lb.Items.Count];
lb.Items.CopyTo(items, 0);
var lst = new List<T>(items);

2) зацикливание и добавление с использованием foreach, как вы упомянули.

3) с помощью Linq

var lst = lb.Items.Cast<T>().ToList();

4) or

var lst = lb.Items.OfType<T>().ToList();

Когда я провел некоторое тестирование производительности, как показано ниже, я обнаружил, что копирование в метод массива является самым быстрым, а методы Linq - медленнее. Конечно, в реальных сценариях это не имело бы значения. Я предпочитаю третий метод (Linq) для удобочитаемости.

DateTime d = DateTime.Now;
for (int i = 0; i < 10000; i++)
{
    Action();
}
MessageBox.Show((DateTime.Now - d).TotalMilliseconds.ToString());

Для итерации 10000 раз запускайте несколько раз с примерно 300 элементами в списке,

1) ~100ms

2) ~150ms

3) ~250ms

4) ~260ms

person nawfal    schedule 09.07.2012
comment
Копаясь в обширном архиве StackOverflow... @nawfal, преимущество решения 4) заключается в том, что если у вас есть разные элементы в вашей коллекции (например, меню с MenuItems и Separators), OfType<T> просто выберет только <T> элементы из коллекции, а 3) выдаст InvalidCastException. - person Mike; 03.07.2015

Если у вас нет доступа к LINQ, более элегантного способа не существует, поскольку вы выполняете вторую операцию над элементами списка (вызов ToString()) в дополнение к заполнению коллекции selectedFields.

person Ken Browning    schedule 23.01.2009