如何将通用列表转换为对象数组 - >宾语[]

时间:2013-10-14 12:46:06

标签: c# linq

我用Google搜索并罚款此链接,但仍无法正常工作 Convert List<T> to object[]

我想将int列表转换为object数组。为什么?因为我想在Combbox中将列表添加为对象数组,这就是参数。

问题是它在Combobox中只添加了“one item”Object [] Array,而“tempList”包含4个int类型的项目。

我想在object [](对象数组)中添加4个项目,现在它添加为1个项目,并在调试器中显示Object []数组。

当我查看调试器并输入:

客户 - 它显示对象[1]和我输入

customers [0]它显示了对象[4],所以实际上添加了4个项目,但我怎样才能获得这些值。???

List<int> tempList= new CustomersRepository().GetAll().Select(a => a.Numero).ToList();
object[] customers = new object[] { tempList.Cast<object>().ToArray() };
ComboBox.Items.AddRange(customers);

5 个答案:

答案 0 :(得分:4)

您正在做的是当前正在创建阵列数组。因此,访问这些值将通过以下方式完成:

customers[0][1]

我怀疑你实际上正在寻找以下内容:

object[] customers = tempList.Cast<object>().ToArray();

这将创建一个名为customers的对象项数组。

答案 1 :(得分:3)

List<int> tempList= ...;
object[] customers  = tempList.Cast<Object>().ToArray();

答案 2 :(得分:2)

以这种方式尝试:

var customers = tempList.Cast<object>().ToArray();

或者使用明确的演员:

var customers = tempList.Select(t => (object)t).ToArray();

由于您使用初始化程序构建列表,因此出现了问题。

此语法:

var arr = new object[] { "a", "b" }

用两个字符串初始化一个数组。

所以当你写作时

var arr = new object[] { tempList.Cast<object>().ToArray() }

你构建一个数组的数组!

答案 3 :(得分:2)

object[] customers = new object[] { tempList.Cast<object>().ToArray() };

在此创建一个object[],其中包含一项:另一个 object[],其中包含tempList项。


只需使用object[] customers = tempList.Cast<Object>().ToArray()而不是将其包装在其他 object[]中。

答案 4 :(得分:0)

如果您想要进一步处理并稍后获取数组,则不需要ToList()。 这样的事情应该更有效率:

var temp = new CustomersRepository().GetAll().Select(a => a.Numero);
object[] customers = temp.Cast<object>().ToArray();
ComboBox.Items.AddRange(customers);

如果temp是引用类型的集合,则根本不需要进行转换,而是依赖于数组协方差。这应该有效:

var temp = new CustomersRepository().GetAll().Select(a => a.StringProperty);
object[] customers = temp.ToArray(); //no need of Cast<object>
ComboBox.Items.AddRange(customers);

但是,自array covariance doesnt support for value types以来,这不适用于您的情况。


另一个想法是让扩展方法AddRange接受任何IEnumerable,而不只是object[]。类似的东西:

public static void AddRange(this IList list, IEnumerable lstObject)
{
    foreach (T t in lstObject)
        list.Add(t);
}

现在你可以致电:

var customers = new CustomersRepository().GetAll().Select(a => a.Numero);
ComboBox.Items.AddRange(customers);

最重要的是添加Customer s,并将DisplayMemberValueMember属性设置为您的媒体资源,例如Numero。由于您在组合框中拥有整个对象,因此您可以获得更多信息。类似的东西:

ComboBox.DisplayMember = "Numero";
var customers = new CustomersRepository().GetAll();
ComboBox.Items.AddRange(customers); // using the above extension method