7

我有一个返回 a 的方法,List<string>我试图将它传递给AddRange(Object[])a 的方法ComboBox

我怎样才能将我的转换List<string>Object[]

我想我可以做 aforeach但我宁愿使用它,AddRange(Object[])因为它更快(并且产生的代码更少)。

编辑

以下工作正常:

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

但是,另一方面,我想执行上述操作而不是:

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

6 回答 6

14

您可以使用ToArray通用方法来做到这一点:

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

您甚至不需要Cast<object>,因为ToArrayIEnumerable<T>在泛型类型参数上是协变的。

于 2013-09-05T10:19:09.607 回答
4

你可以使用类似的东西来明确类型的变化:

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

或者只是隐含的:

yourcomboBox.AddRange(yourList.ToArray());
于 2013-09-05T10:17:57.227 回答
1
List<string> items = ...;
cb.Items.AddRange(items.ToArray());
于 2013-09-05T10:18:57.827 回答
1

也许这有效:

object[] myArray = myList.OfType<object>().ToArray();
于 2013-09-05T10:18:58.553 回答
0

引用数组与它们的基类数组(以及它们的接口数组和其他数组)是协变的(缓慢协变的),因此您可以:

AddRange(mystrings.ToArray());

mystrings.ToArray()是 a string[],它与 an 协变object[](以便AddRange将接受它)

来自12.5 数组协方差

对于任意两种引用类型 A 和 B,如果从 A 到 B 存在隐式引用转换(第 6.1.4 节)或显式引用转换(第 6.2.3 节),则从数组类型 A[ 也存在相同的引用转换R] 到数组类型 B[R]

于 2013-09-05T10:22:07.607 回答
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);
    }
}

可能弄错了泛型,我有点生疏了。

于 2013-09-05T10:28:05.770 回答