Преобразование коллекции предметов из списка в общий список - PullRequest
35 голосов
/ 23 января 2009

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

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

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

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

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

Ответы [ 3 ]

52 голосов
/ 23 января 2009

Попробуйте это (используя 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();
12 голосов
/ 09 июля 2012

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

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 медленнее. Конечно, в реальных сценариях это не имеет значения. Я предпочитаю третий метод (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 мс

1 голос
/ 23 января 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...