我有一个List<object>
存储在数据库中。
每个列表对象都由一个object[]
组成,该整数由int值组成。
我可以保存,查看和检索数据。我可以在调试器中查看数据。但是我无法转换回int或数组。
foreach (object item in list)
{
if (item.GetType().IsArray)
{
var arr = item as int[];
foreach (var i in arr)
print(i);
}
}
在if语句中,item显示了调试器中的数据,如下图所示,但为false,但是如何将其强制转换回object []?
我也尝试过:
var newItem = item as object[];
编辑:这是初始化对象的方式。我从一个对象开始,因为如果在发送到数据库时尝试包装int []会出现转换错误。
var listValues = new List<object>();
var newArray = new object[10];
newArray[0] = (int)c.Tag;
newArray[1] = (int)c.FPos;
newArray[2] = (int)c.ToL;
listValues.Add(newArray);
答案 0 :(得分:2)
广播(通常)与转换不同。在大多数情况下,当您使用C#进行转换时,您会认为这些内容已经是您所说的,并且根本没有更改它们。像# our list of lists whom have the same first element and last item
lista = []
a = [[[1, 2, 3, 4, 5, 6, 7, 8, 9], [0.4, 3]], [[1, 2, 3, 4, 5, 6, 7, 8, 9], [1.8, 1]]]
for i in range(len(a)):
for y in range(len(a)):
# lets check if the first element in each array is the same.
if a[i[:1]] == a[y[:1]]:
# if we got here then the first elements must be the same so lets compare second item of the last elements
if a[i[-1]][1] == a[y[-1]][1]:
# if we got here then the 2nd item of the last elements must be the same.
lista.append(a[i] + a[y])
这样的值类型有一个例外,当您将它们与int
进行转换时,它们会被“装箱”和“取消装箱”。但是,该异常不会扩展为将object
转换为object[]
。
int[]
与int[]
是不同的东西,因此您不能只是将其投射。相反,您必须生成一个新数组(或Collection或IEnumerable或任何其他形式),该数组由所有拆箱为int的object[]
组成。一种方法是使用System.Linq命名空间中的object
扩展方法。
Cast<>()
或者,作为更完整的示例:
int[] arr = ((object[])item).Cast<int>().ToArray();
根据您更新的问题,很可能真正解决问题的方法将超出原始问题的范围。我不知道您使用什么机制来存储它并从数据库中检索它,但是如果您使用的是诸如Entity Framework之类的东西,则可能需要更改模型,以便对其值进行强类型化。实际上,从对象中删除属性并将它们作为数组放入数据库的方式是一种很大的代码味道:很可能应该将数据模型展平为具有命名属性的类型。
但是要回答这个问题中最简单,最基本的部分:在转换对象之前,必须将对象转换为它们实际为 的类型。如果您有List<object[]> list = new List<object[]> { new object[] { 1, 2 }, new object[] { 3, 4 } };
foreach (object[] item in list)
{
if (item.GetType().IsArray)
{
var arr = item.Cast<int>();
foreach (var i in arr)
{
Console.WriteLine(i);
}
}
}
,请使用它:
List<object>
答案 1 :(得分:1)
从数据库中选择项目后,您没有得到真实的array
。相反,您会得到一个List
,它不能简单地转换为数组类型。因此item.GetType().IsArray
也是错误的,因为它是List
请尝试以下操作:
foreach (object item in list)
{
IEnumerable<object> itemAsObjectEnumerable = (IEnumerable<object>)item;
IEnumerable<int> itemAsIntEnumerable = itemAsObjectEnumerable.Cast<int>();
foreach (var i in itemAsIntEnumerable)
{
print(i);
}
}