如何将泛型列表转换为对象数组 -> 对象[]

本文关键字:对象 数组 泛型 列表 转换 | 更新日期: 2023-09-27 18:35:19

我用谷歌搜索并罚款了这个链接,但仍然不起作用将列表转换为对象[]

我想将 int 列表转换为对象数组。为什么?因为我想将列表添加为 Combbox 中的对象数组,所以它是参数。

问题是它在Combobox中只添加了"一个项目"Object[]数组,而"tempList"包含4个int类型的项目。

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

当我查看调试器并键入:

客户 - 它显示对象[1]以及当我输入时

客户[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);

如何将泛型列表转换为对象数组 -> 对象[]

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

customers[0][1]

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

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

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

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

在这里,您可以创建一个包含一项的object[]另一个包含tempList项的object[]


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

试试这个:

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() }

你构建一个数组的数组!

如果您无论如何都想进一步处理并在以后获取数组,则不需要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);

但这在您的情况下不起作用,因为数组协方差不支持值类型。


另一个想法是有一个接受任何IEnumerable的扩展方法AddRange,而不仅仅是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,并将DisplayMemberValueMember属性设置为您的属性,例如 Numero .由于您在组合框中拥有整个对象,因此您可以获得更多信息。像这样:

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