C# 列表<;字符串>;反对[]
我有一个方法返回一个C# 列表<;字符串>;反对[],c#,C#,我有一个方法返回一个列表,我试图将其传递给组合框的AddRange(Object[])方法 如何将我的列表转换为对象[] 我想我可以使用foreach,但我更愿意使用AddRange(Object[]),因为它更快(并且生成的代码更少) 编辑 以下工作很好: var list = new List<string>(); object[] array = list.ToArray<object>(); comboBox.AddRange(array); var list=
列表
,我试图将其传递给组合框的AddRange(Object[])
方法
如何将我的列表
转换为对象[]
我想我可以使用foreach
,但我更愿意使用AddRange(Object[])
,因为它更快(并且生成的代码更少)
编辑
以下工作很好:
var list = new List<string>();
object[] array = list.ToArray<object>();
comboBox.AddRange(array);
var list=newlist();
object[]数组=list.ToArray();
comboBox.AddRange(数组);
但是,另一方面,我想执行上述操作而不是:
var list = new list<string>();
comboBox.AddRange(list.ToArray<object>());
var list=newlist();
comboBox.AddRange(list.ToArray());
您可以使用类似的方式来明确说明类型的更改:
object[] array = yourList.Cast<Object>().ToArray();
列表项=。。。;
cb.Items.AddRange(Items.ToArray());
也许这样可以:
object[] myArray = myList.OfType<object>().ToArray();
object[]myArray=myList.OfType().ToArray();
您可以使用ToArray
通用方法:
var list = new List<string>();
object[] array = list.ToArray<object>();
var list=newlist();
object[]数组=list.ToArray();
您甚至不需要使用Cast
,因为ToArray
接受IEnumerable
,这在泛型类型参数上是协变的。引用数组与它们的基类数组(以及它们的接口数组和其他数组)是协变的(),因此您可以:
AddRange(mystrings.ToArray());
mystrings.ToArray()
是一个字符串[]
,它与对象[]
是协变的(因此AddRange
将接受它)
从
对于任意两种引用类型A和B,如果存在从A到B的隐式引用转换(第6.1.4节)或显式引用转换(第6.2.3节),则从阵列类型A[R]到阵列类型B[R]也存在相同的引用转换
如果是为了方便:
public static class ObjectCollectionExtension
{
public static void AddAll<T>(this ComboBox.ObjectCollection self, IEnumerable<T> es)
{
foreach (var e in es)
self.Add(e);
}
}
公共静态类ObjectCollectionExtension
{
公共静态void AddAll(此ComboBox.ObjectCollection自身,IEnumerable es)
{
foreach(es中的变量e)
添加(e);
}
}
可能是泛型弄错了,我有点生疏。这里唯一的解决方案是不要忘记数组在C#中已经是协变的。这会产生从字符串[]到对象[]的协变数组转换会导致写操作的运行时异常
,这就是我偏离它的原因。数组也是协变的,因此,您甚至不需要执行list.ToArray()
,只需执行list.ToArray()
@MagnusGrindalBakken:这取决于OP以后是否希望在同一数组中存储非字符串。@MagnusGrindalBakken在调用AddRange
等方法时,您可以利用这一点,但是,如果您以后想使用该数组,我建议您使用ToArray
而不是数组协方差。@MagnusGrindalBakken刚刚执行list.ToArray()
会生成一条警告,说明从字符串[]到对象[]的协变数组转换可能导致写入操作时出现运行时异常
@cogumel0您引用的警告与Jon Skeet在上面几句评论中指出的相同。
AddRange(mystrings.ToArray());
public static class ObjectCollectionExtension
{
public static void AddAll<T>(this ComboBox.ObjectCollection self, IEnumerable<T> es)
{
foreach (var e in es)
self.Add(e);
}
}