2016-08-31 2 views
1

Я хотел бы заполнить список со списком установленных принтеров в VB.net.Преобразование или преобразование из StringCollection в ObjectCollection?

Это работает:

Dim printerList As System.Drawing.Printing.PrinterSettings.StringCollection 
printerList = System.Drawing.Printing.PrinterSettings.InstalledPrinters 

For Each printerName In printerList 
    ListBox1.Items.Add(printerName) 
Next 

Это не работает:

ListBox1.Items.AddRange(printerList) 

... из-за следующей ошибки типа преобразования:

Public Sub AddRange (value As System.Windows.Forms.ListBox.ObjectCollection)': Value of type 'System.Drawing.Printing.PrinterSettings.StringCollection' cannot be converted to 'System.Windows.Forms.ListBox.ObjectCollection'.

Можно ли напрямую как показано на рисунке, добавьте один к другому для использования в AddRange()? Или цикл является единственным (или наиболее эффективным) способом?

+0

Поддерживает ли StringCollection 'ToList' или' AsEnumerable'? – user2864740

ответ

2

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

В этом случае метод AddRange принимает либо другой экземпляр ObjectCollection (не ваш случай), либо массив из Object s. Если вы хотите воспользоваться последним, вам необходимо преобразовать экземпляр StringCollection в массив из Object. Вот как это можно сделать:

ListBox1.Items.AddRange(printerList.Cast(Of Object)().ToArray()) 

То есть, я бы придерживаться текущей For Each цикла. Это очень читаемо и не создает промежуточный массив. Но я сомневаюсь, что любой выбор будет иметь большое значение, поэтому выберите своего фаворита.

+1

Спасибо. Я хотел узнать о процессе, командах и синтаксисе так же, как фактически, чтобы он работал (при условии, что это может быть сделано в одной строке кода вообще). И ты прав; цикл более читабельен, и он уже работает. – spinjector

Смежные вопросы