Подтвердить что ты не робот

Выделение коллекции предметов из списка в общий список

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

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

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

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

В моем списке должен быть метод elagent, который бы включил коллекцию CheckedItems.

4b9b3361

Ответ 1

Попробуйте это (используя 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();

Ответ 2

Это не совсем ответ на ваше требование, но вывешивает более общий ответ. Вы можете сделать это различными способами:

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) или

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

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

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

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

1) ~ 100 мс

2) ~ 150 мс

3) ~ 250 мс

4) ~ 260 мс

Ответ 3

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