我有类似的东西
var a = new object[2]
{
new double[1] { 0.5 },
new double[1] { 0.5 }
}
我想将它转换为double[][]
。
我尝试过(double[][])a
和a.Cast<double[][]>()
,但都不起作用。
我有类似的东西
var a = new object[2]
{
new double[1] { 0.5 },
new double[1] { 0.5 }
}
我想将它转换为double[][]
。
我尝试过(double[][])a
和a.Cast<double[][]>()
,但都不起作用。
你尝试使用 a.Cast<double[][]>()
是 几乎 正确的。你可以使用以下代码:
double[][] b = a.Cast<double[]>().ToArray();
解释:
double[]
,但它们被静态地定义为object
。要更改列表元素的静态类型,可以使用LINQ的Cast<T>
。Cast<T>
将元素的类型作为T
,而不是结果列表的类型(这就是为什么尝试使用Cast<double[][]>
失败的原因)。Cast<double[]>
会产生一个IEnumerable<double[]>
。IEnumerable<double[]>
转换为double[]
数组(即double[][]
),可以使用LINQ的ToArray()
。请注意,这将
创建一个新的外部数组(即,object.ReferenceEquals(a, b)
为false),但是新的外部数组将引用相同的内部数组(即,object.ReferenceEquals(a[0], b[0])
为true)。您可以使用LINQ double[][] b = a.Select(x => (double[])x).ToArray();
另一种方法是使用Array.ConvertAll
方法,它接受一个回调函数,该函数对给定数组中的每个元素进行调用。
double[][] b = Array.ConvertAll(a, x => (double[])x);
a[0] = "Hello";
,这样做是完全有效的。 - Jon Skeet