Как заполнить список <String>значениями, уже присутствующими в элементе управления Listbox в Winforms - PullRequest
3 голосов
/ 08 декабря 2011

У меня есть список, который имеет пару значений и уже заполнен (из пользовательского ввода).Позже в моей программе я хочу взять эти значения из списка и заполнить их коллекцией списков.

Одним из подходов, конечно, является итерация по элементам списка и заполнение коллекции Списка один за другим (в цикле) с использованием метода Add.

Но есть ли более эффективный способ сделать это за один раз, означающий, что все элементы списка будут скопированы в коллекцию списка.

Я также посмотрел на метод AddRange, но, похоже, это не помогло.

Есть предложения по этому поводу?

Ответы [ 6 ]

4 голосов
/ 08 декабря 2011

Это не обязательно более эффективно (с точки зрения скорости / памяти), но вы можете сохранить набор текста через LINQ:

List<string> items = listBox.Items.Cast<object>()
                            .Select(item => item.ToString()).ToList();
2 голосов
/ 08 декабря 2011

Если это должно быть List<string>, я думаю, вам придется перечислять элементы и добавлять их в список (поскольку вы обеспокоены эффективностью LINQ).Если вы можете использовать string[], вы можете использовать метод CopyTo:

string[] destination = new string[listBox1.Items.Count];
listBox1.Items.CopyTo(destination, 0);
1 голос
/ 09 декабря 2011

Кажется, что это дубликат: Самый краткий способ конвертировать ListBox.items в общий список

Если вы копируете из списка, что заполняет этот список?Возможно, это будет лучшим вариантом, чем брать 200 тыс. Предметов и перемещать их.если вы берете все элементы в списке, заполните список одновременно.

На этой заметке ... правда?200к предметов в списке?Это действительно кажется немного чрезмерным в реальном приложении.

Циклы Foreach (...) очень дороги - даже при компиляции в IL: http://diditwith.net/2006/10/05/PerformanceOfForeachVsListForEach.aspx

Если вы не можете работать с LINQ (вы используете <= VS 2005), этоэто один из самых простых способов сделать это. </p>

    string[] items = new string[listBox1.Items.Count];
    listBox1.Items.CopyTo(items, 0);
    List<string> list = new List<string>(items);
1 голос
/ 08 декабря 2011

Класс ItemCollection реализует IList, вам необходимо преобразовать элементы в коллекции в String, поскольку это не универсальная коллекция, но у вас уже есть "Список коллекции" элементов.

Если вам действительно нужна копия предметов в коллекции, то нет, более эффективного способа не будет. Существует множество способов реализации синтетического сахара, чтобы код был более кратким, но в конечном итоге они будут all выполнять итерации по элементам и создавать копии для добавления в новую коллекцию.

1 голос
/ 08 декабря 2011

Нет, нет более эффективного способа.

Если бы что-то существовало, оно просто абстрагировало бы то, что вы будете делать в любом случае, с помощью метода расширения или других средств и могло бы сделать ваш код менее читабельным.

Метод CopyToсуществует через ObjectCollection в свойстве Items, которое затем можно связать с List<T>.

        ListBox lb = new ListBox();
        object[] items = new object[lb.Items.Count];
        lb.Items.CopyTo(items, 0);
0 голосов
/ 09 июля 2012

@ Аарон Макивер, по моему мнению, ваш собственный метод немного быстрее.См. эту ссылку , чтобы узнать о тестировании производительности, которое я провел.

...