Выделение коллекции предметов из списка в общий список
Я хочу найти лучший способ заполнения общего списка из checklistbox в С#.
Я могу сделать следующее достаточно легко:
List<string> selectedFields = new List<string>();
foreach (object a in chkDFMFieldList.CheckedItems) {
selectedFields.Add(a.ToString());
}
В моем списке должен быть метод elagent, который бы включил коллекцию CheckedItems.
Ответы
Ответ 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.