2013-09-05 3 views
4

У меня есть метод, который возвращает List<string>, и я пытаюсь передать его методу AddRange(Object[])ComboBox.Список <string> to object []

Как я могу преобразовать List<string> в Object[]?

Я полагаю, что мог бы сделать foreach, но я бы предпочел использовать AddRange(Object[]), поскольку он быстрее (и производит меньше кода).

EDIT

Следующие работает отлично:

var list = new List<string>(); 
object[] array = list.ToArray<object>(); 
comboBox.AddRange(array); 

Однако на другой ноте, любая причина, почему я хотел бы выполнить выше вместо:

var list = new list<string>(); 
comboBox.AddRange(list.ToArray<object>()); 

ответ

11

Вы можете сделать это легко с помощью ToArray шаблонного метода:

var list = new List<string>(); 
object[] array = list.ToArray<object>(); 

Вы дон 't даже нужен Cast<object> , потому что ToArray принимает IEnumerable<T>, который является ковариантным по параметру общего типа.

+2

Массивы также являются ковариантными, поэтому вам даже не нужно делать 'list.ToArray ()', вы можете просто «list.ToArray()». –

+2

@MagnusGrindalBakken: Ну, это зависит от того, захочет ли OP захотеть сохранить не-строки в том же массиве позже. –

+0

@MagnusGrindalBakken Вы можете воспользоваться этим при вызове методов, таких как 'AddRange', но в противном случае, когда вы захотите использовать этот массив позже, я бы предложил использовать' ToArray 'вместо ковариации массива. – MarcinJuraszek

4

Вы может использовать что-то вроде того, чтобы быть явным об изменении типа:

object[] array = yourList.Cast<Object>().ToArray(); 

или просто подразумеваться:

yourcomboBox.AddRange(yourList.ToArray()); 
1
List<string> items = ...; 
cb.Items.AddRange(items.ToArray()); 
+0

Единственное решение здесь, которое не забывает, что массивы ковариантны уже в C#. –

+1

Это приводит к тому, что преобразование ковариантного массива из строки [] в объект [] может вызвать исключение во время выполнения при операции записи', поэтому я отклонился от него. – cogumel0

1

Может быть, это работает:

object[] myArray = myList.OfType<object>().ToArray(); 
0

Массивы ссылок ковариантны (slowly covariant) с массивами своих базовых классов (и с массивами их интерфейсов, а также с другими массивами), так что вы можете:

AddRange(mystrings.ToArray()); 

mystrings.ToArray() является string[], то есть ковариантны с object[] (так что AddRange примет его)

От 12.5 Array covariance

Для любых двух ссылочных типов A и B, если между A и B существует неявное ссылочное преобразование (раздел 6.1.4) или явное ссылочное преобразование (раздел 6.2.3), то такое же ссылочное преобразование также существует из типа массива A [R] для типа массива B [R]

0

Если это об удобстве:

public static class ObjectCollectionExtension 
{ 
    public static void AddAll<T>(this ComboBox.ObjectCollection self, IEnumerable<T> es) 
    { 
     foreach (var e in es) 
      self.Add(e); 
    } 
} 

Might получили дженериков неправильно, я немного ржавый.

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